收藏 分享(赏)

实验二_单链表的实现及测试.doc

上传人:精品资料 文档编号:11033597 上传时间:2020-02-02 格式:DOC 页数:8 大小:1.22MB
下载 相关 举报
实验二_单链表的实现及测试.doc_第1页
第1页 / 共8页
实验二_单链表的实现及测试.doc_第2页
第2页 / 共8页
实验二_单链表的实现及测试.doc_第3页
第3页 / 共8页
实验二_单链表的实现及测试.doc_第4页
第4页 / 共8页
实验二_单链表的实现及测试.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、上海电力学院计算机软件技术实验实验报告实验题目: 单链表的实现及测试院 系: 自动化工程学院 专业年级: 自动化 2013 级 学生姓名: 晁文涛 学号 20131529实验二 单链表的基本算法一 实验目的:通过上机编程掌握1生成单链表的基本算法;2 在单链表上的插入、删除运算。二 实验要求:1. 给出程序设计的基本思想、原理和算法描述。2. 画出程序流程图;根据数据结构有关知识编出算法程序; 3. 源程序给出注释;4. 保存和打印出程序的运行结果,并结合程序进行分析。三 实验内容:1. 编写函数实现单链表的基本运算: (1) 单链表的生成反向建立链表(头插法)思想:首先生成头结点,形成一个空

