数据结构实验报告实现单链表各种基本运算的算法.docx
《数据结构实验报告实现单链表各种基本运算的算法.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告实现单链表各种基本运算的算法.docx(12页珍藏版)》请在冰豆网上搜索。
数据结构实验报告实现单链表各种基本运算的算法
实验题目
实现单链表各种基本运算的算法
小组合作
无
姓名
班级
学号
一、实验目的
领会单链表存储结构和掌握单链表中各种基本运算算法设计
二.实验环境
MiscroftVisualC++6.0环境。
三.实验内容与步骤
1.编写linklist.cpp程序包含有关单链表运算算法
2.编写exp2-2.cpp程序包含有关程序代码
3.运行程序exp2-2.cpp,得到结果
四、实验过程与分析
//单链表运算算法
#include
#include
typedefcharElemType;
typedefstructLNodea
{
ElemTypedata;
structLNode*next;
//指向后继结点
}LinkNode;
//单链表结点类型
voidCreateListF(LinkNode*&L,ElemTypea[],intn)
//头插法建立单链表
{
LinkNode*s;
L=(LinkNode*)malloc(sizeof(LinkNode));
//创建头结点
L->next=NULL;
for(inti=0;i{
s=(LinkNode*)malloc(sizeof(LinkNode));
//创建新结点s
s->data=a[i];
s->next=L->next;
//将结点s插在原开始结点之前,头结点之后
L->next=s;
}
}
voidCreateListR(LinkNode*&L,ElemTypea[],intn)
//尾插法建立单链表
{
LinkNode*s,*r;
L=(LinkNode*)malloc(sizeof(LinkNode));
//创建头结点
L->next=NULL;
r=L;
//r始终指向尾结点,开始时指向头结点
for(inti=0;i{
s=(LinkNode*)malloc(sizeof(LinkNode));
//创建新结点s
s->data=a[i];
r->next=s;
//将结点s插入r结点之后
r=s;
}
r->next=NULL;
//尾结点next域置为NULL
}
实验截图
(1)
voidInitList(LinkNode*&L)
//初始化线性表
{
L=(LinkNode*)malloc(sizeof(LinkNode));
//创建头结点
L->next=NULL;
//单链表置为空表
}
voidDestroyList(LinkNode*&L)
//销毁线性表
{
LinkNode*pre=L,*p=pre->next;
while(p!
=NULL)
{free(pre);
pre=p;
//pre、p同步后移一个结点
p=pre->next;
}
free(pre);
//此时p为NULL,pre指向尾结点,释放它
}
boolListEmpty(LinkNode*L)
//判线性表是否为空表
{
return(L->next==NULL);
}
intListLength(LinkNode*L)
//求线性表的长度
{inti=0;
LinkNode*p=L;
//p指向头结点,n置为0(即头结点的序号为0)
while(p->next!
=NULL)
{i++;
p=p->next;
}
return(i);
//循环结束,p指向尾结点,其序号i为结点个数
}
voidDispList(LinkNode*L)
//输出线性表
{LinkNode*p=L->next;//p指向首结点
while(p!
=NULL)//p不为NULL,输出p结点的data域
{printf("%c",p->data);
p=p->next;//p移向下一个结点
}
printf("\n");
}
实验截图
(2)
boolGetElem(LinkNode*L,inti,ElemType&e)
//求线性表中第i个元素值
{intj=0;
if(i<=0)returnfalse;
//i错误返回假
LinkNode*p=L;
//p指向头结点,j置为0(即头结点的序号为0)
while(j
=NULL)
//找第i个结点p
{j++;
p=p->next;
}
if(p==NULL)
//不存在第i个数据结点,返回false
returnfalse;
else
//存在第i个数据结点,返回true
{e=p->data;
returntrue;
}
}
intLocateElem(LinkNode*L,ElemTypee)
//查找第一个值域为e的元素序号
{inti=1;
LinkNode*p=L->next;
//p指向首结点,i置为1(即首结点的序号为1)
while(p!
=NULL&&p->data!
=e)
//查找data值为e的结点,其序号为i
{p=p->next;
i++;
}
if(p==NULL)
//不存在值为e的结点,返回0
return(0);
else
//存在值为e的结点,返回其逻辑序号i
return(i);
}
实验截图(3)
boolListInsert(LinkNode*&L,inti,ElemTypee)
//插入第i个元素
{intj=0;
if(i<=0)returnfalse;
//i错误返回假
LinkNode*p=L,*s;
//p指向头结点,j置为0(即头结点的序号为0)
while(j=NULL)
//查找第i-1个结点p
{j++;
p=p->next;
}
if(p==NULL)
//未找到第i-1个结点,返回false
returnfalse;
else
//找到第i-1个结点p,插入新结点并返回true
{s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=e;
//创建新结点s,其data域置为e
s->next=p->next;
//将结点s插入到结点p之后
p->next=s;
returntrue;
}
}
boolListDelete(LinkNode*&L,inti,ElemType&e)
//删除第i个元素
{intj=0;
if(i<=0)returnfalse;
//i错误返回假
LinkNode*p=L,*q;
//p指向头结点,j置为0(即头结点的序号为0)
while(j=NULL)
//查找第i-1个结点
{j++;
p=p->next;
}
if(p==NULL)
//未找到第i-1个结点,返回false
returnfalse;
else
//找到第i-1个结点p
{q=p->next;
//q指向第i个结点
if(q==NULL)
//若不存在第i个结点,返回false
returnfalse;
e=q->data;
p->next=q->next;
//从单链表中删除q结点
free(q);
//释放q结点
returntrue;
//返回true表示成功删除第i个结点
}
}
实验截图(4)
编写exp2-2.cpp程序包含有关代码
//文件名:
exp2-2.cpp
#include"linklist.cpp"
intmain()
{
LinkNode*h;
ElemTypee;
printf("单链表的基本运算如下:
\n");
printf("
(1)初始化单链表h\n");
InitList(h);
printf("
(2)依次采用尾插法插入a,b,c,d,e元素\n");
ListInsert(h,1,'a');
ListInsert(h,2,'b');
ListInsert(h,3,'c');
ListInsert(h,4,'d');
ListInsert(h,5,'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);
return1;
}
实验截图(5)
运行得到结果
实验截图(6)
五.实验总结
通过这次实验,我的收获如下:
1.进行编程时,要在感到模糊的地方进行备注,方便在报错的时候进行修改。
2.要保持linklist.cpp程序中的函数名与exp2-2.cpp程序中的函数名完全一致,特别是大小写部分要特别注意。
3.领会到了单链表存储的大体结构
4.了解了在单链表中各种基本运算算法设计