数据结构实验一 顺序结构程序设计.docx

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

数据结构实验一 顺序结构程序设计.docx

《数据结构实验一 顺序结构程序设计.docx》由会员分享,可在线阅读,更多相关《数据结构实验一 顺序结构程序设计.docx(26页珍藏版)》请在冰点文库上搜索。

数据结构实验一 顺序结构程序设计.docx

数据结构实验一顺序结构程序设计

实验一顺序结构程序设计

实验课程名:

线性表的实验

专业班级:

计算机科学与技术学号:

姓名:

实验时间:

11.6-11.13实验地点:

指导教师:

一、实验目的

1、掌握用VisualC++6.0上机调试顺序表的基本方法

2、掌握顺序表的基本操作,插入、删除、查找、以及有序顺序表的合并等算法的实现

3、掌握用VisualC++6.0上机调试单链表的基本方法

4、掌握单链表的插入、删除、查找、求表长以及有序单链表的合并算法的实现

5、进一步掌握循环单链表和双链表的插入、删除、查找算法的实现

 

(二)下面是顺序表的部分基本操作实现的算法,请同学们自己设计主函数和部分算法,调用这些算法,完成下面的实验任务。

1、顺序表基本操作的实现。

要求生成顺序表时,可以键盘上读取元素,用顺序存储结构实现存储。

#defineMAXSIZE100//MAXSIZE为线性表可能的最大长度

#include

#include

typedefintElemType;

typedefstruct

{

ElemTypedata[MAXSIZE];

intlength;//length为线性表的长度

}SqList;

SqListl;//线性表定义

voidInitList(SqList&L)//初始化操作,将线性表L置空

{

L.length=0;//g给顺序表长度初始化为0

}

voidCreatSqlist(SqList&L,intn)//建立一个顺序存储的线性表

