线性表链式存储实验

上传人:小** 文档编号:54434095 上传时间:2018-09-12 格式:DOC 页数:31 大小:235.02KB
返回 下载 相关 举报
线性表链式存储实验_第1页
第1页 / 共31页
线性表链式存储实验_第2页
第2页 / 共31页
线性表链式存储实验_第3页
第3页 / 共31页
线性表链式存储实验_第4页
第4页 / 共31页
线性表链式存储实验_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《线性表链式存储实验》由会员分享,可在线阅读,更多相关《线性表链式存储实验(31页珍藏版)》请在金锄头文库上搜索。

1、实验报告学号: * * 年 * 月 * 日系别*专业*班级1 班姓名*课程名称数据结构课程类型专业必修学时数2实验名称线性表的链式存储实验实验目的和要求:(1) 掌握用在 VC 环境下上机调试单链表的基本方法(2) 掌握单链表、循环链表的插入、删除、查找、求表长以及有序单链表的合并算法 的实现实验内容:一、单链表基本操作的实现有序单链表的合并,已知单链表 la 和 lb 中的数据元素按非递减有序排列,将 la 和 lb中的数据元素,合并为一个新的单链表 lc,lc 中的数据元素仍按非递减有序排列,要求不破坏 la 表和 lb 表的结构。源代码:#include #include typedef

