单链表的基本操作.docx
单链表的基本操作实验一线性表的基本操作及其应用一、实验目的1、帮助读者复习C语言程序设计中的知识。、熟悉线性表的逻辑结构。23、熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉链表的操作为侧重点。二、实验内容本次实验提供3个题目,每个题目都标有难度系数,*越多难度越大,学生可以根据自己的情况任选一个题目一:单链表的基本操作(*)问题描述实现带头结点的单链表的建立、求长度,取元素、修改元素、插入、删除等单链表的基本操作。基本要求(1)依次从键盘读入数据,建立带头结点的单链表;(2)输出单链表中的数据元素(3)求单链表的长度;(4)根据指定条件能够取元素和修改元素;(5)实现在指定位置插入和删除元素的功能。【程序调试】ttinc1ude<ma11oc.h>*ma11oc()等*/inc1ude<stdio.h>*scanf(),NU11*/ttinc1ude<std1ib.h>*free()*/ttinc1ude<conio.h>/*getch()*/*函数结果状态代码*/#defineOK1defineERROROtypedefintStatus;typedefintE1emType;typedefstruct1Node(E1emTypedata;struct1Node*next;1Node,*1ink1ist;voidCreate1ist(1ink1ist*1,intn)*算法2.11*/*逆位序(插在表头)输入n个元素的值,建立带表头结构的单链线性表1*/inti;1ink1istp;*1=(1ink1ist)ma1Ioc(sizeof(struct1Node);(*1)->next=NU11;/*先建立一个带头结点的单链表*/Printf(请输入%d个数据n”,n);for(i=n;i>0;-i)(p=(1ink1ist)ma1Ioc(sizeof(struct1Node);/*生成新结点*/SCanf&p->data);/*输入元素值*/p->next=(*1)->next;/*插入到表头*/(*1)->next=p;voidCreate1ist2(1ink1ist*1,intm)*正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表1*/inti;1ink1istp,q;*1=(1ink1ist)ma11oc(sizeof(struct1Node);/*生成头结点*/(*1)->next=NU11;q=*1;Printf(请输入%d个数据n,m);for(i=1;i<=m;i+)p=(1ink1ist)ma11oc(sizeof(struct1Node);scanf&p->data);q->next=p;q=q->next;p->next=NU11;voidPrint1ink1ist(1ink1ist1)(1Node*p;p=1->next;whi1e(p)printf(z/%dz,p->data);if(p->next)printf(,z>);p=p->next;)Printf(n");)Status1istinsert(1ink1ist1,inti,E1emTypee)*算法2.9。不改变1*在带头结点的单链线性表1中第i个位置之前插入元素e*/intj=0;1ink1istp=1,s;whi1e(pUj<i-1)/*寻找第iT个结点*/(p=p->next;J+;)if(!pIj>i-1)*i小于1或者大于表长*/returnERROR;s=(1ink1ist)ma1Ioc(sizeof(struct1Node);/*生成新结点*/s->data=e;/*插入1中*/s->next=p->next;p->next=s;returnOK;Status1istDe1ete(1ink1ist1,inti,E1emType*e)*算法2.10。不改变1*/*在带头结点的单链线性表1中,删除第i个元素,并由e返回其值*/intj=0;1ink1istp=1,q;whi1e(p->next&&j<i-1)*寻找第i个结点,并令P指向其前岖*/(p=p->next;j+;if(!p->nextj>i-1)/*删除位置不合理*/returnERROR;q=p->next;/*删除并释放结点*/p->next=q->next;*e=q->data;free(q);return0K;)int1ist1ength(1ink1ist*1)求链表长度(1Node*p;链表的单个元素指针,而不能用链表intj=0;P=1;将其指向链表的第一个元素whiIe(p->next!=NU11)+j;p=p->next;returnj;)intGetE1em(1ink1ist1,inti)(intj,e;1ink1istp=NU11;if(i<1i>1ist1ength(1)(Printf(输入的位置不合法n");return;)p=1->next;J=1;whi1e(j<i)p-p->next;j+;e=p->data;printf(第位的数据元素为%dn,i,e);voidmain()inti,n,m,v,z;1ink1ist1a,1b;E1emTypee1,e2;Printf(头插法逆位序建表n");Printf(请输入n值(即是链表长度):);SCanf("%d",&n);Create1ist(&1a,n);/*逆位序输入n个元素的值*/PrintfC1a=);/*输出链表1a的内容*/Print1ink1ist(1a);printf(n);Printf("按尾插法正序建表:n);Printf(请输入m值(即是链表长度):);scanf(,%d,z,&m);Create1ist2(&1b,m);/*逆位序输入n个元素的值*/PrintfC1b=9;/*输出链表1b的内容*/Print1ink1ist(1b);printf(n");Printf(输入在第一个链表插入的位置i=);scanf("%d",&i);printf(z,n,z);Printf(输入在第一个链表插入的元素e1=);scanf&e1);printf("n);1istinsert(1a,i,e1);Printf(在第一个链表插入后1a=");/*输出链表1a的内容*/Print1ink1ist(1a);Printf(n");Printf(按任意整数求第一个链表表长);scanf(,z%dzz,&v);1ist1ength(1a);printf(第一个链表的长度为%d,1ist1ength(1a);printf("n");Printf(在第一个链表中,请输入要取出的数的位置数);scanf("%d",&z);GetE1em(1a,z);printf(zz,z);Printf(在第一个链表中,输入删除的位置i二);scanf&i);printf(n");1istDe1ete(1a,i,&e2);Printf(删除后1a=);*输出链表1a的内容*/Print1ink1ist(1a);Printf("n");Printf(在第一个链表中,被删除的元素的值e2=%dn",e2);1ist1ength(1a);whi1e(1);)【运行结果】的人在隼一代学视SA的心=i-3输入在第一-4'峙了崎八豹兀Nz-S61.*T、梃t松后J%WS->k->7»:百仟尊专於求第一彳个表方长5一个被丁输入耍羽山转数的金史恭4布Q的他意无耳干邦在笠一小惊&u.较处除的H5,-2计产.f125->5->7->36->iaF第一个话表二.外事胜体兀素系e2,S