收藏 分享(赏)

数据结构实验 链式表的操作.doc

上传人:精品资料 文档编号:10634834 上传时间:2019-12-10 格式:DOC 页数:17 大小:238KB
下载 相关 举报
数据结构实验 链式表的操作.doc_第1页
第1页 / 共17页
数据结构实验 链式表的操作.doc_第2页
第2页 / 共17页
数据结构实验 链式表的操作.doc_第3页
第3页 / 共17页
数据结构实验 链式表的操作.doc_第4页
第4页 / 共17页
数据结构实验 链式表的操作.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、数据结构与算法实验报告实验序号:3 实验项目名称:链式表的操作学 号 1507112104 姓 名 陈忠表 专业、班 15 商智实验地点 指导教师 林开标 实验时间 16.11.09一、实验目的及要求1. 通过实验理解单链表的逻辑结构;2. 通过实验掌握单链表的基本操作和具体的函数实现。二、实验设备(环境)及要求微型计算机;windows 操作系统;Microsoft Visual Studio 6.0 集成开发环境。三、实验内容与步骤链式表表示和实现线性表的如下:#include“stdio.h“#include“stdlib.h“typedef struct node /定义结点int d

2、ata; /结点的数据域为整型struct node *next; /结点的指针域ListNode;typedef ListNode * LinkList; / 自定义 LinkList 单链表类型LinkList CreatListR1(); /函数,用尾插入法建立带头结点的单链表ListNode *LocateNode(LinkList head, int key); /函数,按值查找结点void DeleteList(LinkList head,int key); /函数,删除指定值的结点void printlist(LinkList head); /函数,打印链表中的所有值void D

3、eleteAll(LinkList head); /函数,删除所有结点,释放内存/=主函数=void main()int num;char ch;LinkList head;head=CreatListR1(); /用尾插入法建立单链表,返回头指针printlist(head); /遍历链表输出其值printf(“ Delete node (y/n):“); /输入“y“或“n“去选择是否删除结点scanf(“%c“,if(ch=y) | ch=Y)printf(“Please input Delete_data:“);scanf(“%d“,num); /输入要删除的字符串DeleteList

4、(head,num);printlist(head);DeleteAll(head); /删除所有结点,释放内存/=用尾插入法建立带头结点的单链表=LinkList CreatListR1(void)return head; /返回头指针/=按值查找结点,找到则返回该结点的位置,否则返回 NULL=ListNode *LocateNode(LinkList head, int key)return p; /若 p=NULL 则查找失败,否则 p 指向找到的值为 key 的结点/=删除带头结点的单链表中的指定结点=void DeleteList(LinkList head,int key)/按

5、key 值查找结点的/若没有找到结点,退出/若找到,则从单链表中删除该结点,并释放结点/=打印链表,输出所有结点的值=void printlist(LinkList head)/=删除所有结点,释放空间=void DeleteAll(LinkList head) 1、 实现并调试单链表的的相关算法;2、改写以上程序,实现功能如下:(1)编写一个删除链表中值为 x 的结点的直接前趋结点的算法,若有多个值为 x 的结点,则删除第一个 x 的直接前趋结点。(2)改写 CreatListR1 函数,使得链表创建时为非递减有序的单链表。(3)在算法(2)生成的非递减有序的单链表中,编写一个算法,删除单链

6、表中值相同的多余结点。(4)写一个对单循环链表进行逆序输出(打印每个结点的值)的算法。四、实验结果与数据处理一.实验结果如图 1 所示:图 1二.(1)实验结果如图 2 所示:图 2(2)实验结果如图 3 所示:图 3(3)实验结果如图 4 所示:图 4(4) 实验结果如图 5 所示:图 5五、分析与讨论感觉实验 3 比之前的实验一、二难度更大,只能浏览同学的,有疑问便问同学,这样勉强理解。六、教师评语签名:日期:成绩附源程序清单:一. #include“stdio.h“#include“stdlib.h“typedef struct node /定义结点int data; /结点的数据域为整