2、 struct linkint data;struct link *next;Link;/创建单向链表并初始化Link *Create_link(Link *head)Link *pr = head;Link *p = head;p = (Link *)malloc(sizeof(Link);if(p=NULL)printf(“没有足够的空间!n“);exit(0);if(head=NULL)head = p;p-next = NULL;printf(“表头已创建!n“);elsewhile(pr-next!=NULL)pr = pr-next;pr-next = p;p-next = NUL

3、L;printf(“请输入该结点的数据:“);scanf(“%d“,return head;/在链表中按序号查找void Insert_link(Link *head,int k)int i=1;Link *p = head-next;if(head=NULL)printf(“次链表为空!请先创建链表n“);exit(0);while(p!=NULL i+;if(p=NULL)printf(“输入序号超过表长!n“);exit(0);elseprintf(“第 %d 个元素为 %dn“,k,p-data);/在链表中按值查找void Find_elem(Link *head,int key)L

4、ink *p = head-next;int i=1;while(p!=NULL i+;if(p=NULL)printf(“未找到该元素!n“);elseprintf(“%d 在第 %d 个位置且地址为 %dn“,key,i,p);/将 e 插入链表的第 pe 个位置void Insert_elem(Link *head,int pe,int e)Link *q = NULL;/q 用于申请新节点Link *p = head-next;int j=1;while(p!=NULL j+;if(p=NULL)printf(“插入的位置超过合法范围n“);exit(0);else if(pe=1)q

5、 = (Link *)malloc(sizeof(Link);if(q=NULL)printf(“空间不足,节点申请失败!n“);q-data = e;q-next = p;head-next = q;elseq = (Link *)malloc(sizeof(Link);if(q=NULL)printf(“空间不足,节点申请失败!n“);exit(0);q-data = e;q-next = p-next;p-next = q;printf(“插入新节点后的链表为:n“);p = head-next;while(p!=NULL)printf(“%d “,p-data);p = p-next;

6、/删除元素void Delete(Link *head,int chioce)int k,j=1;Link *p = head, *q = head-next, *pr = head-next;int key;switch(chioce)case 1:printf(“输入删除的元素序号: “);scanf(“%d“,while(q!=NULL j+;if(q=NULL)printf(“删除位置不合法,越界!n“);elsep-next = q-next;free(q);break;case 2:printf(“输入要删除结点的值:“);scanf(“%d“,while(q!=NULL)if(q

7、-data=key)p-next = q-next;free(q);q = p-next;elsep = q;q = q-next;if(p=NULL)printf(“所删除的值不存在!n“);break;case 3:while(pr!=NULL)p = pr;q = pr-next;while(q!=NULL)if(q-data=pr-data)p-next = q-next;free(q);q = p-next;elsep = q;q = q-next;pr = pr-next;break;p = head-next;while(p!=NULL)printf(“%d “,p-data);

8、p = p-next;/将 La,lb 合并void Merge(Link *headLa,Link *headLb)Link *headLc = headLa;Link *pa = headLa-next;Link *pb = headLb-next;Link *pc = headLc;Link *ptr =NULL;while(pa pc = pa;pa = pa-next;else if(pa-data pb-data)pc-next = pb;pc = pb;pb = pb-next;elsepc-next = pa;pc = pa;pa = pa-next;ptr = pb;pb =

9、 pb-next;free(ptr);pc-next = pa?pa:pb;free(headLb);ptr = headLc-next;while(ptr!=NULL)printf(“%d “,ptr-data);ptr = ptr-next;printf(“n“); void main()char c;char m = y;int i=-1;/记录链表中的元素个数int k,key;Link *head=NULL;Link *headLa=NULL;Link *headLb=NULL;Link *p = NULL;int chioce,pick;int e,pe;printf(“1 创建链

10、表n2 链表的查找n3 链表的插入n4 链表的删除n5 两链表的合并n6 退出操作n“);doprintf(“n 选择:“);scanf(“%d“,switch(pick)case 1:printf(“是否要创建新的节点(y/n):“);getchar();scanf(“%c“,getchar();while(c=y)i+;head = Create_link(head);printf(“是否要创建新的节点(y/n):“);scanf(“ %c“,p = head-next;printf(“此次创建链表长度为 %d n 链表为:n“,i);while(p!=NULL)printf(“%d “,

11、p-data);p = p-next;printf(“n“);break;case 2:printf(“1 按序号查找n2 按值查找n“);while(m=y)printf(“请选择操作序号: “);scanf(“%d“,switch(chioce)case 1:printf(“输入序号: “);scanf(“%d“,Insert_link(head,k,i);break;case 2:printf(“输入元素值:“);scanf(“%d“,Find_elem(head,key);break;printf(“是否继续查找(输入 y/n): “);scanf(“ %c“,break;case 3

12、:printf(“输入插入的数值: “);scanf(“%d“,printf(“输入节点的位置: “);scanf(“%d“,Insert_elem(head,pe,e);break;case 4:printf(“1 按位置删除n2 按值删除n3 删除链表中所有的重复元素n“);while(1)printf(“请选择要执行的操作:“); scanf(“%d“,Delete(head,chioce);printf(“n 是否继续操作(y/n):“);scanf(“ %c“,if(c=n)break;break;case 5:printf(“n 创建第一个列表n“);printf(“是否要创建新的

13、节点(y/n):“);scanf(“ %c“, /注意吸收在选择时的回车符getchar();while(c=y)i+;headLa = Create_link(headLa);printf(“是否要创建新的节点(y/n):“);scanf(“ %c“,p = headLa-next;printf(“共创建 %d 个节点n 链表为:n“,i);while(p!=NULL)printf(“%d “,p-data);p = p-next;printf(“n“);printf(“n 创建第二个列表n“);printf(“是否要创建新的节点(y/n):“);scanf(“ %c“,/注意吸收回车符ge

14、tchar();while(c=y)i+;headLb = Create_link(headLb);printf(“是否要创建新的节点(y/n):“);scanf(“ %c“,/吸收回车符可以在 scanf 后加入多个空格p = headLb-next;printf(“共创建 %d 个节点n 链表为:n“,i);while(p!=NULL)printf(“%d “,p-data);p = p-next;printf(“n“);printf(“n 合并后的链表为n“);Merge(headLa,headLb);break;case 0:printf(“退出操作!n“);exit(0);break

15、;while(pick!=0);运算结果:二、循环链表的基本操作源代码:#include #include typedef struct linkint data;struct link *next;Link;/创建链表并初始化Link *Create_link(Link *head)Link *pr = head;Link *p = head;p = (Link *)malloc(sizeof(Link);if(p=NULL)printf(“没有足够的空间!n“);exit(0);if(head=NULL)head = p;p-next = head;printf(“表头已创建!n“);elsewhile(pr-next!=head)pr = pr-next;pr-next = p;p-next = head;printf(“请输入该结点的数据:“);scanf(“%d“,return head;/:在链表中按序号查找int Insert_link(Link *head,int k)int i=1;Link *p =

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号