1、信 息 学 院数据结构上机实验报告学号:104100058姓名:赵德刚班级:10A实验时间: 年 月 日实验地点:同析3号楼开发环境:C+课程名称:数据结构-C语言描述实验性质: 综合性实验 设计性实验 验证实验实验内容:单链表的实现题目来源: 教材 页 题 教师补充 自选题目主要功能描述:链表的初始化、链表的创建(头部插入法、尾部插入法)、求表长、查找(按值查找、按序号查找)、插入、删除、输出、两个有序单链表的合并等。设计分析:初始化:为单链表申请头结点空间,将单链表设置为空;创建:(1)头部插入法:(a)初始化空表;(b)申请新结点并赋值;(c)插入新结点;(d)插入第i个元素。(2)尾部
2、插入法:(a)建空表(b)申请结点并赋值;(c)插入第一个结点;(d)r-next=s,r=s;表长:从表头开始,将指针依次指向各个结点,一直到p-next=NULL为止,用j来计数。查找:(1) 按值查找:在表中查找第i个结点,找到就返回该结点的存储位置,用j来存储扫描过的结点数(j的初值为0),但j=i时,结束。(2) 按序号查找:从表中第一个结点开始,当key等于查找到的元素的数据时停止查找。插入:在单链表中第i-1个结点并由指针指示,申请结点空间q,将数据域置为x,更新指针。删除:从头结点开始,删除第i个结点并释放空间;输出:当表不为空时,依次输出表中元素;合并:与顺序表一样,只需为新
3、的结点申请一个空间。典型测试数据输入:输入数据个数:4数据:1,2,3,4输出:1,2,3,4预期结果:基本实现了单链表的基本各种操作。程序及运行结果正误判断: 非常好 正确,还可改进 基本正确,还需改进 还有错误 不足之处或设计经验小结:(1) L是单链表的头指针的指针,用来接收头指针变量的地址,*L待初始化的单链表为头指针变量;(2) 节省了空间,访问结点时,只需知道头指针,就可以找到其他的元素;(3) 头插法建表得到的链表中的结点的次序和输入的顺序相反,尾插法则一致;(4) 求表长时,算法的时间复杂度为O(n)。任课教师评语:教师签字: 年月日注:每学期至少有一次设计性实验。每学期结束请
4、任课教师按时按量统一交到教学秘书处。源程序文件名及组成文件:#include,#include,#include,#include 算法设计思想 算法描述#include#include#include#include#define TRUE 1#define FALSE 0typedef int ElemType;typedef struct NodeElemType data;struct Node * next;Node,*LinkList;/*初始化*/void Init(LinkList *head)*head=(LinkList)malloc(sizeof(Node);(*head
5、)-next=NULL;LinkList create(int n)LinkList h,r,p;int x,i; h=(Node*)malloc(sizeof(Node);r=h;printf(请输入数据:n);for(i=1;idata=x;r-next=p;r=p;r-next=NULL;return h; /*头部插入*/int CreatfromH(LinkList head)LinkList p;ElemType x;puts(输入数据,输入-1000结束输入!);while(1)scanf(%d,&x);if(x!=-1000)p=(Node*)malloc(sizeof(Nod
6、e);p-data=x;p-next=head-next;head-next=p;else break;return 1;return 0;/*尾部插入*/LinkList CreatfromT(LinkList head)LinkList p,q,t;ElemType x;q=head;t=head;puts(输入数据,输入-1000结束输入!);while(1)scanf(%d,&x);if(x!=-1000)p=(Node*)malloc(sizeof(Node);p-data=x;p-next=NULL;t-next=p;t=p;return q;int Inslist(LinkLis
7、t *head,int i,ElemType x)LinkList p,q;p=(*head);int j=0;while(p&jnext;j+;if(!p|ji-1)printf(插入位置不合法!);return 0;q=(Node*)malloc(sizeof(Node);q-data=x; q-next=p-next;p-next=q;return 1;/输出void Output(LinkList head)/*定义节点指针类型,并指向首元结点*/LinkList p;p=head-next;while(p!=NULL)printf(n%d,p-data);p=p-next;print
8、f(n);/*求表长*/int LengthList(LinkList head)int i;LinkList p;i=0;p=head-next;while(p!=NULL)i+;p=p-next;return i;/*查找*/int Locate1(LinkList head,ElemType x)LinkList p;int i=1;p=head-next;while(p!=NULL&p-data!=x)p=p-next;i+;if(p=NULL)return 0;return i;int Locate2(LinkList head,int i)int j;LinkList p;p=he
9、ad;j=0;if(ii)return NULL;while(p-next!=0&jnext;return p-data;/*删除*/int Del(LinkList *head,int i)LinkList p,q;int j=0;p=(*head);while(p-next!=NULL&jnext;j=j+;if(p=NULL&ji-1)printf(删除位置不合理!);return 0;q=p-next;p-next=p-next-next;free(q);return 1;/*合并两个单链表*/LinkList merge(LinkList La,LinkList Lb)LinkLis
10、t Lc; LinkList q,p,r;p=La-next;q=Lb-next;Lc=La;Lc-next=NULL;r=Lc;while(p!=NULL&q!=NULL)if(p-datadata) r-next=p;r=p;p=p-next;else r-next=q;r=q;q=q-next;if(p)r-next=p;elser-next=q;free(Lb);return(Lc);void main()LinkList head,La,Lb;int i;char zdg,y;ElemType x;while(zdg!=0)getch();system(CLS);puts(n);pu
11、ts(*);puts(* 功能选择 *);puts(* 0-退出 1-创建 2-插入 *);puts(* 3-输出 4-表长 5-查找 *);puts(* 6-删除 7-合并 *);puts(*);printf(n);printf(请选择功能:n);scanf(%c,&zdg);switch(zdg)case0:puts(nn);puts( *);puts( * *);puts( * 谢谢使用,再见! *);puts( * *);puts( *);break;case1:puts(n);puts(*);puts(* 0-般创建 1-头部插入法 2-尾部插入法 *);puts(*);printf
12、(请选择:n);scanf(%c,&y);y=getch();if(y=0)printf(输入数字的个数:n);scanf(%d,&i);head=create(i);if(y=1)CreatfromH(head);printf(新的单链表为:);Output(head);if(y=2)printf(新的单链表为:);Output(CreatfromT(head);break;case2:puts(n);printf(请输入要插入的位置:n);scanf(%d,&i);printf(请输入要插入的数据:n);scanf(%d,&x);if(Inslist(&head,i,x)!=0)print
13、f(插入成功!);Output(head);break;case3:puts(n);printf(输入的数据为:n); Output(head);break;case4:puts(n);printf(长度为:%d,LengthList(head);break;case5:puts(n);puts(*);puts(* 1-按值查找 2-按序号查找 *);puts(*);printf(请选择:n);scanf(%c,&y);y=getch();if(y=1)printf(请输入要查找的元素:n);scanf(%d,&x);if(Locate1(head,x)!=0)printf(查找成功!该元素的
14、位置是%d,Locate1(head,x);elseprintf(无此元素,查找失败!);if(y=2)printf(请输入要查找的元素的位置:n);scanf(%d,&i);if(Locate2(head,i)!=0)printf(查找成功,该%d号位置上的是%d!,i,Locate2(head,i);else printf(无此元素,查找失败!);break;case6:puts(n);printf(请输入你要删除的元素序号:);scanf(%d,&i);Del(&head,i);Output(head);break;case7:puts(n);printf(请输入La的数据:);printf(输入数字的个数:n); scanf(%d,&i);La=create(i);printf(请输入Lb的数据:);printf(输入数字的个数:n); scanf(%d,&i);Lb=create(i);Output(merge(La,Lb);break;default:(选择错误,请重新选择!n);