数据结构实验报告-实验一顺序表、单链表基本操作的实现
实验⼀ 顺序表、单链表基本操作的实现
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 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 printf(\"%d\",L->list[i]); printf(\"\\n\");} int FindList(LIST *L,int item)/*查找线性元素,返回值>=0为元素的位置,返回-1为没找到*/{ int i; for(i=0;i int DeleteList1(LIST *L,int item)/*删除 指定元素值得线性表记录,返回值为>=0为删除成功*/{ int i,n; for(i=0;i for(n=i;n int DeleteList2(LIST *L,int rc)/*删除指定位置的线性表记录*/{ int i,n; if(rc<0||rc>=L->size) return -1; for(n=rc;n LIST LL; int i,r; printf(\"list addr=%p\size=%d\Maxsize=%d\\n\",LL.list,LL.size,LL.Maxsize); InitList(&LL,10); printf(\"list addr=%p\size=%d\Maxsize=%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 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 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 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; } }} 因篇幅问题不能全部显示,请点此查看更多更全内容