实现单链表的各种基本运算文档格式.docx
- 文档编号:14832121
- 上传时间:2022-10-25
- 格式:DOCX
- 页数:13
- 大小:195.51KB
实现单链表的各种基本运算文档格式.docx
《实现单链表的各种基本运算文档格式.docx》由会员分享,可在线阅读,更多相关《实现单链表的各种基本运算文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
typedefstructLNode//定义单链表
{ElemTypedata;
structLNode*next;
}LinkList;
voidInitList(LinkList*&
L)
{L=(LinkList*)malloc(sizeof(LinkList));
//创建头结点
L->
next=NULL;
//头结点赋值为空
}
voidDestroyList(LinkList*&
L)//销毁单链表(释放单链表L占用的存空间即逐一释放全部结点的空间)
{LinkList*p=L,*q=p->
next;
while(q!
=NULL)
{free(p);
p=q;
q=p->
free(p);
intListEmpty(LinkList*L)//判线性表是否为空表ListEmpty(L)
{return(L->
next==NULL);
}//若单链表L没有数据结点,则返回真,否则返回假。
intListLength(LinkList*L)//求线性表的长度ListLength(L)
{LinkList*p=L;
inti=0;
while(p->
next!
{i++;
p=p->
}
return(i);
//返回单链表L中数据结点的个数
voidDispList(LinkList*L)//输出线性表DispList(L)
{LinkList*p=L->
while(p!
=NULL)//逐一扫描单链表L的每个数据结点,并显示各结点的data域值。
{printf("
%c"
p->
data);
p=p->
printf("
\n"
);
intGetELem(LinkList*L,inti,ElemType&
e)//求线性表L中指定位置的某个数据元素GetElem(L,i,&
e)
{intj=0;
LinkList*p=L;
while(j<
i&
&
p!
=NULL)//在单链表L中从头开始找到第i个结点,若存在第i个数据结点,则将其data域值赋给变量e。
{j++;
if(p==NULL)
return0;
//不存在第i个数据结点
else
{e=p->
data;
//存在第i个数据结点
return1;
intLocateElem(LinkList*L,ElemTypee)//按元素值查找LocateElem(L,e)
{LinkList*p=L->
intn=1;
=NULL&
p->
data!
=e)//在单链表L中从头开始找第1个值域与e相等的结点,若存在这样的结点,则返回位置,否则返回0。
{p=p->
n++;
if(p=NULL)
return(0);
else
return(n);
intListInsert(LinkList*&
L,inti,ElemTypee)//插入数据元素ListInsert(&
L,i,e)
LinkList*p=L,*s;
while(j<
i-1&
=NULL)//先在单链表L中找到第i-1个结点*p,若存在这样的结点,将值为e的结点*s插入到其后。
//未找到位序为i-1的结点
{s=(LinkList*)malloc(sizeof(LinkList));
s->
data=e;
next=p->
//将*s插入到*p之后
p->
next=s;
intListDelete(LinkList*&
L,inti,ElemType&
e)//删除数据元素ListDelete(&
L,i,&
LinkList*p=L,*q;
=NULL)//查找第i-1个结点
if(p==NULL)//未找到位序为i-1的结点
else//找到位序为i-1的结点*p
{q=p->
//q指向要删除的结点
if(q==NULL)return0;
//若不存在第i个结点,返回0
e=q->
next=q->
//从单链表中删除*q结点
free(q);
//释放*q结点
voidmain()
{
LinkList*h;
ElemTypee;
(1)初始化单链表h\n"
InitList(h);
(2)依次采用尾插入abcd,efgh,jilk,nnnn,kkkk元素\n"
ListInsert(h,1,'
abcd'
ListInsert(h,2,'
efgh'
ListInsert(h,3,'
jilk'
ListInsert(h,4,'
nnnn'
ListInsert(h,5,'
kkkk'
(3)输出单链表h:
"
DispList(h);
(4)单链表h长度=%d\n"
ListLength(h));
(5)单链表h为%s\n"
(ListEmpty(h)?
空"
:
非空"
));
GetELem(h,3,e);
(6)单链表h的第三个元素=%c\n"
e);
(7)元素a的位置=%d\n"
LocateElem(h,'
a'
(8)在第四个元素的位置上插入9元素\n"
9'
(9)输出单链表h:
(10)删除h的第三个元素\n"
ListDelete(h,3,e);
(11)输出单链表h:
(12)释放单链表h\n"
DestroyList(h);
五、实验测试及结果
六、思考题
1、
单链表有带头结点和不带头结点两种形式,则相应的操作实现有何区别?
答:
在带头节点的单链表中,头指针(head)只有一个域,即链指针,它指向头结点,头结点有两个域,一个是数据域,值为0(NULL),还有一个域,链指针,这个链指针指向单链表的第一个数据元素。
而在不带头结点的单链表中,头指针也只有一个链指针,但它指向单链表的第一个数据元素。
2、单向循环链表、双向链表、双向循环链表基本操作的实现。
(1)单向循环链表
循环链表的基本运算实现算法与非循环链表的算法基本相同,只是对表尾的判断作了改变。
因此单向循环链表与单链表基本上操作相同,只不过表尾的条件将发生变化。
(2)双向链表基本操作实现
双链表中有两个指针域,一个指向其直接后继结点,另一个指向其直接前驱结点。
建立双链表有头插法和尾插法。
【1】头插法:
VoidCreateListF(DLinkList*&
L,ElemTypea[],intn)
//由含有n个元素的数组a创建带头结点的双链表L
{DLinkList*s;
inti;
L=(DLinkList*)malloc(sizeof(DLinkList));
L->
prior=L->
for(i=0;
i<
n;
i++)
{s=(DLinkList*)malloc(sizeof(DLinkList));
s->
data=a[i];
next=L->
if(L->
=NULL)L->
prior=s;
prior=L;
}}
【2】尾插法
{DLinkList*s,*r;
intI;
r=L;
//r始终指向尾结点,开始时指向头结点
r->
prior=r;
r=s;
在双链表中,大部分基本操作运算与单链表相同,除插入与删除有所区别。
【插入】
intListInsert(DLinkList*&
L,intI,ElemTypee)
DLinkList*p=L,*s;
//p指向头结点
While(j<
{j++;
if(p==NULL)//未找到逻辑位序位i-1的结点
else//找到逻辑位序为i-1的结点*p
{s=(DLinkList*)malloc(sizeof(DLinkList))//创建结点*s;
if(p->
=NULL)p->
next->
prior=p;
return1;
【删除】
intListDelete(DLinkList*&
L,intI,ElemType&
{DLinkList*p=L,*q;
//p指向头结点
intj=0;
while(j<
=NULL)//查找第i-1个结点
{q=p->
if(q==NULL)return0;
e=q->
if(p->
free(q);
//释放*p结点
(2)双向循环链表实现:
插入操作(在p所指结点之前插入q结点的过程)
StatusListInsert_Dl(DLinkList&
L,inti,ElemTypex)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实现 单链表 各种 基本 运算