数据结构线性表实验Word格式文档下载.docx
- 文档编号:18233204
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:26
- 大小:223.57KB
数据结构线性表实验Word格式文档下载.docx
《数据结构线性表实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构线性表实验Word格式文档下载.docx(26页珍藏版)》请在冰豆网上搜索。
#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;
StatusListPrint_Sq(Sqlist&
for(inti=0;
i<
L.length;
i++)
cout<
<
L.elem[i]<
"
"
;
endl;
StatusListLength_Sq(Sqlist&
L.length<
BooleanListEmpty_Sq(Sqlist&
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];
StatusGetElemIndex_Sq(Sqlist&
for(intk=0;
k<
k++)
if(L.elem[k]==e)
returnk+1;
StatusListInsert_Sq(Sqlist&
L,inti,ElemTypee)
if(L.length>
=L.listsize)
{
ElemType*newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
newbase)exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
(L.elem[i-1]);
for(ElemType*p=&
(L.elem[L.length-1]);
p>
=q;
p--)
*(p+1)=*p;
StatusListDelete_Sq(Sqlist&
L.length)
ElemType*p=&
e=*p;
ElemType*q=L.elem+L.length-1;
for(++p;
p<
++p)
*(p-1)=*p;
--L.length;
voidPrintMenu()
*********************欢迎使用*********************"
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的第5个元素."
0.退出."
**************************************************"
intmain()
SqlistL;
ElemTypee;
PrintMenu();
while
(1)
选择需要执行的功能:
charnumber;
cin>
>
number;
switch(number)
case'
1'
:
InitList_Sq(L);
顺序表L初始化成功."
break;
2'
ListRearInsert_Sq(L,12);
ListRearInsert_Sq(L,-21);
ListRearInsert_Sq(L,13);
ListRearInsert_Sq(L,4);
ListRearInsert_Sq(L,8);
插入成功."
3'
顺序表中的元素为:
ListPrint_Sq(L);
4'
线性表的长度为:
ListLength_Sq(L);
5'
if(ListEmpty_Sq(L))
顺序表为空."
顺序表不为空."
6'
顺序表L的第4个元素为:
GetElem_Sq(L,4,e);
e<
7'
元素\"
-21\"
的位置为:
GetElemIndex_Sq(L,-21)<
8'
ListInsert_Sq(L,4,0);
此时顺序表中的元素为:
9'
ListDelete_Sq(L,5,e);
删除成功,被删除的元素为:
0'
\t\t\t\t感谢使用!
\t\t\t\t\tDesignedBy-->
斌斌^_^"
exit(0);
default:
功能选择有误,请重新选择."
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:
head2.h:
//结点定义
structLNode
ElemTypedata;
LNode*next;
};
typedefLNode*LinkList;
//另一种定义LinkList的方法
#defineElemTypeint
#include"
head2.h"
//几个常用的函数
Statusequal(ElemTypec1,ElemTypec2)
{//判断是否相等的函数
if(c1==c2)
returnTRUE;
returnFALSE;
intcomp(ElemTypea,ElemTypeb)
{//根据a<
、=或>
b,分别返回-1、0或1
if(a==b)
return(a-b)/abs(a-b);
voidprint(ElemTypec)
printf("
%d"
c);
voidprint2(ElemTypec)
%c"
voidprint1(ElemType&
c)
voidPrintMenu()
****************************************"
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的第5个元素."
//带有头结点的单链表(存储结构由c2-2.h定义)的基本操作(12个),包括算法2.8,2.9,2.10
voidInitList(LinkList&
{//操作结果:
构造一个空的线性表L
L=(LinkList)malloc(sizeof(LNode));
//产生头结点,并使L指向此头结点
L)//存储分配失败
exit(OVERFLOW);
L->
next=NULL;
//指针域为空
voidDestroyList(LinkList&
{//初始条件:
线性表L已存在。
操作结果:
销毁线性表L
LinkListq;
while(L)
q=L->
next;
free(L);
L=q;
voidClearList(LinkListL)//不改变L
将L重置为空表
LinkListp,q;
p=L->
//p指向第一个结点
while(p)//没到表尾
q=p->
free(p);
p=q;
//头结点指针域为空
StatusListEmpty(LinkListL)
若L为空表,则返回TRUE,否则返回FALSE
if(L->
next)//非空
intListLength(LinkList&
返回L中数据元素个数
inti=0;
LinkListp=L->
i++;
p=p->
returni;
StatusGetElem(LinkListL,inti,ElemType&
e)//算法2.8
{//L为带头结点的单链表的头指针。
当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
intj=1;
//j为计数器
while(p&
&
j<
i)//顺指针向后查找,直到p指向第i个元素或p为空
j++;
p||j>
i)//第i个元素不存在
e=p->
data;
//取第i个元素
intLocateElem(LinkListL,ElemTypee,Status(*compare)(ElemType,ElemType))
{//初始条件:
线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
//操作结果:
返回L中第1个与e满足关系compare()的数据元素的位序。
//若这样的数据元素不存在,则返回值为0
while(p)
if(compare(p->
data,e)==0)//找到这样的数据元素
StatusPriorElem(LinkListL,ElemTypecur_e,ElemType&
pre_e)
线性表L已存在
若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,
//返回OK;
否则操作失败,pre_e无定义,返回INFEASIBLE
LinkListq,p=L->
while(p->
next)//p所指结点有后继
//q为p的后继
if(q->
data==cur_e)
pre_e=p->
//p向后移
returnINFEASIBLE;
StatusNextElem(LinkListL,ElemTypecur_e,ElemType&
next_e)
线性表L已存在
//操作结果:
若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,
//返回OK;
否则操作失败,next_e无定义,返回INFEASIBLE
while(p)//查找结点cur_e
if(p->
//找到就跳出循环
if(p&
p->
next){
next_e=p->
next->
StatusListHeadInsert(LinkList&
h,ElemTypee)
{//头插法向链表中插入元素
LinkListp,q=h;
p=(LinkList)malloc(sizeof(LNode));
p->
data=e;
next=q->
q->
next=p;
StatusListInsert(LinkList&
L,inti,ElemTypee)//算法2.9。
不改变L
{//在带头结点的单链线性表L中第i个位置之前插入元素e
intj=0;
LinkListp=L,s;
i-1)//寻找第i-1个结点
i-1)//i小于1或者大于表长
s=(LinkList)malloc(sizeof(LNode));
//生成新结点
s->
//插入L中
next=p->
next=s;
StatusListDelete(LinkListL,inti,ElemType&
e)//算法2.10。
{//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
LinkListp=L,q;
next&
i-1)//寻找第i个结点,并令p指向其前驱
next||j>
i-1)//删除位置不合理
//删除并释放结点
e=q->
free(q);
voidPrintList(LinkList&
h)
LinkListL=h->
链表中的元素为:
next)
L->
data<
->
L=L->
voidListTraverse(LinkListL,void(*vi)(ElemType))
//vi的形参类型为ElemType,与bo2-1.cpp中相应函数的形参类型ElemType&
不同
依次对L的每个数据元素调用函数vi()
vi(p->
data);
\n"
);
LinkListh;
chari;
\n功能选择:
i;
switch(i)
InitList(h);
创建成功."
ListHeadInsert(h,-11);
ListHeadInsert(h,1);
ListHeadInsert(h,3);
ListHeadInsert(h,24);
ListHeadInsert(h,18);
PrintList(h);
链表的长度为:
ListLength(h)<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 线性 实验