2、链表,然后在表中逐一读入新的结点,反复执行下列步骤:使用 malloc 函数开辟新结点的存储单元;将读入数据存放到新结点的数据域中;将新结点插入到当前链表的表头上,直到读入结束标志为止。流程图为:具体算法如下:NODE *creatlink1() /头插法NODE *head,*s;int x;head=(NODE*)malloc(sizeof(NODE); /生成头结点head-next=NULL;scanf(“%d“, /读入第一个结点值while(x!=0)s=(NODE*)malloc(sizeof(NODE);s-data=x;s-next=head-next;head-next=s

3、; /将新节点插入到表头上scanf(“%d“,return head;开始H e a d = ( N O D E * ) m a l lo c ( s i z e o f ( N O D E ) ) ;H e a d - = n u l l ;请输入 x 的值判断 x ! = 0s = ( N O D E * ) m a l l o c ( s iz e o f ( N O D E ) ) ;YS - d a t a = x ;S - n e x t = h e a d - n e x t ;H e a d - n e x t = s ;结束正向建立单链表(尾插法)思想:首先生成头结点,依次

4、读入线性表的元素,从前往后依次将元素插入到当前链表的最后一个结点之后。流程图为:具体算法为:NODE *creatlink2() /尾插法NODE *head,*p,*s;int num;head=(NODE*)malloc(sizeof(NODE);/生成头结点scanf(“%d“,/读入第一个结点值p=head; /头指针等于尾指针while (num!=0) /输入 0 作为结束符s=(NODE*)malloc(sizeof(NODE);/生成新节点s-data=num; /新结点上填入输入值p-next=s; /新结点*s 插入到尾结点*p 之后p=s; /尾指针指向新的表尾scanf

5、(“%d“, /读入下一个结点值p-next=NULL; /将尾结点的指针置空return head; /返回单链表表头指针(2)单链表的插入思想:首先要搜索单链表以找到指定插入结点的前趋结点 p;然后改变链接,即只要是将待插入结点的指针域内容赋予 p 结点的指针域即可。开始H e a d = ( N O D E * ) m a l lo c ( s i z e o f ( N O D E ) ) ;H e a d - = n u l l ;输入 n u m 的值判断 n u m ! = 0s = ( N O D E * ) m a l l o c ( s iz e o f ( N O D E

6、 ) ) ;S - d a t a = n u m ;p - n e x t = s ;p = s ;结束P = h e a d ;YP - n e x t = n u l l ;输入 s u m 的值N流程图为:具体算法为:NODE *get(NODE *head,int i) /查找第 i 个元素的位置NODE *p;int counter=1;p=head-next;while(p!=NULL)counter+;if(p!=NULL)s-next=p-next;p-next=s;void insert(NODE *head,int i,int x) /在 i 个位置插入 xNODE *p

7、;int j=i-1;p=get(head,j); /调用查找函数找到 i-1 的结点位置if(p=NULL)printf(“error“);else insertafter(p,x); /调用 insertafter 函数(2) 单链表的删除思想:首先要搜索单链表以找到指定删除结点的前趋结点 p;然后改变链接,即只要是将待删除结点的指针域内容赋予 p 结点的指针域即可。开始请输入要插入元素的结点 i 和要插入的数值 xJ = i - 1 ;P = g e t ( h e a d , j ) ;判断 p 是否为N U L L ?输出“ e r r o r ”NI n s e r t a f t

8、 e r ( p , x )S = ( N O D E * )m a l l o c ( s i z e o f ( N O D E ) ) ;S - d a t a = x ;S - n e x t = p - n e x t ;P - n e x t = s ;结束流程图为:具体算法为:void delete(NODE *head,int i) /删除第 i 个位置的元素NODE *p,*s;int j=0;p=head;while(p-next!=NULL)j+;if(p-next=NULL)|(ji-1)printf(“i 值不合法 n“);elses=p-next; /修改 p-ne

9、xt,使指向 s-nextp-next=s-next; /删除 s 结点free(s);2. 编写主函数测试单链表的各种基本运算:(1) 生成一个至少包含有 5 个元素的单链表,元素值由计算机输入(2) 在表中的第 5 个位置上插入元素”7”(3) 删除表中的第 6 个元素(4) 显示(1) (3)每一步的操作结果源程序为:#include #include typedef int datatype;typedef struct node datatype data;struct node *next;NODE;NODE *creatlink1() /头插法NODE *head,*s;int

10、x;head=(NODE*)malloc(sizeof(NODE); /生成头结点head-next=NULL;scanf(“%d“, /读入第一个结点值while(x!=0)s=(NODE*)malloc(sizeof(NODE);开始请输入要删除元素的结点 iJ = 0 ;P = h e a d ;判断 p - n e x t 是否不为 N U L L 且 j 小于 i - 1 ?P = p - n e x t ;J + + ;Y判断 p - n e x t 是否为N U L L 或者 j 大于 i - 1 ?N输出 “ i 值不合法 n ” ;YS = p - n e x t ;P -

11、n e x t = s - n e x t ;F r e e ( s ) ;结束s-data=x;s-next=head-next;head-next=s; /将新节点插入到表头上scanf(“%d“,return head;NODE *creatlink2() /尾插法NODE *head,*p,*s;int num;head=(NODE*)malloc(sizeof(NODE);/生成头结点scanf(“%d“, /读入第一个结点值p=head; /头指针等于尾指针while (num!=0) /输入 0 作为结束符s=(NODE*)malloc(sizeof(NODE);/生成新节点s-

12、data=num; /新结点上填入输入值p-next=s; /新结点*s 插入到尾结点 *p 之后p=s; /尾指针指向新的表尾scanf(“%d“, /读入下一个结点值p-next=NULL; /将尾结点的指针置空return head; /返回单链表表头指针NODE *get(NODE *head,int i) /查找第 i 个元素的位置NODE *p;int counter=1;p=head-next;while(p!=NULL)counter+;if(p!=NULL)j+;if(p-next=NULL)|(ji-1)printf(“i 值不合法 n“);elses=p-next; /修

13、改 p-next,使指向 s-nextp-next=s-next; /删除 s 结点free(s);void insertafter(NODE *p,int x)NODE *s;s=(NODE*)malloc(sizeof(NODE); /修改 i-1 结点的尾指针s-data=x;s-next=p-next;p-next=s;void insert(NODE *head,int i,int x) /在 i 个位置插入 xNODE *p;int j=i-1;p=get(head,j); /调用查找函数找到 i-1 的结点位置if(p=NULL)printf(“error“);else inse

14、rtafter(p,x); /调用 insertafter 函数void print(NODE *head) /输出函数int x;NODE *p;p=head;printf(“n“);p=p-next;while(p)x=p-data;printf(“%4d“,x);p=p-next;main() NODE *head;printf(“Please enter the link of elements:n“);/head=creatlink1(); /头插法head=creatlink2(); /尾插法printf(“The first step of is :n“);print(head);printf(“n“);insert(head,5,7); /调用插入函数printf(“The second step of is :n“);print(head);printf(“n“);delete(head,6); /调用删除函数printf(“The third step of is :n“);print(head);printf(“n“);运算结果为:四、实验心得在这次实验中,我学到很多东西,加强了我的编程能力,加强了我对链表的了解,并且培养了我的独立思考能力。虽然在编写的过程的中遇到一些困难,但在老师和自己的努力下,得到了解决,也使自己加深了印象,以后要多加练习。

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

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

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


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

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

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