数据结构实验报告.docx
- 文档编号:12629721
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:22
- 大小:212.12KB
数据结构实验报告.docx
《数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
数据结构实验报告
1.已知线性表LA的数据元素(n个),现要求将元素x插入到第i个元素之后,形成新的线性表(a1a2,ai,x,…,an)。
调试结果:
源代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*函数结果状态代码*/
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
/*#defineOVERFLOW-2因为在math.h中已定义OVERFLOW的值为3,故去掉此行*/
typedefintStatus;/*Status是函数的类型,其值是函数结果状态代码,如OK等*/
typedefintBoolean;/*Boolean是布尔类型,其值是TRUE或FALSE*//*以上部分为万能开头*/
typedefintElemType;
#defineLIST_INIT_SIZE10/*线性表存储空间的初始分配量*/
#defineLISTINCREMENT2/*线性表存储空间的分配增量*/
//typedefintElemType;
typedefstruct
{
ElemType*elem;/*存储空间基址*/
intlength;/*当前长度*/
intlistsize;/*当前分配的存储容量(以sizeof(ElemType)为单位)*/
}SqList;
StatusInitList(SqList&L)/*算法2.3*/
{/*操作结果:
构造一个空的顺序线性表*/
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L.elem)
exit(OVERFLOW);/*存储分配失败*/
L.length=0;/*空表长度为0*/
L.listsize=LIST_INIT_SIZE;/*初始存储容量*/
returnOK;
}
StatusListInsert(SqList&L,inti,ElemTypee)/*算法2.4*/
{/*初始条件:
顺序线性表L已存在,1≤i≤ListLength(L)+1*/
/*操作结果:
在L中第i个位置之前插入新的数据元素e,L的长度加1*/
ElemType*newbase,*q,*p;
if(i<1||i>L.length+1)/*i值不合法*/
returnERROR;
if(L.length>=L.listsize)/*当前存储空间已满,增加分配*/
{
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!
newbase)
exit(OVERFLOW);/*存储分配失败*/
L.elem=newbase;/*新基址*/
L.listsize+=LISTINCREMENT;/*增加存储容量*/
}
q=L.elem+i-1;/*q为插入位置*/
for(p=L.elem+L.length-1;p>=q;--p)/*插入位置及之后的元素右移*/
*(p+1)=*p;
*q=e;/*插入e*/
++L.length;/*表长增1*/
returnOK;
}
StatusInsert(SqList&L,inti,ElemTypee)/*算法2.4*/
{/*初始条件:
顺序线性表L已存在,1≤i≤ListLength(L)+1*/
/*操作结果:
在L中第i个位置之前插入新的数据元素e,L的长度加1*/
ElemType*newbase,*q,*p;
if(i<1||i>L.length+1)/*i值不合法*/
returnERROR;
if(L.length>=L.listsize)/*当前存储空间已满,增加分配*/
{
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!
newbase)
exit(OVERFLOW);/*存储分配失败*/
L.elem=newbase;/*新基址*/
L.listsize+=LISTINCREMENT;/*增加存储容量*/
}
q=L.elem+i;/*q为插入位置*/
for(p=L.elem+L.length-1;p>=q;--p)/*插入位置及之后的元素右移*/
*(p+1)=*p;
*q=e;/*插入e*/
++L.length;/*表长增1*/
returnOK;
}
StatusListDelete(SqList&L,inti,ElemType&e)/*算法2.5*/
{/*初始条件:
顺序线性表L已存在,1≤i≤ListLength(L)*/
/*操作结果:
删除L的第i个数据元素,并用e返回其值,L的长度减1*/
ElemType*p,*q;
if(i<1||i>L.length)/*i值不合法*/
returnERROR;
p=L.elem+i-1;/*p为被删除元素的位置*/
e=*p;/*被删除元素的值赋给e*/
q=L.elem+L.length-1;/*表尾元素的位置*/
for(++p;p<=q;++p)/*被删除元素之后的元素左移*/
*(p-1)=*p;
L.length--;/*表长减1*/
returnOK;
}
voidmain()
{
SqListL;
ElemTypee,e0;
Statusi;
intj,k,m,n;
i=InitList(L);
printf("初始化L后:
L.elem=%uL.length=%dL.listsize=%d\n",L.length,L.listsize);
for(j=1;j<=5;j++)
i=ListInsert(L,1,j);
printf("在L的表头依次插入1~5后:
L=");
for(j=1;j<=5;j++)
printf("%d",L.elem[j-1]);
printf("\n");
printf("L.length=%dL.listsize=%d\n",L.length,L.listsize);
printf("输入要插入的元素:
");
scanf("%d",&m);
printf("输入要插入的位置:
");
scanf("%d",&n);
Insert(L,n,m);
for(j=1;j<=6;j++)
printf("%d",L.elem[j-1]);
}
2.已知线性双向链表LA的数据元素(n个),现要求将元素x插入到第i个元素之后,形成新的线性表(a1,a2,ai,x,…,an)。
链表插入调试结果:
3.已知线性双向链表LA的数据元素(n个),现要求将元素ai删除,形成新的线性表(a1,a2,ai-1…,an)。
链表删除调试结果:
源代码:
(链表的插入、删除)
//2.cpp:
定义控制台应用程序的入口点。
//
#include
#include
#defineOK1
#defineERROR0
typedefstructDuLNode{
intdata;
structDuLNode*prior;
structDuLNode*next;
}DuLNode,*DuLinkList;
DuLinkListCreateList(intn);
intListInsert(DuLinkListL,inti,inte);
intListDelete(DuLinkListL,inti);
voidDisplay(DuLinkListL);
intmain()
{
intn;
inti,e;
intchoose=0;
DuLinkListL;
printf("\n*********程序开始前,先创建双链表************\n");
printf("请输入你要创建双链表结点数:
");
scanf("%d",&n);
L=CreateList(n);
printf("\n链表创建成功,输出如下:
\n");
Display(L);
while(choose!
=3)
{
choose=0;
printf("\n你可以对双链表进行的操作如下:
\n");
printf("1.插入\n2.删除\n3.退出\n");
while(choose!
=1&&choose!
=2&&choose!
=3)
{
printf("请输入1或2或3选择插入或删除或退出:
");
scanf("%d",&choose);
if(choose!
=1&&choose!
=2&&choose!
=3)printf("输入错误,请重新输入\n");
}
//printf("Checkchoose%d\n",choose);
if(choose==1)
{
while
(1)
{
printf("\n双链表插入前为:
\n");
Display(L);
printf("请输入要插入的数:
");
scanf("%d",&e);
printf("请输入要插入的位置:
");
scanf("%d",&i);
if(ListInsert(L,i,e)==1){printf("\n双链表插入后为:
\n");Display(L);break;}
elseprintf("输入的插入位置错误,请重试\n");
}
}
elseif(choose==2)
{
while
(1)
{
printf("\n双链表删除前为:
\n");
Display(L);
printf("请输入删除的结点的序号:
");
scanf("%d",&i);
if(ListDelete(L,i)==1){printf("\n双链表删除后为:
\n");Display(L);break;}
elseprintf("输入的结点序号错误,请重试\n");
}
}
elseif(choose==3)
{
printf("\n双链表最后为:
\n");
Display(L);
continue;
}
}
return0;
}
DuLinkListCreateList(intn)
{
inti,m;
DuLinkListL,p,s;
L=(DuLinkList)malloc(sizeof(DuLNode));
L->data=n;
L->prior=NULL;
L->next=NULL;
p=L;
for(i=1;i<=n;i++)
{
printf("请输入第%d个结点的值:
",i);
scanf("%d",&m);
s=(DuLinkList)malloc(sizeof(DuLNode));
s->data=m;
s->next=NULL;
s->prior=p;
p->next=s;
p=s;
}
returnL;
}
intListInsert(DuLinkListL,inti,inte)
{
intj=0;
DuLinkListp,s;
p=L;
while(p!
=NULL&&j
if(p==NULL||j>i-1){printf("插入位置错误");returnERROR;}
s=(DuLinkList)malloc(sizeof(DuLNode));
s->data=e;
s->next=p->next;
s->prior=p;
p->next=s;
s->next->prior=s;
L->data++;
returnOK;
}
intListDelete(DuLinkListL,inti)
{
intj=0;
DuLinkListp,temp;
p=L;
while(p!
=NULL&&j
if(p==NULL||j>i-1){printf("删除位置错误");returnERROR;}
temp=p->next;
p->next=p->next->next;
p->next->prior=p;
free(temp);
L->data--;
returnOK;
}
voidDisplay(DuLinkListL)
{
inti,n;
DuLinkListp;
n=L->data;
p=L->next;
printf("\n开始输出链表\n");
printf("链表共有%d个结点,下面是各个结点的值:
\n",n);
for(i=1;i<=n;i++)
{
printf("结点%d的值:
%d\n",i,p->data);
p=p->next;
}
printf("链表输出完毕\n\n");
}
4.试编写算法,在顺序存储结构下实现堆栈的运算。
(3)pushstk(s)。
如果栈s不满,在栈顶插入x;
(4)popstk(s)。
如果栈s不空,删除栈顶元素,并返回该元素的值;
调试结果:
源代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*函数结果状态代码*/
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
/*#defineOVERFLOW-2因为在math.h中已定义OVERFLOW的值为3,故去掉此行*/
typedefintStatus;/*Status是函数的类型,其值是函数结果状态代码,如OK等*/
typedefintBoolean;/*Boolean是布尔类型,其值是TRUE或FALSE*/
typedefintSElemType;/*定义栈元素类型为整型*/
#defineSTACK_INIT_SIZE10/*存储空间初始分配量*/
#defineSTACKINCREMENT2/*存储空间分配增量*/
typedefstructSqStack
{
SElemType*base;/*在栈构造之前和销毁之后,base的值为NULL*/
SElemType*top;/*栈顶指针*/
intstacksize;/*当前已分配的存储空间,以元素为单位*/
}SqStack;/*顺序栈*/
StatusInitStack(SqStack&S)
{/*构造一个空栈S*/
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
S.base)
exit(OVERFLOW);/*存储分配失败*/
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}
StatusDestroyStack(SqStack&S)
{/*销毁栈S,S不再存在*/
free(S.base);
S.base=NULL;
S.top=NULL;
S.stacksize=0;
returnOK;
}
StatusClearStack(SqStack&S)
{/*把S置为空栈*/
S.top=S.base;
returnOK;
}
StatusStackEmpty(SqStackS)
{/*若栈S为空栈,则返回TRUE,否则返回FALSE*/
if(S.top==S.base)
returnTRUE;
else
returnFALSE;
}
intStackLength(SqStackS)
{/*返回S的元素个数,即栈的长度*/
returnS.top-S.base;
}
StatusGetTop(SqStackS,SElemType&e)
{/*若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR*/
if(S.top>S.base)
{
e=*(S.top-1);
returnOK;
}
else
returnERROR;
}
StatusPush(SqStack&S,SElemTypee)
{/*插入元素e为新的栈顶元素*/
if(S.top-S.base>=S.stacksize)/*栈满,追加存储空间*/
{
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
S.base)
exit(OVERFLOW);/*存储分配失败*/
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*(S.top)++=e;
returnOK;
}
StatusPop(SqStack&S,SElemType&e)
{/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
if(S.top==S.base)
returnERROR;
e=*--S.top;
returnOK;
}
StatusStackTraverse(SqStackS,Status(*visit)(SElemType))
{/*从栈底到栈顶依次对栈中每个元素调用函数visit()。
*/
/*一旦visit()失败,则操作失败*/
while(S.top>S.base)
visit(*S.base++);
printf("\n");
returnOK;
}
voidrunprO()
{
SqStacks;
inti;
intn;/*非负整数*/
SElemTypee;
InitStack(s);/*初始化栈*/
for(i=1;i<=5;i++)
{
Push(s,i);
}
intw;
for(w=1;w<=5;w++)
{
printf("栈的元素为");
printf("%d",*(s.top-w));
printf("\n");
}
printf("输入的任意一个要插入的栈顶元素:
");
scanf("%d",&n);/*输入非负十进制整数n*/
Push(s,n);
for(w=1;w<=6;w++)
{
printf("栈的元素为");
printf("%d",*(s.top-w));
printf("\n");
}
printf("删除栈顶元素后,栈内含有元素\n");
Pop(s,e);/*弹出栈顶元素且赋值给e*/
for(w=1;w<=5;w++)
{
printf("栈的元素为");
printf("%d",*(s.top-w));
printf("\n");
}
}
voidmain()
{
runprO();/*栈的插入、删除*/
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告