单链表的基本操作.docx
- 文档编号:25648808
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:15
- 大小:202.04KB
单链表的基本操作.docx
《单链表的基本操作.docx》由会员分享,可在线阅读,更多相关《单链表的基本操作.docx(15页珍藏版)》请在冰豆网上搜索。
单链表的基本操作
实验题目
线性表的链式存储结构
小组合作
姓名
班级
学号
一、实验目的
实验
(一)
1.掌握线性表的存储方式、表示方式
2.掌握线性表的基本操作,以及其如何用代码实现
实验
(二)
1.掌握元素在线性表中的存储以及表示方法,如何取数据元素
2.拓展:
将存有偶数个元素的线性表中的奇数项、偶数项分别抽出,组成一个新的线性表,并将新的线性表输出
二.实验环境
DevC++
三、实验内容与步骤
实验
(一)
内容:
线性表的链式存储结构,简称链表,有单链表和双链表两类。
单链表是一种基本的数据结构,有两部分组成:
指针域和数据域,数据域用于存放数据,指针域用于指向下一个结点的位置。
为了操作方便,一般为单链表创建一个头结点,指向线性表的的首元素。
线性表的最后一个元素的指针域为空,表示链表的结束。
通顺序表一样,链表也有许多基本操作,如:
(1)单链表的创建
(2)单链表元素的插入
(3)单链表元素的删除
(4)单链表元素的查找(定位)
步骤:
1.引入相关的头文件,宏定义
2.创建一个结构体,用于表示链表的结构
3.创建一个空的单链表
4.向单链表中添加数据
5.查找单链表中的元素
6.删除单链表的元素
实验
(二)
内容:
已知单链表已创建好,表示为LinkList={a1,b1,a2,b2,..an,bn},将单链表拆分,使得{a1,a2,..an}构成一个单链表,剩余的元素构成一个单链表,编程实现。
(1)创建单链表,添加2n个元素
(2)将链表拆分为两个子链表
步骤:
7.引入相关的头文件,宏定义
8.创建一个结构体,用于表示链表的结构
9.创建一个空的单链表
10.向单链表中添加数据
11.调用拆分链表的函数,用于实现对链表的拆分工作
12.输出拆分后的单链表
四、实验过程与分析
实验
(一)
1)引入头文件,进行相关的定义操作
#include
#include
#defineOK1
#defineERROR0
typedefintElemType;
typedefintStatus;
typedefstructLNode{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
2)编写链表的初始化函数,用于头结点的初始化操作
voidInitList(LinkListL){
L->next=NULL;
L->data=0;
printf("带有头结点的单链表初始化完毕\n\n");
}
3)单链表的遍历函数,用于输出单链表的结点值
//遍历单链表
voidPrintList(LinkListL){
LNode*p;
p=L->next;
if(p==NULL){
printf("单链表为空\n\n");
return;
}
printf("单链表的结点值为:
");
while(p){
printf("%d",p->data);
p=p->next;
}
printf("\n\n");
}
4)结点的头插法:
用于在头结点之后插入一个结点
//结点头插法
StatusInsertHead(LinkListL){
//创建结点
LNode*p;
ElemTyped;
printf("请输入结点的值:
");
scanf("%d",&d);
p=(LNode*)malloc(sizeof(LNode));
p->data=d;
p->next=L->next;
L->next=p;
printf("头插法插入结点成功\n\n");
returnOK;
}
5)结点的尾插法:
用于在链表的末尾,插入一个结点
//结点尾插法
StatusInsertTail(LinkListL){
LNode*p,*q;
ElemTyped;
printf("请输入结点的值:
");
scanf("%d",&d);
p=L;
q=(LNode*)malloc(sizeof(LNode));
q->next=NULL;
q->data=d;
while(p->next){
p=p->next;
}
p->next=q;
printf("尾插法创建单链表成功\n\n");
returnOK;
}
6)单链表元素的查找:
用于获取某个位置的元素
//获取单链表中的第i个元素
StatusGetElem(LinkListL,intloc){
inti=0;
LNode*p;
p=L->next;
while(p){
i++;
if(i==loc){
printf("单链表的第%d个元素是:
%d\n\n",loc,p->data);
break;
}
p=p->next;
}
if(!
p){
printf("该位置超过单链表的长度\n\n");
returnERROR;
}
returnOK;
}
7)单链表结点的删除
//删除单链表中的第i个结点
StatusDeleteNode(LinkListL,intloc){
inti;
LNode*p,*q;
p=L;
if(!
p->next){
printf("单链表为空\n\n");
returnERROR;
}
if(loc<=0){
printf("位置必须大于0\n\n");
returnERROR;
}
for(i=0;i p=p->next; if(! p){//说明单链表结束 printf("第%d个元素不存在\n",loc); returnERROR; } } q=p->next; p->next=q->next; free(q); printf("结点删除成功\n"); returnOK; } 8)在主函数中调用相关的函数 intmain(void){ LinkListL; L=(LNode*)malloc(sizeof(LNode)); InitList(L); InsertHead(L); InsertHead(L); PrintList(L); InsertTail(L); InsertTail(L); PrintList(L); GetElem(L,4); DeleteNode(L,1); PrintList(L); DeleteNode(L,0); PrintList(L); return0; } 9)编译链接源代码,后运行exe文件: 10)调用头插法的函数,分别输入10,20,分别回车: 11)调用尾插法的函数,分别输入30,40 12)查找单链表的第四个元素: 13)主函数中传入参数,删除单链表的第一个结点: 14)主函数传入参数,删除第0个未位置的元素,程序报错: 15)最后,输出单链表中的元素: 实验 (二) 1)引入相关的头文件,进行宏定义 #include #include typedefstructNode{ intdata; structNode*next; }Node,*LinkList; 2)初始化函数,用于对头结点初始化和插入元素(尾插法) voidinit(LinkListL){ inti,n; Node*p; L->data=0; L->next=NULL; printf("线性表初始化完成\n"); printf("请输入线性表的个数(偶数个): "); scanf("%d",&n); if(n%2! =0){ printf("请输入偶数个数据\n"); return; } for(i=0;i p=(Node*)malloc(sizeof(Node)); scanf("%d",&p->data); p->next=L->next; L->next=p; } printf("数据插入完成\n"); } 3)单链表的输出函数 voidprint(LinkListL){ Node*p; p=L->next; printf("线性表的元素为: \n"); while(p){ printf("%d",p->data); p=p->next; } printf("\n\n"); } 4)单链表的拆分函数,把单链表拆分成两个: voidcreate(LinkListL){ Node*p,*q,*t;//q指向L1,t指向L2 LinkListL1,L2; L1=(Node*)malloc(sizeof(Node)); L2=(Node*)malloc(sizeof(Node)); L1->next=NULL; L2->next=NULL; L1->data=0; L2->data=0; q=L1; t=L2; p=L->next; while(p){ q->next=p; p=p->next; q=q->next; q->next=NULL; t->next=p; p=p->next; t=t->next; t->next=NULL; } print(L1); print(L2); p=L; } 5)在主函数中进行函数的调用 intmain(void){ LinkListL; L=(Node*)malloc(sizeof(Node)); init(L); print(L); create(L); return0; } 6)编译,连接,运行源代码: 7)输入8,回车,并输入8个数,用空格分隔开,根据输出信息,可以看出,链表已经拆分为两个 五、实验总结 1.单链表采用的是数据+指针的表示形式,指针域总是指向下一个结点(结构体)的地址,因此,在内存中的地址空间可以是不连续的,操作比顺序存储更加的方便 2.单链表使用时,需要用malloc函数申请地址空间,最后,删除元素时,使用free函数释放空间 3.单链表元素插入时,有许多种方式,但其基本原理相同,即先修改新结点的指针指向,再让其他指针指向新的结点,从而实现了线性表的链接。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单链表 基本 操作