实验三 实现单链表的各种运算文档格式.docx
《实验三 实现单链表的各种运算文档格式.docx》由会员分享,可在线阅读,更多相关《实验三 实现单链表的各种运算文档格式.docx(7页珍藏版)》请在冰豆网上搜索。
6、输出单链表的第i位置的元素;
7、在单链表中查找一个给定元素在表中的位置;
8、单链表的删除;
9、释放单链表
三、实验要点及说明
单链表是线性表的链式存储结构的一种形式,它用一组地址任意的存储单元存放线性表的各个元素。
具体程序如下:
#include<
stdio.h>
malloc.h>
typedefcharelemtype;
typedefstructLNode
{
elemtypedata;
structLNode*next;
}linklist;
voidinitlist(linklist*&
L)
L=(linklist*)malloc(sizeof(linklist));
L->
next=NULL;
}
voiddestroylist(linklist*&
linklist*p=L,*q=p->
next;
while(q!
=NULL)
{
free(p);
p=q;
q=p->
}
free(p);
}
intlistempty(linklist*L)
return(L->
next==NULL);
intlistlength(linklist*L)
linklist*p=L;
inti=0;
while(p->
next!
{
i++;
p=p->
return(i);
voiddisplist(linklist*L)
linklist*p=L->
while(p!
printf("
%c"
p->
data);
printf("
\n"
);
intgetelem(linklist*L,inti,elemtype&
e)
intj=0;
while(j<
i&
&
p!
j++;
if(p==NULL)
return0;
else
e=p->
data;
return1;
intlocateelem(linklist*L,elemtypee)
{
intn=1;
while(p!
=NULL&
p->
data!
=e)
n++;
return(0);
return(n);
intlistinsert(linklist*&
L,inti,elemtypee)
linklist*p=L,*s;
i-1&
else
{s=(linklist*)malloc(sizeof(linklist));
s->
data=e;
s->
next=p->
p->
next=s;
intlistdelete(linklist*&
L,inti,elemtype&
linklist*p=L,*q;
while(j<
{q=p->
if(q==NULL)return0;
e=q->
next=q->
free(q);
voidmain()
linklist*h;
elemtypee;
(1)初始化单链表h\n"
initlist(h);
(2)依次采用尾插法插入a,b,c元素\n"
listinsert(h,1,'
a'
b'
c'
d'
e'
(3)输出单链表h:
"
displist(h);
(4)单链表h的长度=%d\n"
listlength(h));
(5)单链表h为%s\n"
(listempty(h)?
空"
:
非空"
));
getelem(h,3,e);
(6)单链表h的第3个元素=%c\n"
e);
(7)元素a的位置=%d\n"
locateelem(h,'
(8)在第4个元素位置上插入f元素\n"
listinsert(h,4,'
f'
(9)输出单链表h:
(10)删除h的第3个元素\n"
listdelete(h,3,e);
(11)输出单链表h:
(12)释放单链表h\n"
destroylist(h);
四,测试与结果
结果:
五,算法思想:
单链表中重要的也是插入节点的运算,即将值为x的新节点插入到第i个节点的位置,现在单链表中找到第i-1个节点,再在其后插入新的节点,假设要在单链表的两个数据分别为a和b的结点之间插入一个数据域为x的结点。
P是指向数据域a的结点,s指向数据域为x的结点,为了插入结点*s需要修改结点*p中的指针域,令其指向结点*s而结点s中的指针域应指向结点b,从而实现3个节点之间的逻辑关系的变化。
六,心得体会:
通过这次试验,我知道了什么事情都得自己动手去思考,去理解,把这些东西都化为自己脑子里的东西,慢慢脱离书本,我知道现在自己的基础不好,但是我相信,慢慢的会变好的!