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