单链表的基本运算.docx
《单链表的基本运算.docx》由会员分享,可在线阅读,更多相关《单链表的基本运算.docx(13页珍藏版)》请在冰豆网上搜索。
单链表的基本运算
实
验
报
告
课程数据结构教程
班级
学号
姓名
实验项目数1
2014年04月
说明:
1.实验预习:
通过实验预习,明确实验目的要求、实验原理及相关知识点、实验方法、步骤以及操作注意事项等;对设计性实验要事先设计实验方案;根据需要合理设计实验数据记录表格。
2.实验过程:
实际采用的实验方法、步骤、操作过程或实验设计方案(设计型实验)的描述。
对于实验结果的表述一般有以下两种方法,在撰写实验报告时,可任选其中一种或两种方法并用,以获得最佳效果。
(1)文字表述:
根据实验目的将原始资料系统化、条理化,用准确的专业语言客观地描述实验现象和结果,要体现时间顺序以及各项指标在时间上的关系。
(2)图表或图形表示:
利用表格、坐标图、绘画或利用记录仪器描绘出的曲线图,使实验结果突出、清晰、形象、直观。
3.数据分析、实验结论
(1)根据相关的理论知识对所得到的实验结果进行解释和分析,包括实验成功或失败的原因。
(2)不能因实验结果与预期的结果或理论不符而随意取舍甚至修改实验原始数据和伪造实验结果。
如果实验失败,应找出原因及今后应注意的事项。
4.任课老师可结合学科和专业课程特点,对实验报告内容作科学合理的调整。
5.学生在课程结束后将本门课程所有实验报告装订成册,任课教师负责收齐交实验室存档
实验一(实验项目序号)
数据结构教程课程实验报告实验地点:
2-504
实验
名称
单链表的基本运算
指导教师
实验时间
2014-4-17
姓名
学号
成绩
一、实验、训练目的
1.了解单链表基本运算的实现;
2.进一步掌握链表使用的步骤;
3.牢固掌握建立单链表算法,特别是尾插法建表算法,是很多其他复杂复杂的基础;
二、实验预习(含实验原理及设计过程等)
单链表的基本运算,包括:
插入结点运算,删除结点运算,建立单链表,线形表基本运算实现
设计过程:
编写一个程序algo2-2.cpp实现单链表的各种与运算,在此基础上设计一个主程序exp2-2.cpp完成功能。
三、实验、训练内容
编写一个程序algo2-2.cpp.实现单链表的各种基本运算,并在此基础上设计一个主程序完成如下功能:
1.初始化顺序表h;
2.依次采用尾插法插入a,b,c,d,e元素;
3.输出单链表h;
4.输出单链表h长度;
5.判断单链表h是否为空;
6.输出单链表h的第3个元素;
7.输出元素’a’的位置;
8.在第4个元素位置上插入“f”元素;
9.输出单链表h;
10.删除单链表h的第3个元素;
11.输出单链表h;
12.释放单链表h。
四、实验、训练过程(含实验步骤、测试数据、实验结果等)
启动visualc++6.0,建立一个工作区名为proj2-2files,建立一个工作空间名为sourcefiles,建立一个文件名为algo2-2.cpp编写程序,在此基础上建立一个主程序exp2-2.cpp。
5、数据分析、实验结论与讨论
源代码
#include
#include
#defineboolint
#defineTRUE1
#defineFALSE0//后面有分号
typedefcharElemType;//后面有分号
//*****LinkList类型定义*****//
typedefstructLNode
{
ElemTypedata;
structLNode*next;
}LinkList,*PLinkList;
//*****基本运算*****//
/*
(1)初始化线性表InitList(L)
**
**分配内存创建头节点,指针域设为空
**
*/
/*voidInitList(LinkList*L)
{
L=(LinkList*)malloc(sizeof(LinkList));
L->next=NULL;
}*/
voidInitList(LinkList**L)//初始化线性表
{
(*L)=(LinkList*)malloc(sizeof(LinkList));//创建头结点
(*L)->next=NULL;
}
/*
(2)销毁线性表DestroyList(L)
**
**释放单链表L占用的空间,即逐一释放全部节点的空间
**
*/
voidDestroyList(LinkList*L)
{
LinkList*pre=L,*p=L->next;//pre指向*p的前驱节点
while(p!
=NULL)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
/*(3)判断线性表是否为空表ListEmpty(L)
**
**布尔型,即判断头节点的指针域时候为空
**
*/
boolListEmpty(LinkList*L)
{
return(L->next==NULL);
}
/*(4)求线性表的长度ListLength(L)
**
**int型,遍历并累加计算
**
*/
intListLength(LinkList*L)
{
intlength=0;
LinkList*p=L;//p指向头节点,count=0(头节点的序号为)
while(p->next!
=NULL)
{
length++;
p=p->next;
}
return(length);
}
/*(5)输出线性表DispList(L)
**
**逐一扫描,输出数据域
**
*/
voidDispList(LinkList*L)//输出线性表
{
LinkList*p=L->next;
while(p!
=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
/*(6)求线性表中某个数据元素的值GetElem(L,i,e)
**
**bool型,第i个节点,其值赋给e
**
*/
boolGetElem(LinkList*L,inti,ElemType*e)
{
intj=0;
LinkList*p=L;
while(j
=NULL)//用j来遍历,当j=i时,数据域的值,即为所求
{//p!
=NULL用来判断是否为空表求值或i超过链表长度
j++;
p=p->next;
}
if(p==NULL)
{
returnFALSE;
}
else
{
printf("");
(*e)=p->data;
returnTRUE;
}
}
/*(7)按元素值查找LocateList(L,e)
**
**int型,第个值域与e相等的节点,找到返回逻辑序号(1,2,3...),否则返回
**
*/
intLocateList(LinkList*L,ElemTypee)
{
inti=1;
LinkList*p=L->next;
while(p!
=NULL&&p->data!
=e)//先判断是否已经到链表末尾
{
p=p->next;
i++;
}
if(p==NULL)
{
return(0);
}
else
return(i);
}
/*(8)插入数据元素ListInsert(L,i,e)
**
**bool型,在第i-1个节点后面插入数据域为e的节点,使其成为第i个节点
**P.S.在单链表中,插入一个节点必须先找到插入改节点的前驱节点
*/
boolListInsert(LinkList*L,inti,ElemTypee)
{
intj=0;
LinkList*p,*s;
//printf("666\n");
//L=(LinkList*)malloc(sizeof(LinkList));
//L->next=NULL;
p=L;
while(j=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
{
returnFALSE;
}
else
{
s=(LinkList*)malloc(sizeof(LinkList));
s->data=e;
s->next=p->next;//到这里错了
p->next=s;
returnTRUE;
}
}
/*(9)删除数据元素ListDelete(L,i,e)
**
**bool型,.............................
**
*/
boolListDelete(LinkList*L,inti,ElemTypee)
{
intj=0;
LinkList*p=L,*q;
while(j=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
{
returnFALSE;
}
else
{
q=p->next;
if(q==NULL)
{
returnFALSE;
}
e=q->data;
p->next=q->next;
free(q);
returnTRUE;
}
}
#include
#include
#defineboolint
#defineTRUE1
#defineFALSE0//后面有分号
typedefcharElemType;//后面有分号
//*****LinkList类型定义*****//
typedefstructLNode
{
ElemTypedata;
structLNode*next;
}LinkList;
//*****函数声明*****//
//externvoidInitList(LinkList*L);
//externvoidDestroyList(LinkList*L);
//externboolListEmpty(LinkList*L);
//externintListLength(LinkList*L);
//externvoidDIspList(LinkList*L);
//externboolGetElem(LinkList*L,ElemTypei,ElemType*e);
//externintLocateList(LinkList*L,ElemTypee);
//externboolListInsert(LinkList*L,inti,ElemTypee);
//externboolListDelete(LinkList*L,inti,ElemTypee);
voidmain()
{
inti1,i2,i3,i4,i5;
LinkList*h;
ElemTypee;
printf("单链表的基本运算如下:
\n");
printf("
(1)初始化单链表h\n");
InitList(&h);
printf("%s",h->next);
printf("
(2)依次采用尾插法插入a,b,c,d,e元素\n");
/*
i1=ListInsert(h,1,'a');
printf("%d\n",i1);
printf("%c\n",h->data);//无法用指针p检验第一个节点的数据域,因为执行完i1语句后,p已经指向下一个节点了
i2=ListInsert(h,2,'b');
i3=ListInsert(h,3,'c');
i4=ListInsert(h,4,'d');
i5=ListInsert(h,5,'e');
printf("%d%d%d%d%d",i1,i2,i3,i4,i5);
*/
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,5,&e);
printf("(6)单链表h的第个元素=%c\n",e);
printf("(7)元素a的位置=%d\n",LocateList(h,'a'));
printf("(8)在第的元素位置上插入f元素\n");
ListInsert(h,4,'f');
printf("(9)输出单链表h:
");
DispList(h);
printf("(10)删除h的第个元素\n");
ListDelete(h,3,e);
printf("(11)输出单链表h:
");
DispList(h);
printf("(12)释放单链表h\n");
DestroyList(h);
}
执行结果:
六、心得体会
通过此次实验,让我懂得了单链表的基本运算,它包括插入结点运算,删除结点运算,建立单链表,线形表基本运算,也知道了尾插法的基本方法。
七、教师评语
教师签名: