单链表的操作实现实验报告.docx
- 文档编号:1968378
- 上传时间:2022-10-25
- 格式:DOCX
- 页数:13
- 大小:30.48KB
单链表的操作实现实验报告.docx
《单链表的操作实现实验报告.docx》由会员分享,可在线阅读,更多相关《单链表的操作实现实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
单链表的操作实现实验报告
〈〈数据结构》上机实验报告
学号:
104100058
:
德刚
班级:
10A
实验时间:
年月日
实验地点:
同析3号楼
开发环境:
C++
课程名称:
数据结构----C语言描述
实验性质:
口综合性实验口/设计性实验口验证实验
实验容:
单链表的实现
题目来源:
口/教材页题口/教师补充口自选题
目
主要功能描述:
链表的初始化、链表的创建(头部插入法、尾部插入法)、求表长、查找(按值查找、按序号查找)、
插入、删除、输出、两个有序单链表的合并等。
设计分析:
初始化:
为单"申请头结点空间,将单链表设置为空;创建:
(1)头部插入法:
(a)初始化空表;(b)申请新结
点并赋值;(c)插入新结点;(d)插入第i个元素。
(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个结点并释放空间;
输出:
当表不为空时,依次输出表中元素;
合并:
与顺序表一样,只需为新的结点申请一个空间。
典型测试数据输入:
输入数据个数:
4数据:
1,2,3,4
输出:
1,2,3,4
预期结果:
基本实现了单链表的基本各种操作。
程序及运行结果正误判断:
口非常好口/正确,切改进口基本正确,还需改进口还有错误
不足之处或设计经验小结:
(1)L是单钏的头指针的指针,用来接收头指针变量的地址,*L待初始化的单链表为头指针变量;
(2)节省了空间,访问结点时,只需知道头指针,就可以找到其他的元素;
(3)头插法建表得到的链表中的结点的次序和输入的顺序相反,尾插法则一致;
(4)求灯时,算法的时间复杂度为O(n)。
任课教师评语:
教师签字:
年月日
注:
每学期至少有一次设计性实验。
每学期结束请任课教师按时按量统一交到教学秘书处。
源程序文件名及组^^件:
#include
①算法设计思想②算法描述
#include
#include
#include
#include
#defineTRUE1
#defineFALSE0
typedefintElemType;
typedefstructNode
{
ElemTypedata;
structNode*next;
}Node,*LinkList;
/*初始化*/
voidInit(LinkList*head)
{
*head=(LinkList)malloc(sizeof(Node));
(*head)->next=NULL;
}
LinkListcreate(intn)
{
LinkListh,r,p;
intx,i;
h=(Node*)malloc(sizeof(Node));
r=h;
printf("请输入数据:
\n");
for(i=1;i<=n;i++)
{
scanf("%d”,&x);
p=(Node*)malloc(sizeof(Node));
p->data=x;
r->next=p;
r=p;
}
r->next=NULL;
returnh;
}
/*头部插入*/
intCreatfromH(LinkListhead)
{
LinkListp;
ElemTypex;
puts("输入数据,输入-100。
结束输入!
");
while
(1)
{
scanf("%d”,&x);
if(x!
=-1000)
(
p=(Node*)malloc(sizeof(Node));
p->data=x;
p->next=head->next;
head->next=p;
}
elsebreak;
}
return1;
return0;
}
/*尾部插入*/
LinkListCreatfromT(LinkListhead)
(
LinkListp,q,t;
ElemTypex;
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;
}
}
returnq;
}
intInslist(LinkList*head,inti,ElemTypex)
(
LinkListp,q;
p=(*head);
intj=0;
while(p&&j ( p=p->next; j++; } if(! p||j>i-1) ( printf("插入位置不合法! "); return0; } q=(Node*)malloc(sizeof(Node)); q->data=x; q->next=p->next; p->next=q; return1; } //输出 voidOutput(LinkListhead) */ { /*定义节点指针类型,并指向首元结点 LinkListp; p=head->next; while(p! =NULL) { printf("\n%d”,p->data); p=p->next; } printf("\n"); } /*求表长*/ intLengthList(LinkListhead) { inti; LinkListp; i=0; p=head->next; while(p! =NULL) { i++; p=p->next; } returni; } /*查找*/ intLocate1(LinkListhead,ElemTypex) { LinkListp; inti=1; p=head->next; while(p! =NULL&&p->data! =x) { p=p->next; i++; } if(p==NULL)return0; returni; } intLocate2(LinkListhead,inti) ( intj; LinkListp; p=head; j=0; if(i<=1||j>i)returnNULL; while(p->next! =0&&j ( j++; p=p->next; } returnp->data; } /*删除*/ intDel(LinkList*head,inti) ( LinkListp,q; intj=0; p=(*head); while(p->next! =NULL&&j ( p=p->next; j=j++; } if(p==NULL&&j>i-1) ( printf("删除位置不合理! "); return0; } q=p->next; p->next=p->next->next; free(q); return1; } /*合并两个单链表*/ LinkListmerge(LinkListLa,LinkListLb) ( LinkListLc; LinkListq,p,r; p=La->next; q=Lb->next; Lc=La; Lc->next=NULL; r=Lc; while(p! =NULL&&q! =NULL) ( if(p->data<=q->data) ( r->next=p;r=p;p=p->next; } else ( r->next=q;r=q;q=q->next; } } if(p) ( r->next=p; } else ( r->next=q; } free(Lb); return(Lc); } voidmain() ( LinkListhead,La,Lb; inti; charzdg,y; ElemTypex; while(zdg! =0) ( getch(); system("CLS"); puts("\n"); puts("*********************************"); puts("*功能选择*"); puts("*0--退出1--创建2--插入*"); puts("*3--输出4--表长5--查找*"); puts("*6--删除7--合并*"); puts("*********************************"); printf("\n"); printf("请选择功能: \n"); scanf("%c”,&zdg); switch(zdg) ( case'0': puts(' l*********************************************************l「 puts("*0---般创建1---头部插入法2---尾部插入法*"); puts(" l*********************************************************l「 printf("请选择: \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; case'2': puts("\n"); printf("请输入要插入的位置: \n"); scanf("%d",&i); printf("请输入要插入的数据: \n"); scanf("%d”,&x); if(Inslist(&head,i,x)! =0) printf("插入成功! "); Output(head); break; case'3': puts("\n"); printf("输入的数据为: \n"); Output(head); break; case'4': puts("\n"); printf("长度为: %d",LengthList(head)); break; case'5': puts("\n"); *"); puts("********************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单链表 操作 实现 实验 报告