7、型struct node *next; /结点的指针域ListNode;typedef ListNode * LinkList; / 自定义 LinkList 单链表类型LinkList CreatListR1(); /函数,用尾插入法建立带头结点的单链表void printlist(LinkList head); /函数,打印链表中的所有值ListNode *LocateNode(LinkList head, int key); /函数,按值查找结点void DeleteList(LinkList head,int key); /函数,删除指定值的结点 void DeleteAll(Link

8、List head); void main()int num;char ch;LinkList head;head=CreatListR1(); printf(“List:n“);printlist(head);printf(“ Delete node (y/n):“); /输入“y“或“n“去选择是否删除结点getchar();scanf(“%c“,if(ch=y|ch=Y)printf(“Please input Delete_data:“);scanf(“%d“, /输入要删除的数DeleteList(head,num); /删除printlist(head); /打印DeleteAll

9、(head); /删除所有结点,释放内存/=用尾插入法建立带头结点的单链表=LinkList CreatListR1(void)int n,i,count;LinkList head=(LinkList)malloc(sizeof(ListNode);ListNode *s, *r;/s 用来指向新生成的节点。r 始终指向 L 的终端节点。 r=head;r-next=NULL;printf(“请输入链表节点数:“);scanf(“%d“,printf(“输入节点值: “);for ( i = 0; i data = count; /用新节点的数据域来接受 ir-next = s; /用 r

10、来接纳新节点 r = s; /r 指向终端节点 r-next = NULL;return head; /返回头指针 return head; /返回头指针void printlist(LinkList head)ListNode *p=head-next; /从开始结点打印while(p)printf(“%d, “,p-data);p=p-next;printf(“n“);/=按值查找结点,找到则返回该结点的位置,否则返回 NULL=ListNode *LocateNode(LinkList head, int key)ListNode *p=head-next; /从开始结点比较while(

11、p /扫描下一个结点return p; /若 p=NULL 则查找失败,否则 p 指向找到的值为 key 的结点/=删除带头结点的单 链表中的指定结点=void DeleteList(LinkList head,int key)ListNode *p,*r,*q=head;p=LocateNode(head,key); /按 key 值查找结点的if(p=NULL ) /若没有找到结点,退出printf(“position error“);exit(0);while(q-next!=p) /p 为要删除的结点,q 为 p 的前结点q=q-next;r=q-next;q-next=r-next;

12、free(r); /释放结点/=删除所有结点,释放空间=void DeleteAll(LinkList head)ListNode *p=head,*r;while(p-next)r=p-next;free(p);p=r;free(p);二(1)#include“stdio.h“#include“stdlib.h“typedef struct node /定义结点int data; /结点的数据域为整型struct node *next; /结点的指针域ListNode;typedef ListNode * LinkList; / 自定义 LinkList 单链表类型LinkList Crea

13、tListR1(); /函数,用尾插入法建立带头结点的单链表void printlist(LinkList head);ListNode *LocateNode(LinkList head, int key); /函数,按值查找前结点void DeleteList(LinkList head,int key); /函数,删除指定值的结点 void DeleteAll(LinkList head); void main()int num;char ch;LinkList head;head=CreatListR1(); printf(“List:n“);printlist(head);print

14、f(“ 是否删除链表中值为 x 的结点的直接前趋结点(y/n):“); /输入“y“或“n“ 去选择是否删除结点getchar();scanf(“%c“,if(ch=y|ch=Y)printf(“Please input Delete_data:“);scanf(“%d“, /输入要删除的字符串DeleteList(head,num);printlist(head);DeleteAll(head); /删除所有结点,释放内存/=用尾插入法建立带头结点的单链表=LinkList CreatListR1(void)int n,i,count;LinkList head=(LinkList)mall

15、oc(sizeof(ListNode);ListNode *s, *r;/s 用来指向新生成的节点。r 始终指向 L 的终端节点。 r=head;r-next=NULL;printf(“请输入链表节点数:“);scanf(“%d“,printf(“输入节点值: “);for ( i = 0; i data = count; /用新节点的数据域来接受 ir-next = s; /用 r 来接纳新节点 r = s; /r 指向终端节点 r-next = NULL;return head; /返回头指针 return head; /返回头指针void printlist(LinkList head)

16、ListNode *p=head-next; /从开始结点打印while(p)printf(“%d, “,p-data);p=p-next;printf(“n“);/=/按值查找结点,找到返回该结点的直接前驱结点位置,否则返回NULL=ListNode *LocateNode(LinkList head, int key)ListNode *p=head-next; ListNode *x=head-next;/从开始结点比较while(p / x 为 P 的前一个节点;p=p-next; /扫描下一个结点if( p-data!=key)x=NULL;return x; /若 p=NULL 则

17、查找失败,否则 p 指向找到的值为 key 的结点/=删除带头结点的单 链表中的指定结点=void DeleteList(LinkList head,int key)ListNode *p,*r,*q=head;p=LocateNode(head,key); /按 key 值查找结点的if(p=NULL ) /若没有找到结点,退出printf(“position error“);exit(0);while(q-next!=p) /p 为要删除的结点,q 为 p 的前结点q=q-next;r=q-next;q-next=r-next;free(r); /释放结点/=删除所有结点,释放空间=voi

18、d DeleteAll(LinkList head)ListNode *p=head,*r;while(p-next)r=p-next;free(p);p=r;free(p);(2)#include“stdio.h“#include“stdlib.h“typedef struct node /定义结点int data; /结点的数据域为整型struct node *next; /结点的指针域ListNode;typedef ListNode * LinkList; / 自定义 LinkList 单链表类型LinkList CreatListR1(); /函数,用尾插入法建立带头结点的单链表vo

19、id printlist(LinkList head);void DeleteAll(LinkList head); void main()int num;char ch;LinkList head;head=CreatListR1(); printf(“List:n“);printlist(head);DeleteAll(head); /删除所有结点,释放内存/=用尾插入法建立带头结点的单链表=LinkList CreatListR1(void)int n,i,count,change,j;LinkList head=(LinkList)malloc(sizeof(ListNode);Lis

20、tNode *s, *r,*q;/s 用来指向新生成的节点。 r 始终指向 L 的终端节点。 r=head;q=head;r-next=NULL;printf(“请输入链表节点数:“);scanf(“%d“,printf(“输入节点值: “);for ( i = 0; i data = count; /用新节点的数据域来接受 ir-next = s; /用 r 来接纳新节点 r = s; /r 指向终端节点 r-next = NULL;/ 排序;for(i=n;i0;i-)q=head-next;for(j=0;jdata)(q-next-data)change=q-data;q-data=q

21、-next-data;q-next-data=change;q=q-next;elseq=q-next;return head; /返回头指针 return head; /返回头指针void printlist(LinkList head)ListNode *p=head-next; /从开始结点打印while(p)printf(“%d, “,p-data);p=p-next;printf(“n“);/=删除所有结点,释放空间=void DeleteAll(LinkList head)ListNode *p=head,*r;while(p-next)r=p-next;free(p);p=r;f

22、ree(p);(3)#include“stdio.h“#include“stdlib.h“typedef struct node /定义结点int data; /结点的数据域为整型struct node *next; /结点的指针域ListNode;typedef ListNode * LinkList; / 自定义 LinkList 单链表类型LinkList CreatListR1(); /函数,用尾插入法建立带头结点的单链表void printlist(LinkList head);void DeleteSameNode(LinkList head);void DeleteAll(Lin

23、kList head); void main()int num;char ch;LinkList head;head=CreatListR1(); printf(“List:n“);printlist(head);DeleteSameNode(head);printlist(head);DeleteAll(head); /删除所有结点,释放内存/=用尾插入法建立带头结点的单链表=LinkList CreatListR1(void)int n,i,count,change,j;LinkList head=(LinkList)malloc(sizeof(ListNode);ListNode *s,

24、*r,*q;/s 用来指向新生成的节点。 r 始终指向 L 的终端节点。 r=head;q=head;r-next=NULL;printf(“请输入链表节点数:“);scanf(“%d“,printf(“输入节点值: “);for ( i = 0; i data = count; /用新节点的数据域来接受 ir-next = s; /用 r 来接纳新节点 r = s; /r 指向终端节点 r-next = NULL;/ 排序;for(i=n;i0;i-)q=head-next;for(j=0;jdata)(q-next-data)change=q-data;q-data=q-next-data

25、;q-next-data=change;q=q-next;elseq=q-next;return head; /返回头指针 return head; /返回头指针void printlist(LinkList head)ListNode *p=head-next; /从开始结点打印while(p)printf(“%d, “,p-data);p=p-next;printf(“n“);/=删除多余节点=void DeleteSameNode(LinkList head) int n=2;ListNode *p,*q,*t,*s; p = head; p = p-next;/ p 第一个while(

26、p-next) if(p-data = p-next-data)if(p-next-next=NULL)p-next=NULL;elsep-next=p-next-next;p=p-next;elsep=p-next; /=删除所有结点,释放空间=void DeleteAll(LinkList head)ListNode *p=head,*r;while(p-next)r=p-next;free(p);p=r;free(p);(4)#include“stdio.h“#include“stdlib.h“typedef struct node /定义结点int data; /结点的数据域为整型st

27、ruct node *next; /结点的指针域ListNode;typedef ListNode * LinkList; / 自定义 LinkList 单链表类型LinkList CreatListR1(); /函数,用尾插入法建立带头结点的单链表void printlist(LinkList head);void printlist_inverseorder(LinkList head);/ 逆序 void DeleteAll(LinkList head); void main()int num;char ch;LinkList head;head=CreatListR1(); print

28、f(“List:n“);printlist(head);printlist_inverseorder(head);DeleteAll(head); /删除所有结点,释放内存/=用尾插入法建立带头结点的单链表=LinkList CreatListR1(void)int n,i,count;LinkList head=(LinkList)malloc(sizeof(ListNode);ListNode *s, *r;/s 用来指向新生成的节点。r 始终指向 L 的终端节点。 r=head;r-next=NULL;printf(“请输入链表节点数:“);scanf(“%d“,printf(“输入节点

29、值: “);for ( i = 0; i data = count; /用新节点的数据域来接受 ir-next = s; /用 r 来接纳新节点 r = s; /r 指向终端节点 r-next = NULL;return head; /返回头指针 return head; /返回头指针void printlist(LinkList head)ListNode *p=head-next; /从开始结点打印while(p)printf(“%d, “,p-data);p=p-next;printf(“n“);/=/逆序遍历/逆序遍历=void printlist_inverseorder(LinkL

30、ist head)ListNode *r=head,*h=head;while(r-next!=NULL)r=r-next; /r 指向终端节点 while(h!=r)printf(“%d “,r-data); /输出 rfor(;h-next!=r;)h=h-next; /使 h 指向 r 的前一个节点。r=h; / r=h (前一个节点)h=head; /h 等于头结点,然后进入下一个循环。printf(“n“);/=删除所有结点,释放空间=void DeleteAll(LinkList head)ListNode *p=head,*r;while(p-next)r=p-next;free(p);p=r;free(p);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报