数据结构线性表设计代码.docx

上传人:b****4 文档编号:5575576 上传时间:2023-05-08 格式:DOCX 页数:22 大小:163.07KB
下载 相关 举报
数据结构线性表设计代码.docx_第1页
第1页 / 共22页
数据结构线性表设计代码.docx_第2页
第2页 / 共22页
数据结构线性表设计代码.docx_第3页
第3页 / 共22页
数据结构线性表设计代码.docx_第4页
第4页 / 共22页
数据结构线性表设计代码.docx_第5页
第5页 / 共22页
数据结构线性表设计代码.docx_第6页
第6页 / 共22页
数据结构线性表设计代码.docx_第7页
第7页 / 共22页
数据结构线性表设计代码.docx_第8页
第8页 / 共22页
数据结构线性表设计代码.docx_第9页
第9页 / 共22页
数据结构线性表设计代码.docx_第10页
第10页 / 共22页
数据结构线性表设计代码.docx_第11页
第11页 / 共22页
数据结构线性表设计代码.docx_第12页
第12页 / 共22页
数据结构线性表设计代码.docx_第13页
第13页 / 共22页
数据结构线性表设计代码.docx_第14页
第14页 / 共22页
数据结构线性表设计代码.docx_第15页
第15页 / 共22页
数据结构线性表设计代码.docx_第16页
第16页 / 共22页
数据结构线性表设计代码.docx_第17页
第17页 / 共22页
数据结构线性表设计代码.docx_第18页
第18页 / 共22页
数据结构线性表设计代码.docx_第19页
第19页 / 共22页
数据结构线性表设计代码.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数据结构线性表设计代码.docx

《数据结构线性表设计代码.docx》由会员分享,可在线阅读,更多相关《数据结构线性表设计代码.docx(22页珍藏版)》请在冰点文库上搜索。

数据结构线性表设计代码.docx

数据结构线性表设计代码

河南城建学院计算机科学与工程学院

《数据结构》实验报告

实验名称:

_实验一 线性表操作   成绩:

___________

专业班级:

_信管2班_  姓名:

__张凯迪__学号:

___083215217___

实验日期:

  2016年  4月  27日 

一、实验目的

1.掌握用C++/C语言调试程序的基本方法。

2.掌握线性表的基本运算,如插入、删除等。

二、实验内容

线性表在顺序、链式存储结构上的插入元素,删除元素运算。

三、实验要求

1.用C++/C完成算法设计和程序设计并上机调试通过。

2.撰写实验报告,提供实验结果和数据。

3.分析算法,并简要给出算法设计小结和心得。

四、程序实现

源程序清单

五、写出输入数据及运行结果、算法分析

上述程序在VisualC++6.0环境下加以实现。

经过多次测试,程序运行正确。

例如:

输入…,运行结果如图…所示,图中显示了…

(一)顺序表的基本操作源代码

#include

usingnamespacestd;

#defineTRUE1

#defineFALSE0

#defineOK1

#defineERROR0

#defineOVERFLOW-2

typedefintStatus;

typedefintElemType;

#defineLIST_INIT_SIZE100

#defineLISTINCREMENT10

typedefstruct{//结构体

ElemType*elem;

intlength;

intlistsize;

}SqList;

SqListLx;

StatusInitList_Sq(SqList&L)//分配空间

{L.elem=newElemType[LIST_INIT_SIZE];

if(!

L.elem)exit(OVERFLOW);

L.length=0;

L.listsize=LIST_INIT_SIZE;

returnOK;

}

StatusListInsert(SqList&L,inti,ElemTypee)//插入新元素

{int*q,*p;ElemType*newbase;

if(i<1||i>L.length+1)returnERROR;

if(L.length>=L.listsize)

{newbase=newElemType[L.listsize+LISTINCREMENT];

if(!

newbase)exit(OVERFLOW);

L.elem=newbase;

L.listsize+=LISTINCREMENT;

}

q=&(L.elem[i-1]);

for(p=&(L.elem[L.length-1]);p>=q;--p)

*(p+1)=*p;

*q=e;

++L.length;

returnOK;

}

StatusListlength(SqListL)//长度

{int*p=L.elem;//判断线形表是否存在

while(p)

{return(L.length);}

}

StatusGetElem(SqListL,inti,ElemType&e)//取元素

