数据结构线性表实验.docx

上传人:b****6 文档编号:5253733 上传时间:2022-12-14 格式:DOCX 页数:26 大小:223.57KB
下载 相关 举报
数据结构线性表实验.docx_第1页
第1页 / 共26页
数据结构线性表实验.docx_第2页
第2页 / 共26页
数据结构线性表实验.docx_第3页
第3页 / 共26页
数据结构线性表实验.docx_第4页
第4页 / 共26页
数据结构线性表实验.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

数据结构线性表实验.docx

《数据结构线性表实验.docx》由会员分享,可在线阅读,更多相关《数据结构线性表实验.docx(26页珍藏版)》请在冰豆网上搜索。

数据结构线性表实验.docx

数据结构线性表实验

线性表的实验

一、实验目的

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;i

cout<

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;k

if(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<<"链表的长度为:

"<

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1