数据结构线性表实验.docx
《数据结构线性表实验.docx》由会员分享,可在线阅读,更多相关《数据结构线性表实验.docx(26页珍藏版)》请在冰豆网上搜索。
![数据结构线性表实验.docx](https://file1.bdocx.com/fileroot1/2022-12/14/d339bde3-95cb-4084-9c94-7485d80995a9/d339bde3-95cb-4084-9c94-7485d80995a91.gif)
数据结构线性表实验
线性表的实验
一、实验目的
1.掌握用C/C++语言调试程序的基本方法。
2.掌握线性表的基本运算,如插入、删除等。
二、实验内容
1.1实现顺序表各种基本操作的算法
编写程序实现顺序表的各种基本运算,并在此基础上设计一个主程序完成如下功能:
(1)初始化顺序表L;
(2)依次在L尾部插入元素12,-21,13,4,8;
(3)输出顺序表L;
(4)输出顺序表L长度;
(5)判断顺序表L是否为空;
(6)输出顺序表L的第4个元素;
(7)输出元素-21的位置;
(8)在L的第4个元素前插入元素0;
(9)输出顺序表L;
(10)删除L的第5个元素;
(11)输出顺序表L。
源代码:
head.h:
#include
#include
#include//malloc()
#include//INT,MAX
#include//EOF,NULL
#include//atoi()
#include//eof()
#include//floor(),ceil(),abs()
#include//exit()
#include//cout,cin
//函数结果状态代码
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
//OVERFLOW在math.h中已定义为3
typedefintStatus;
typedefintBoolean;//布尔类型
main.cpp:
#include"head.h"
usingnamespacestd;
typedefintElemType;
#defineLIST_INIT_SIZE100
#defineLISTINCREMENT10
typedefstruct
{
ElemType*elem;
intlength;
intlistsize;
}Sqlist;
StatusInitList_Sq(Sqlist&L)
{//构造一个空的线性表L
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L.elem)exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
returnOK;
}
StatusListRearInsert_Sq(Sqlist&L,ElemTypee)
{
ElemType*q=&(L.elem[L.length]);
*q=e;
++L.length;
returnOK;
}
StatusListPrint_Sq(Sqlist&L)
{
for(inti=0;icout<cout<returnOK;
}
StatusListLength_Sq(Sqlist&L)
{
cout<returnOK;
}
BooleanListEmpty_Sq(Sqlist&L)
{
if(L.length==0)
returntrue;
else
returnfalse;
}
StatusGetElem_Sq(Sqlist&L,inti,ElemType&e)
{
if(i<1||i>L.length+1)
returnERROR;
e=L.elem[i-1];
returnOK;
}
StatusGetElemIndex_Sq(Sqlist&L,ElemTypee)
{
for(intk=0;kif(L.elem[k]==e)
returnk+1;
returnERROR;
}
StatusListInsert_Sq(Sqlist&L,inti,ElemTypee)
{
if(i<1||i>L.length+1)
returnERROR;
if(L.length>=L.listsize)
{
ElemType*newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!
newbase)exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
ElemType*q=&(L.elem[i-1]);
for(ElemType*p=&(L.elem[L.length-1]);p>=q;p--)
*(p+1)=*p;
*q=e;
++L.length;
returnOK;
}
StatusListDelete_Sq(Sqlist&L,inti,ElemType&e)
{
if(i<1||i>L.length)
returnERROR;
ElemType*p=&(L.elem[i-1]);
e=*p;
ElemType*q=L.elem+L.length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
--L.length;
returnOK;
}
voidPrintMenu()
{
cout<<"*********************欢迎使用*********************"<cout<<"1.初始化顺序表L."<cout<<"2.依次在顺序表L尾部插入元素(12,-21,13,4,8)."<cout<<"3.输出顺序表L."<cout<<"4.输出顺序表L的长度."<cout<<"5.判断顺序表L是否为空."<cout<<"6.输出顺序表L的第4个元素."<cout<<"7.输出元素-21的位置."<cout<<"8.在顺序表L的第4个元素前插入元素0."<cout<<"9.删除顺序表L的第5个元素."<cout<<"0.退出."<cout<<"**************************************************";
}
intmain()
{
SqlistL;
ElemTypee;
PrintMenu();
while
(1)
{
cout<cout<<"选择需要执行的功能:
";
charnumber;
cin>>number;
switch(number)
{
case'1':
InitList_Sq(L);
cout<<"顺序表L初始化成功."<break;
case'2':
ListRearInsert_Sq(L,12);
ListRearInsert_Sq(L,-21);
ListRearInsert_Sq(L,13);
ListRearInsert_Sq(L,4);
ListRearInsert_Sq(L,8);
cout<<"插入成功."<break;
case'3':
cout<<"顺序表中的元素为:
";
ListPrint_Sq(L);
break;
case'4':
cout<<"线性表的长度为:
";
ListLength_Sq(L);
break;
case'5':
if(ListEmpty_Sq(L))
cout<<"顺序表为空."<else
cout<<"顺序表不为空."<break;
case'6':
cout<<"顺序表L的第4个元素为:
";
GetElem_Sq(L,4,e);
cout<break;
case'7':
cout<<"元素\"-21\"的位置为:
"<break;
case'8':
ListInsert_Sq(L,4,0);
cout<<"插入成功."<cout<<"此时顺序表中的元素为:
";
ListPrint_Sq(L);
break;
case'9':
ListDelete_Sq(L,5,e);
cout<<"删除成功,被删除的元素为:
"<cout<<"此时顺序表中的元素为:
";
ListPrint_Sq(L);
break;
case'0':
cout<<"\t\t\t\t感谢使用!
"<cout<<"\t\t\t\t\tDesignedBy-->斌斌^_^"<exit(0);
default:
cout<<"功能选择有误,请重新选择."<}
}
return0;
}
运行结果:
1.2实现单链表各种基本操作的算法
编写程序实现单链表的各种基本运算,并在此基础上设计一个主程序完成如下功能:
(1)初始化单链表h;
(2)依次采用头插法插入元素-11,1,3,24,18;
(3)输出单链表h;
(4)输出单链表h长度;
(5)判断单链表h是否为空;
(6)输出单链表h的第5个元素;
(7)输出元素24的位置;
(8)在h的第3个元素前插入元素0;
(9)输出单链表h;
(10)删除h的第5个元素;
(11)输出单链表h。
源代码:
head.h:
#include
#include
#include//malloc()
#include//INT,MAX
#include//EOF,NULL
#include//atoi()
#include//eof()
#include//floor(),ceil(),abs()
#include//exit()
#include//cout,cin
usingnamespacestd;
//函数结果状态代码
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
//OVERFLOW在math.h中已定义为3
typedefintStatus;
typedefintBoolean;//布尔类型
head2.h:
//结点定义
structLNode
{
ElemTypedata;
LNode*next;
};
typedefLNode*LinkList;//另一种定义LinkList的方法
main.cpp:
#defineElemTypeint
#include"head.h"
#include"head2.h"
//几个常用的函数
Statusequal(ElemTypec1,ElemTypec2)
{//判断是否相等的函数
if(c1==c2)
returnTRUE;
else
returnFALSE;
}
intcomp(ElemTypea,ElemTypeb)
{//根据a<、=或>b,分别返回-1、0或1
if(a==b)
return0;
else
return(a-b)/abs(a-b);
}
voidprint(ElemTypec)
{
printf("%d",c);
}
voidprint2(ElemTypec)
{
printf("%c",c);
}
voidprint1(ElemType&c)
{
printf("%d",c);
}
voidPrintMenu()
{
cout<<"****************************************"<cout<<"1.初始化单链表h."<cout<<"2.依次采用头插法插入元素(-11,1,3,24,18)."<cout<<"3.输出单链表h."<cout<<"4.输出单链表h长度."<cout<<"5.判断单链表h是否为空."<cout<<"6.输出单链表h的第5个元素."<cout<<"7.输出元素24的位置."<cout<<"8.在h的第3个元素前插入元素0."<cout<<"9.删除h的第5个元素."<cout<<"0.退出."<cout<<"****************************************";
}
//带有头结点的单链表(存储结构由c2-2.h定义)的基本操作(12个),包括算法2.8,2.9,2.10
voidInitList(LinkList&L)
{//操作结果:
构造一个空的线性表L
L=(LinkList)malloc(sizeof(LNode));//产生头结点,并使L指向此头结点
if(!
L)//存储分配失败
exit(OVERFLOW);
L->next=NULL;//指针域为空
}
voidDestroyList(LinkList&L)
{//初始条件:
线性表L已存在。
操作结果:
销毁线性表L
LinkListq;
while(L)
{
q=L->next;
free(L);
L=q;
}
}
voidClearList(LinkListL)//不改变L
{//初始条件:
线性表L已存在。
操作结果:
将L重置为空表
LinkListp,q;
p=L->next;//p指向第一个结点
while(p)//没到表尾
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;//头结点指针域为空
}
StatusListEmpty(LinkListL)
{//初始条件:
线性表L已存在。
操作结果:
若L为空表,则返回TRUE,否则返回FALSE
if(L->next)//非空
returnFALSE;
else
returnTRUE;
}
intListLength(LinkList&L)
{//初始条件:
线性表L已存在。
操作结果:
返回L中数据元素个数
inti=0;
LinkListp=L->next;//p指向第一个结点
while(p)//没到表尾
{
i++;
p=p->next;
}
returni;
}
StatusGetElem(LinkListL,inti,ElemType&e)//算法2.8
{//L为带头结点的单链表的头指针。
当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
intj=1;//j为计数器
LinkListp=L->next;//p指向第一个结点
while(p&&j
{
p=p->next;
j++;
}
if(!
p||j>i)//第i个元素不存在
returnERROR;
e=p->data;//取第i个元素
returnOK;
}
intLocateElem(LinkListL,ElemTypee,Status(*compare)(ElemType,ElemType))
{//初始条件:
线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
//操作结果:
返回L中第1个与e满足关系compare()的数据元素的位序。
//若这样的数据元素不存在,则返回值为0
inti=0;
LinkListp=L->next;
while(p)
{
i++;
if(compare(p->data,e)==0)//找到这样的数据元素
returni;
p=p->next;
}
return0;
}
StatusPriorElem(LinkListL,ElemTypecur_e,ElemType&pre_e)
{//初始条件:
线性表L已存在
//操作结果:
若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,
//返回OK;否则操作失败,pre_e无定义,返回INFEASIBLE
LinkListq,p=L->next;//p指向第一个结点
while(p->next)//p所指结点有后继
{
q=p->next;//q为p的后继
if(q->data==cur_e)
{
pre_e=p->data;
returnOK;
}
p=q;//p向后移
}
returnINFEASIBLE;
}
StatusNextElem(LinkListL,ElemTypecur_e,ElemType&next_e)
{//初始条件:
线性表L已存在
//操作结果:
若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,
//返回OK;否则操作失败,next_e无定义,返回INFEASIBLE
LinkListp=L->next;//p指向第一个结点
while(p)//查找结点cur_e
{
if(p->data==cur_e)
break;//找到就跳出循环
p=p->next;
}
if(p&&p->next){
next_e=p->next->data;
returnOK;
}
returnINFEASIBLE;
}
StatusListHeadInsert(LinkList&h,ElemTypee)
{//头插法向链表中插入元素
LinkListp,q=h;
p=(LinkList)malloc(sizeof(LNode));
p->data=e;
p->next=q->next;
q->next=p;
returnOK;
}
StatusListInsert(LinkList&L,inti,ElemTypee)//算法2.9。
不改变L
{//在带头结点的单链线性表L中第i个位置之前插入元素e
intj=0;
LinkListp=L,s;
while(p&&j{
p=p->next;
j++;
}
if(!
p||j>i-1)//i小于1或者大于表长
returnERROR;
s=(LinkList)malloc(sizeof(LNode));//生成新结点
s->data=e;//插入L中
s->next=p->next;
p->next=s;
returnOK;
}
StatusListDelete(LinkListL,inti,ElemType&e)//算法2.10。
不改变L
{//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
intj=0;
LinkListp=L,q;
while(p->next&&j{
p=p->next;
j++;
}
if(!
p->next||j>i-1)//删除位置不合理
returnERROR;
q=p->next;//删除并释放结点
p->next=q->next;
e=q->data;
free(q);
returnOK;
}
voidPrintList(LinkList&h)
{
LinkListL=h->next;
cout<<"链表中的元素为:
";
while(L)
{
if(L->next)
cout<data<<"->";
else
cout<data;
L=L->next;
}
cout<}
voidListTraverse(LinkListL,void(*vi)(ElemType))
//vi的形参类型为ElemType,与bo2-1.cpp中相应函数的形参类型ElemType&不同
{//初始条件:
线性表L已存在。
操作结果:
依次对L的每个数据元素调用函数vi()
LinkListp=L->next;
while(p)
{
vi(p->data);
p=p->next;
}
printf("\n");
}
intmain()
{
PrintMenu();
LinkListh;
chari;
ElemTypee;
while
(1)
{
cout<<"\n功能选择:
";
cin>>i;
switch(i)
{
case'1':
InitList(h);
cout<<"创建成功."<break;
case'2':
ListHeadInsert(h,-11);
ListHeadInsert(h,1);
ListHeadInsert(h,3);
ListHeadInsert(h,24);
ListHeadInsert(h,18);
cout<<"插入成功."<break;
case'3':
PrintList(h);
break;
case'4':
cout<<"链表的长度为:
"<