{if(i<1||i>L.length)

returnERROR;

else

{e=L.elem[i-1];

returne;

}

}

voidMergeList(SqListLa,SqListLb,SqList&Lc)//合并

{ElemTypeai,bj;

InitList_Sq(Lc);

inti=1,j=1,k=0;

intLa_len,Lb_len;

La_len=Listlength(La);

Lb_len=Listlength(Lb);

while((i<=La_len)&&(j<=Lb_len))

{GetElem(La,i,ai);GetElem(Lb,j,bj);

if(ai<=bj)

{ListInsert(Lc,++k,ai);++i;}

else

{ListInsert(Lc,++k,bj);++j;}

}

while(i<=La_len)

{GetElem(La,i++,ai);

ListInsert(Lc,++k,ai);

}

while(j<=Lb_len)

{GetElem(Lb,j++,bj);

ListInsert(Lc,++k,bj);

}

}

voidshow(SqListL,inti)//显示

{intj;ElemTypek;

cout<<"顺序表显示如下:

"<

for(j=0;j

{k=L.elem[j];

cout<";}

if(j==i-1&&i>0)

{k=L.elem[j];cout<

cout<

}

voidcreate(SqList&L,intn)//输入元素

{inte;

for(inti=0;i

{cin>>e;

L.elem[i]=e;

L.length=i+1;}

}

StatusListDelete_Sq(SqList&L,inti,ElemType&e)//删除

{ElemType*p,*q;

if(i<1||i>L.length)returnERROR;

p=&(L.elem[i-1]);

e=*p;

q=L.elem+L.length-1;

for(++p;p<=q;++p)*(p-1)=*p;

--L.length;

returnOK;

}

StatusListxiugei(SqList&L,inti,ElemType&e)//修改

{if(i<1||i>L.length)

returnERROR;

else

{L.elem[i-1]=e;

returnOK;}

}

voidshuru(SqList&L1)//顺序表的创建

{inta;

InitList_Sq(L1);

cout<<"请输入顺序表的长度:

";

cin>>a;

cout<<"请输入顺序表的元素(共"<

create(L1,a);

show(L1,a);

}

voidchaxun(SqList&L1)//取第i个位置的元素

{intj;ElemTypee1;

cout<<"请选择所要取出元素的位置:

";

cin>>j;

while(j<0||j>Listlength(L1))

{cout<<"输入有误,请重新输入"<

cout<<"请选择所要取出元素的位置:

";

cin>>j;}

GetElem(L1,j,e1);

cout<<"取出的元素为:

"<

voidxiugai(SqList&L1)//修改第i个位置的元素

{inta;

intj;ElemTypee1;

a=L1.length;

cout<<"请选择所要修改元素的位置:

";

cin>>j;

while(j<0||j>Listlength(L1))

{cout<<"输入有误,请重新输入"<

cout<<"请选择所要修改元素的位置:

";

cin>>j;}

cout<<"要修改成的元素:

";

cin>>e1;

Listxiugei(L1,j,e1);

cout<<"修改后的顺序表数据:

"<

show(L1,a);

}

voidshanchu(SqList&L1)//删除顺序表里的元素

{inta;

intj;ElemTypee1;

a=L1.length;

cout<<"请选择所要删除元素的位置:

";

cin>>j;

while(j<0||j>Listlength(L1))

{cout<<"输入有误,请重新输入"<

cout<<"请选择所要删除元素的位置:

";

cin>>j;}

ListDelete_Sq(L1,j,e1);

cout<<"修改后的顺序表数据:

"<

show(L1,a-1);

}

voidcharu(SqList&L1)//插入元素到顺序表里

{inta;intj;ElemTypee1;

a=L1.length;

cout<<"请选择所要插入元素的位置:

";

cin>>j;

while(j<0||j>Listlength(L1))

{cout<<"输入有误,请重新输入"<

cout<<"请选择所要插入元素的位置:

";

cin>>j;}

cout<<"要插入的元素:

";

cin>>e1;

ListInsert(L1,j,e1);

cout<<"修改后的顺序表数据:

"<

show(L1,a+1);

}

voidhebing(SqList&L3)//合并两个顺序表

{SqListL1,L2;

inta,b;

InitList_Sq(L1);InitList_Sq(L2);

cout<<"请输入第一个有序表的长度:

";cin>>a;

cout<<"请输入第一个有序表的元素(共"<

create(L1,a);

show(L1,a);

cout<<"请输入第二个有序表的长度:

";cin>>b;

cout<<"请输入第二个有序表的元素(共"<

create(L2,b);

show(L2,b);

MergeList(L1,L2,L3);

cout<<"合并后的有序表如下:

";show(L3,a+b);

}

voidmain()//主菜单

{intchoice;

for(;;)

{cout<<"顺序表的基本操作"<

cout<<"1.顺序表的创建"<

cout<<"2.顺序表的显示"<

cout<<"3.顺序表的长度"<

cout<<"4.取第i个位置的元素"<

cout<<"5.修改第i个位置的元素"<

cout<<"6.插入元素到顺序表里"<

cout<<"7.删除顺序表里的元素"<

cout<<"8.合并两个顺序表"<

cout<<"9.退出系统"<

cout<<"请选择:

";

cin>>choice;

switch(choice)

{case1:

shuru(Lx);break;

case2:

show(Lx,Lx.length);break;

case3:

cout<<"顺序表的长度:

"<

case4:

chaxun(Lx);break;

case5:

xiugai(Lx);break;

case6:

charu(Lx);break;

case7:

shanchu(Lx);break;

case8:

hebing(Lx);break;

case9:

cout<<"退出系统!

"<

default:

cout<<"输入有误,请重新选择"<

}

}

运行结果、

顺序表得创建显示如下图2-1

 

顺序表的插入如下2-2

顺序表的删除如下2-3

(二)链式表的基本操作源代码

#include

usingnamespacestd;

#definetrue1

#definefalse0

#defineok1

#defineerror0

#defineoverflow-2

typedefintStatus;

typedefintElemType;

typedefstructLNode//存储结构

{ElemTypedata;

structLNode*next;

}LNode,*LinkList;

voidCreateList(LinkList&L,intn)//尾插法创建单链表

{LinkListp;

L=newLNode;

L->next=NULL;//建立一个带头结点的单链表

LinkListq=L;//使q指向表尾

for(inti=1;i<=n;i++)

{p=newLNode;

cin>>p->data;

p->next=NULL;

q->next=p;

q=p;}

}

StatusGetElem(LinkListL,inti,ElemType&e)//取第i个元素

{LinkListp=L->next;

intj=1;

while(p&&j

{p=p->next;

++j;}

if(!

p||j>i)returnerror;//第i个元素不存在

e=p->data;

returnok;

}

StatusLinkInsert(LinkList&L,inti,ElemTypee)//插入

{LinkListp=L;

intj=0;

while(p&&j

{p=p->next;

++j;}//寻找第i-1个结点

if(!

p||j>i-1)

returnerror;//i小于1或者大于表长加1

LinkLists=newLNode;//生成新结点

s->data=e;

s->next=p->next;//插入L中

p->next=s;

returnok;

}

StatusListDelete(LinkList&L,inti,ElemType&e)//删除

{LinkListp=L;

LinkListq;

intj=0;

while(p->next&&j

{//寻找第i个结点,并令p指向其前驱

p=p->next;

++j;}

if(!

(p->next)||j>i-1)returnerror;//删除位置不合理

q=p->next;

p->next=q->next;//删除并释放结点

e=q->data;

delete(q);

returnok;

}

voidMergeList(LinkList&La,LinkList&Lb,LinkList&Lc)

{//合并两个顺序链表

LinkListpa,pc,pb;

pa=La->next;

pb=Lb->next;

Lc=pc=La;

while(pa&&pb)

{if(pa->data<=pb->data)

{pc->next=pa;

pc=pa;

pa=pa->next;}

else

{pc->next=pb;

pc=pb;

pb=pb->next;}

}

pc->next=pa?

pa:

pb;

delete(Lb);

}

voidshow(LinkListL)//显示

{LinkListp;

p=L->next;

while(p)

{cout<data<<"-->";

p=p->next;}

cout<

}

intLength(LinkListL,inti)//表长

{i=0;

LinkListp=L->next;

while(p)

{++i;

p=p->next;}

returni;

}

voidxiugai(LinkListL)//修改

{inti,j=1;

ElemTypek;

ElemTypee,m;

LinkListp=L->next;

cout<<"请输入要修改的元素位置(0

";

cin>>i;

GetElem(L,i,e);

cout<<"该位置的元素:

"<

cout<<"修改后的元素值:

";

cin>>k;

while(p&&j

{p=p->next;

++j;}

m=p->data;

p->data=k;

cout<<"修改后的单链表显示如下:

"<

show(L);

}

voidhebing()//合并两个单链表

{inta,b;

LinkListLa,Lb,Lc;

cout<<"请输入第一个有序链表的长度:

"<

cin>>a;

cout<<"请输入第一个有序链表的元素共("<

"<

CreateList(La,a);

show(La);

cout<<"请输入第二个有序链表的长度:

"<

cin>>b;

cout<<"请输入第二个有序链表的元素共("<

"<

CreateList(Lb,b);

show(Lb);

MergeList(La,Lb,Lc);

cout<<"合并后的有序链表如下:

"<

show(Lc);

}

voidmain()//主函数

{intselect;

intx;

ElemTypey;

LinkListlist;

for(;;)

{cout<<"单链表的基本操作"<

cout<<"1.单链表的创建"<

cout<<"2.单链表的显示"<

cout<<"3.单链表的长度"<

cout<<"4.取第i个位置的元素"<

cout<<"5.修改第i个位置的元素"<

cout<<"6.插入元素到单链表里"<

cout<<"7.删除单链表里的元素"<

cout<<"8.合并两个单链表"<

cout<<"9.退出系统"<

cout<<"请选择:

";

cin>>select;

switch(select)

{case1:

cout<<"请输入单链表的长度:

"<

cin>>x;

cout<<"请输入"<

CreateList(list,x);

break;

case2:

cout<<"单链表显示如下:

"<

show(list);

break;

case3:

ints;

cout<<"单链表的长度为:

"<

break;

case4:

cout<<"请选择所要取出元素的位置:

";

cin>>x;

while(x<0||x>Length(list,s))

{cout<<"输入有误,请重新输入"<

cout<<"请选择所要取出元素的位置:

";

cin>>x;}

GetElem(list,x,y);

cout<<"该位置的元素为:

"<

break;

case5:

xiugai(list);break;

case6:

cout<<"请选择要插入的位置:

";cin>>x;

while(x<0||x>Length(list,s))

{cout<<"输入有误,请重新输入"<

cout<<"请选择所要插入元素的位置:

";

cin>>x;}

cout<<"要插入的元素值:

";

cin>>y;

LinkInsert(list,x,y);

cout<<"插入后单链表显示如下:

"<

show(list);

break;

case7:

cout<<"请选择要删除的位置:

";cin>>x;

while(x<0||x>Length(list,s))

{cout<<"输入有误,请重新输入"<

cout<<"请选择所要删除元素的位置:

";

cin>>x;}

ListDelete(list,x,y);

cout<<"要删除的元素值:

"<

cout<<"删除后的单链表显示如下:

"<

show(list);

break;

case8:

hebing();

break;

case9:

exit(0);

break;

default:

cout<<"输入有误,请重新输入"<

break;

}

}

}

运行结果、

单链表的创建如下图2-4

 

单链表的显示如下图2-5

单链表的插入如下图2-6

 

单链表的删除如下图2-6

算法分析:

针对上述程序,线性表采用顺序存储,插入操作采用平均移动次数,算法时间复杂性都为:

O(n)……

六、心得体会

在这次设计的过程中,我还遇到了,很多的问题。

顺序表是按顺序存储的,用了一维数组来存储,又结合C++的程序设计,我又用了类,但是,在执行时出现了问题。

后来问同学,指出我的错误,不过获益不少。

我又重新整理思路,把顺序表的基本操作写好了。

虽然走了很多弯路,但是让我认识到,一定要创新,大胆,不能按照旧的思路去干新的事情。

单链表写起来简单多了,这个很快就搞定了。

但是细节上出了问题。

比如说,有些变量的重复定义,有些变量又没有定义,在调用函数,就直接复制过来,没有改参数……通过修改,我深刻理解到:

细节决定成败,在以后,不管做任何事情都要认真,细心。

这次的实验报告,让我受益匪浅,不仅有知识方面的,还有生活和精神上的。

总之,我会继续我的兴趣编程,相信在编程的过程中,能不断的提高自己。

 

欢迎您的下载,

资料仅供参考!

 

致力为企业和个人提供合同协议,策划案计划书,学习资料等等

打造全网一站式需求

 

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2