{

printf("请输入节点");

inti;

for(i=0;i

scanf("%d",&L.data[i]);//读取元素

L.length=n;//表的长度就是元素的个数

fflush(stdin);//清除一个流

}

voidOutput(SqList&L)//输出顺序表L

{

inti;

for(i=0;i

printf("%5d",L.data[i]);//每个数据占5列

printf("\n");

}

intDELETE(SqList&L,inti)//删除一个元素

{

intj;

if(i<1||i>L.length)//删除位置错误

{printf("error");return0;}

else

{

for(j=i;j

L.data[j-1]=L.data[j];//依次把后一个元素往前移动一个位置

L.length--;//删除之后长度减1

}

return1;

}

intINSERT(SqList&L,intx,inti)//指定位置插入元素

{

intj;

if(L.length>=MAXSIZE-1)

{printf("overflow");return1;}//上溢

elseif((i<1)||(i>L.length+1))

{printf("error");return1;}

else

{for(j=L.length;j>=i-1;j--)

L.data[j+1]=L.data[j];//元素位置依次后移一位

L.data[i-1]=x;//在第i个节点上插入x

L.length=L.length+1;//插入之后长度加1

}

return0;

}

intGET(SqList&L,inti)//从表中获得一个元素

{

intm;

if((i<0)||(i>L.length)){printf("overflow");return1;}

elseif((i>=1)&&(i<=L.length))

{

m=L.data[i-1];

}printf("%d",m);

return0;

}

intchazhao(SqList&L,intx)//从表中查找元素

{

inti,k;

printf("\n请输入你要查找的元素x=?

");

scanf("%d",&x);

for(i=0;i<=(L.length+1);i++)//从第一个元素开始查找,与X比较。

{

if(x==L.data[i])

{printf("要查找的元素%d位于%d上\n\n",x,i+1);

k=0;

break;

}

}

if(k!

=0)printf("%d不在表中",x);

return0;

}

intPUEGE(SqList&L)//删除线性表中重复出现的多余节点

{

inti=1,j,x,y;

while(i

{x=L.data[i];

j=i+1;

/*for(j=i+1;j

while(j

{

y=L.data[j];

if(x==y)DELETE(l,j);

elsej++;

}

i++;

}

return0;

}

intmain()

{intn,i,k,x;

InitList(l);

printf("请输入线性表的长度");

scanf("%d",&n);

CreatSqlist(l,n);

Output(l);

printf("请输入你要删除元素的位置=?

");

scanf("%d",&k);

DELETE(l,k);Output(l);

printf("请输入想要插入的数和位置x,i=?

");

scanf("%d,%d",&x,&i);

INSERT(l,x,i);Output(l);

printf("请输入你要取的数在的节点位置");

scanf("%d",&i);

GET(l,i);

chazhao(l,x);

PUEGE(l);

return0;

}

运行结果:

2、已知顺序表la和lb中的数据元素按非递减有序排列,将la和lb表中的数据元素,合并成为一个新的顺序表lc,lc中的数据元素仍按非递减有序排列,并且不破坏la和lb表。

#include

#definemaxnum20

typedefintDataType;

typedefstruct

{DataTypedata[maxnum];

intlength;

}SeqList;

intMergeQL(SeqListla,SeqListlb,SeqList*lc)

{inti,j,k;

if(la.length+1+lb.length+1>maxnum)

{printf("\narrayoverflow!

");

return0;

}

i=j=k=0;

while(i<=la.length&&j<=lb.length)

{if(la.data[i]<=lb.data[j])

lc->data[k++]=la.data[i++];

else

lc->data[k++]=lb.data[j++];

}

/*处理剩余部分*/

while(i<=la.length)lc->data[k++]=la.data[i++];

while(j<=lb.length)lc->data[k++]=lb.data[j++];

lc->length=k-1;

return1;

}

voidmain()

{SeqListla={{3,4,7,12,15},4};

SeqListlb={{2,5,7,15,18,19},5};

SeqListlc;

inti;

if(MergeQL(la,lb,&lc))

{printf("\n");

for(i=0;i<=lc.length;i++)

printf("%4d",lc.data[i]);

}

}

}

运行结果:

3.从有序顺序表A中删除那些在顺序表B和顺序表C中都出现的元素.

代码:

#include

#include

#include

#include

#defineLIST_INIT_SIZE10

#defineLISTINCREMENT10

#defineOK1

#defineERROR0

typedefintElemType;

typedefstruct/*顺序存储类型*/

{int*elem;intlength;intlistsize;}SqList;

intInitList(SqList&L)/*构造一个空线性表算法*/

{L.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));

if(!

L.elem)return(0);

L.length=0;

L.listsize=LIST_INIT_SIZE;

returnOK;

}

intinput(SqList&L)/*输入*/

{inti;cout<<"输入线性表元素的个数:

";cin>>L.length;

for(i=0;i

{cout<<"输入第"<

";

cin>>L.elem[i];

}

returnOK;

}

intrank(SqList&L)/*线性表的排序*/

{inti,j,k;

for(i=0;i

for(j=0;j

if(L.elem[j]>L.elem[j+1])

{k=L.elem[j];L.elem[j]=L.elem[j+1];L.elem[j+1]=k;};

returnERROR;

returnOK;

}

intoutput(SqListL)/*输出*/

{inti;for(i=0;i

cout<

returnERROR;

}

voidmain()

{SqListLA,LB,LC;

InitList(LA);

InitList(LB);

InitList(LC);

cout<<"创建线性表LA:

"<

input(LA);

cout<<"创建线性表LB:

"<

input(LB);

cout<<"创建线性表LC:

"<

input(LC);

rank(LA);

rank(LB);

rank(LC);

cout<<"输出线性表LB各元素的值:

";

output(LB);

cout<

cout<<"输出线性表LC各元素的值:

";

output(LC);

cout<

cout<<"输出原线性表LA各元素的值:

";

output(LA);

cout<

inti,j,k;

for(i=0;i

for(j=0;j

if(LA.elem[i]==LB.elem[j])

{for(k=i;k

LA.elem[k]=LA.elem[k+1];

LA.length--;

}

for(i=0;i

for(j=0;j

if(LA.elem[i]==LC.elem[j])

{for(k=i;k

LA.elem[k]=LA.elem[k+1];

LA.length--;

}

cout<<"输出新的线性表LA各元素的值:

";

output(LA);

cout<

}

运行结果:

4.将一顺序存储的线性表(设元素均为整型量)中所有零元素向表尾集中,其他元素则顺序向表头方向集中。

若输入:

1230050478

则输出:

1235478000

运行代码:

#include

#include

#include

#include

#defineLIST_INIT_SIZE10

#defineLISTINCREMENT10

#defineOK1

#defineERROR0

typedefintElemType;

typedefstruct/*顺序存储类型*/

{int*elem;

intlength;

intlistsize;}SqList;

intInitList(SqList&L)/*构造一个空线性表算法*/

{L.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));

if(!

L.elem)return(0);

L.length=0;

L.listsize=LIST_INIT_SIZE;

returnOK;

}

intinput(SqList&L)/*输入*/

{inti;cout<<"输入线性表元素的个数:

";

cin>>L.length;

for(i=0;i

{cout<<"输入第"<

";

cin>>L.elem[i];

}

returnOK;

}intoutput(SqListL)/*输出*/

{inti;

cout<<"输出新的线性表各元素的值:

";

for(i=0;i

cout<

returnERROR;

}

voidmain()

{SqListL;

InitList(L);

input(L);

output(L);

cout<

inti,j,k;

for(i=0;i

for(j=0;j

if(L.elem[j]==0)

{k=L.elem[j];L.elem[j]=L.elem[j+1];L.elem[j+1]=k;}

output(L);

cout<

}

运行结果:

5、单链表基本操作的实现。

要求生成单链表时,可以键盘上读取元素,用链式存储结构实现存储。

代码:

#include

#include

#include

#include

typedefintelemtype;

typedefstructlnode

{

elemtypedate;

structlnode*next;

}lnode;

lnode*creat(void)

{

lnode*p2,*p1;

lnode*head;

intn;

n=0;

p1=p2=(lnode*)malloc(sizeof(lnode));

head=NULL;

cin>>p1->date;

while(p1->date>0)

{

n=n+1;

if(n==1)

head=p1;

else

p2->next=p1;

p2=p1;

p1=(lnode*)malloc(sizeof(lnode));

cin>>p1->date;

}

p2->next=NULL;

returnhead;

}

voidprint(lnode*head)

{

lnode*p;

p=head;

if(head==NULL)

cout<<"空表";

if(head!

=NULL)

do

{

cout<date;

p=p->next;

}while(p!

=NULL);

cout<

}

lnode*del(lnode*&head,inti)

{

lnode*p1,*p2;

intj=0;

p1=head;

if(head==NULL)

return0;

if(i==1)

{

head=head->next;

free(p1);

}

else

{

while(p1->next&&j

{

p2=p1;

p1=p1->next;

j++;

}

if(p1->next==0||j>i-1)

cout<<"没有发现"<

else

{

p2->next=p1->next;

free(p1);

}

}

returnhead;

}

lnode*insert(lnode*&head,inti,elemtypee)

{

lnode*p1,*p2,*s;

intj=0;

p1=head;

s=(lnode*)malloc(sizeof(lnode));

s->date=e;

if(head==NULL&&i==1)

head=s;

else

{

while(p1->next&&j

{

p2=p1;

p1=p1->next;

j++;

}

p2->next=s;

s->next=p1;

}

returnhead;

}

intmain()

{

lnode*head;

head=creat();

inti;

elemtypee;

print(head);

intnum;

cout<<"请输入要删除的第几位数:

"<

cin>>num;

del(head,num);

print(head);

cout<<"请输入在第几位插入什么数:

"<

cin>>i>>e;

insert(head,i,e);

print(head);

return0;

}

运行结果:

6、已知单链表la和lb中的数据元素按非递减有序排列,将la和lb中的数据元素,合并为一个新的单链表lc,lc中的数据元素仍按非递减有序排列。

要求①不破坏la表和lb表的结构。

②破坏la表和lb表的结构。

7、编程实现两个循环单链表的合并。

代码:

#include

#include

typedefintElemType;

typedefstructLNode

{ElemTypedata;

structLNode*next;

}LNode,*LinkList;

intprint(LinkList&L,intn);

inthebing(LinkListL1,intn,LinkListL2,intm,LinkList&L);

voidcreat(LinkList&L,intn)

{

LNode*p1,*p2;

p1=p2=(LNode*)malloc(sizeof(LNode));

L=NULL;

inti;

for(i=0;i

{

cin>>p1->data;

if(i==0)

L=p1;

else

p2->next=p1;

p2=p1;

p1=(LNode*)malloc(sizeof(LNode));

}

p2->next=L;

}

intmain()

{

LNode*L1,*L2,*L;

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

"<

intn,m;

cin>>n;

creat(L1,n);

print(L1,n);

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

"<

cin>>m;

creat(L2,m);

print(L2,m);

cout<<"合并后"<

hebing(L1,n,L2,m,L);

print(L,m+n);

return0;

}

intprint(LinkList&L,intn)

{

inti;

for(i=0;i

{

cout<data<<"";

L=L->next;

}

return0;

}

inthebing(LinkListL1,intn,LinkListL2,intm,LinkList&L)

{

inti;

LNode*p1;

L=L1;

p1=L1;

for(i=1;i

p1=p1->next;

for(i=1;i

L2=L2->next;

p1->next=L2->next;

return0;

}

运行结果:

8、线性表的逆置:

设有一个线性表(e0,e1,…,en-2,en-1),请编写一个函数将这个线性表原地逆置,即将线性表内容置换为(en-1,en-2,…,e1,e0)。

线性表中的数据可以为整数、字符或字符串,试分别采用顺序存储结构和链式结构来实现。

程序代码:

#include

#include

typedefintElemType;

typedefstructLNode

{ElemTypedata;

structLNode*next;

}LNode,*LinkList;

intprint(LinkList&L,intn);

intnizhi(LNode*&L,intn);

voidcreat(LinkList&L,intn)

{

LNode*p1,*p2;

p1=p2=(LNode*)malloc(sizeof(LN

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

当前位置:首页 > 自然科学 > 物理

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

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