實驗一 順序表、單鏈表基本操作的實現
l 實驗目的
1、順序表
(1)掌握線性表的基本運算。
(2)掌握順序存儲的概念,學會對順序存儲數據結構進行操作。
(3)加深對順序存儲數據結構的理解,逐步培養解決實際問題的編程能力。
l 實驗內容
1、 順序表
1、編寫線性表基本操作函數:
(1)InitList(LIST *L,int ms)初始化線性表;
(2)InsertList(LIST *L,int item,int rc)向線性表的指定位置插入元素;
(3)DeleteList1(LIST *L,int item)刪除指定元素值的線性表記錄;
(4)DeleteList2(LIST *L,int rc)刪除指定位置的線性表記錄;
(5)FindList(LIST *L,int item)查找線性表的元素;
(6)OutputList(LIST *L)輸出線性表元素;
2、調用上述函數實現下列操作:
(1)初始化線性表;
(2)調用插入函數建立一個線性表;
(3)在線性表中尋找指定的元素;
(4)在線性表中刪除指定值的元素;
(5)在線性表中刪除指定位置的元素;
(6)遍歷並輸出線性表;
l 實驗結果
1、順序表
(1)流程圖
(2)程序運行主要結果截圖
(3)程序源代碼
#include<stdio.h> #include<stdlib.h> #include<malloc.h> struct LinearList/*定義線性表結構*/ { int *list; /*存線性表元素*/ int size; /*存線性表長度*/ int Maxsize; /*存list數組元素的個數*/ }; typedef struct LinearList LIST; void InitList(LIST *L,int ms)/*初始化線性表*/ { if((L->list=(int*)malloc(ms*sizeof(int)))==NULL) { printf("內存申請錯誤"); exit(1); } L->size=0; L->Maxsize=ms; } int InsertList(LIST *L,int item,int rc)/*item記錄值;rc插入位置*/ { int i; if(L->size==L->Maxsize)/*線性表已滿*/ return -1; if(rc<0) rc=0; if(rc>L->size) rc=L->size; for(i=L->size-1;i>=rc;i--)/*將線性表元素后移*/ L->list[i+=1]=L->list[i]; L->list[rc]=item; L->size++; return 0; } void OutputList(LIST *L)/*輸出線性表元素*/ { int i; for(i=0;i<L->size;i++) printf("%d",L->list[i]); printf("\n"); } int FindList(LIST *L,int item)/*查找線性元素,返回值>=0為元素的位置,返回-1為沒找到*/ { int i; for(i=0;i<L->size;i++) if(item==L->list[i]) return i; return -1; } int DeleteList1(LIST *L,int item)/*刪除 指定元素值得線性表記錄,返回值為>=0為刪除成功*/ { int i,n; for(i=0;i<L->size;i++) if(item==L->list[i]) break; if(i<L->size) { for(n=i;n<L->size-1;n++) L->list[n]=L->list[n+1]; L->size--; return i; } return -1; } int DeleteList2(LIST *L,int rc)/*刪除指定位置的線性表記錄*/ { int i,n; if(rc<0||rc>=L->size) return -1; for(n=rc;n<L->size-1;n++) L->list[n]=L->list[n+1]; L->size--; return 0; } int main() { LIST LL; int i,r; printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.size,LL.Maxsize); InitList(&LL,10); printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.list,LL.Maxsize); while(1) { printf("請輸入元素值,輸入0結束插入操作:"); fflush(stdin);/*清空標准輸入緩沖區*/ scanf("%d",&i); if(i==0) break; printf("請輸入插入位置:"); scanf("%d",&r); InsertList(&LL,i,r-1); printf("線性表為:"); OutputList(&LL); } while(1) { printf("請輸入查找元素值,輸入0結束查找操作:"); fflush(stdin);/*清空標准輸入緩沖區*/ scanf("%d ",&i); if(i==0) break; r=FindList(&LL,i); if(r<0) printf("沒有找到\n"); else printf("有符合條件的元素,位置為:%d\n",r+1); } while(1) { printf("請輸入刪除元素值,輸入0結束查找操作:"); fflush(stdin);/*清楚標准緩存區*/ scanf("%d",&i); if(i==0) break; r=DeleteList1(&LL,i); if(i<0) printf("沒有找到\n"); else{ printf("有符合條件的元素,位置為:%d\n線性表為:",r+1); OutputList(&LL); } } while(1) { printf("請輸入刪除元素位置,輸入0結束查找操作:"); fflush(stdin);/*清楚標准輸入緩沖區*/ scanf("%d",&r); if(r==0) break; i=DeleteList2(&LL,r-1); if(i<0) printf("位置越界\n"); else { printf("線性表為:"); OutputList(&LL); } } }
鏈表基本操作
l 實驗目的
2、鏈表
(1)掌握鏈表的概念,學會對鏈表進行操作。
(2)加深對鏈式存儲數據結構的理解,逐步培養解決實際問題的編程能力。
l 實驗內容
1、編寫鏈表基本操作函數:
(1)InitList(LIST *L,int ms)初始化鏈表;
(2)InsertList1(LIST *L,int item,int rc)向鏈表的指定位置插入元素;
(3)InsertList2(LIST *L,int item,int rc)向有序鏈表的指定位置插入元素;
(4)DeleteList(LIST *L,int item)刪除指定元素值的鏈表記錄;
(5)FindList(LIST *L,int item)查找鏈表中的元素;
(6)OutputList(LIST *L)輸出鏈表中的元素;
2、調用上述函數實現下列操作:
(1)初始化鏈表;
(2)調用插入函數建立一個鏈表;
(3)在鏈表中尋找指定的元素;
(4)在鏈表中刪除指定值的元素;
(5)遍歷並輸出鏈表;
l 實驗結果
(1)、流程圖:
(2)程序運行主要結果截圖:
(3)程序源代碼:
#include<stdio.h> #include<malloc.h> typedef struct list { int data; struct list *next; }LIST; void initlist(LIST **p) { *p=NULL; } void insertlist1(LIST **p,int item,int rc) { int i; LIST *u,*q,*r; u=(LIST*)malloc(sizeof(LIST)); u->data=item; for(i=1,r=*p;i<rc&&r!=NULL;i++) { q=r; r=r->next; } if(r==*p) *p=u; else q->next=u; u->next=r; } void insertlist2(LIST **p,int item) { LIST *u,*q,*r; u=(LIST*)malloc(sizeof(LIST)); u->data=item; for(r=*p;r!=NULL&&r->data<item; q=r,r=r->next) if(r==*p) *p=u; else q->next=u; u->next=r; } int deletelist(LIST **p,int item) { LIST *q,*r; q=*p;r=q; if(q==NULL) return 1; if(q->data==item) { *p=q->next; free(r); return 0; } for( ;q->data!=item&&q->next!=NULL;r=q,q=q->next) if(q->data==item) { r->next=q->next; free(q); return 0; } return 1; } int findlist(LIST *p,int item) { int i; for(i=1;p->data!=item&&p!=NULL;p=p->next,i++) return(p==NULL)?-1:i; } void outputlist(LIST *p) { while(p!=NULL) { printf("%4d",p->data); p=p->next; } printf("\n"); } void freelist(LIST **p) { LIST *q,*r; for(q=*p;q!=NULL;) { r=q; q=q->next; free(r); } *p=NULL; } int main() { LIST *p; int op,i,rc; initlist(&p); while(1) { printf("---------------\n"); printf("- 1:指定位置追加\n"); printf("- 2:升序追加\n"); printf("- 3:查找結點\n"); printf("- 4:刪除結點\n"); printf("- 5:輸出鏈表\n"); printf("- 6:清空鏈表\n"); printf("- 0:退出\n"); printf("--------------\n"); printf("請輸入0~6 進行操作:"); fflush(stdin); scanf("%d",&op); switch(op) { case 0: return -1; case 1: printf("請輸入新增結點的鍵值和位置:"); scanf("%d%d",&i,&rc); insertlist1(&p,i,rc); break; case 2: printf("請輸入新增結點的鍵值:"); scanf("%d",&i); insertlist2(&p,i); break; case 3: printf("請輸入要查找結點的鍵值:"); scanf("%d",&i); rc=findlist(p,i); if(rc>0) printf(" 位置位 %d\n",rc); else printf("沒有找到\n"); break; case 4: printf("請輸入要刪除的結點的鍵值:"); scanf("%d",&i); rc=deletelist(&p,i); if(rc==0) printf("刪除成功!\n",rc); else printf("沒找到!\n"); break; case 5: printf("\n 鏈表內容為:\n"); outputlist(p); break; case 6: freelist(&p); break; } } }