数据结构实验一 线性表及其应用实验二 栈和队列的应用实验三 树和二叉树的建立和应用.docx

上传人:b****8 文档编号:9593886 上传时间:2023-02-05 格式:DOCX 页数:104 大小:707.09KB
下载 相关 举报
数据结构实验一 线性表及其应用实验二 栈和队列的应用实验三 树和二叉树的建立和应用.docx_第1页
第1页 / 共104页
数据结构实验一 线性表及其应用实验二 栈和队列的应用实验三 树和二叉树的建立和应用.docx_第2页
第2页 / 共104页
数据结构实验一 线性表及其应用实验二 栈和队列的应用实验三 树和二叉树的建立和应用.docx_第3页
第3页 / 共104页
数据结构实验一 线性表及其应用实验二 栈和队列的应用实验三 树和二叉树的建立和应用.docx_第4页
第4页 / 共104页
数据结构实验一 线性表及其应用实验二 栈和队列的应用实验三 树和二叉树的建立和应用.docx_第5页
第5页 / 共104页
点击查看更多>>
下载资源
资源描述

数据结构实验一 线性表及其应用实验二 栈和队列的应用实验三 树和二叉树的建立和应用.docx

《数据结构实验一 线性表及其应用实验二 栈和队列的应用实验三 树和二叉树的建立和应用.docx》由会员分享,可在线阅读,更多相关《数据结构实验一 线性表及其应用实验二 栈和队列的应用实验三 树和二叉树的建立和应用.docx(104页珍藏版)》请在冰豆网上搜索。

数据结构实验一 线性表及其应用实验二 栈和队列的应用实验三 树和二叉树的建立和应用.docx

数据结构实验一线性表及其应用实验二栈和队列的应用实验三树和二叉树的建立和应用

DONGFANGCOLLEGE,FUJIANAGRICULTUREANDFORESTRYUNIVERSITY

课程名称:

数据结构

系别:

计算机系

年级专业:

2010级电子信息工程

学号:

1050302103

姓  名:

廖少兵

任课教师:

谢储辉

成绩:

2012

12

25

实验一线性表及其应用

【实验目的】

1.熟练掌握线性表的基本操作在顺序存储和链式存储上的实现;

2.以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点;

3.掌握线性表的动态分配顺序存储结构的定义和基本操作的实现;

4.通过本章实验帮助学生加深对C语言的使用(特别是函数的参数调用、指针类型的应用

和链表的建立等各种基本操作)。

【实验内容】

1线性表顺序存储的基本操作

参考程序:

/*线性表顺序存储的基本操作*/

#include

#defineMaxSize50

typedefcharElemType;

structList

{

ElemTypelist[MaxSize];

intsize;

};

voidsetnull(structList*p)

{

p->size=0;

}

intlength(structList*p)

{

return(p->size);

}

intget(structList*p,inti)

{

if(i>p->size)

return(-1);

else

return(p->list[i-1]);

}

intlocate(structList*p,ElemTypex)

{

inti=0;

while(isize&&p->list[i]!

=x)i++;

if(i==p->size)

return(-1);

else

return(i+1);

}

voidinsert(structList*p,ElemTypex,inti)

{

intj;

if(i<1&&i>p->size+1)

printf("位置参数不正确,不能进行插入操作!

\n");

else

{

p->size++;

for(j=p->size-1;j>=i;j--)/*结点向后移动,腾出一个位置*/

p->list[j]=p->list[j-1];

p->list[j]=x;

}

}

voiddelete(structList*p,inti)

{

intj;

if(i>p->size||i<1)

printf("位置参数不正确,不能进行删除操作!

\n");

else

{

for(j=i-1;jsize-1;j++)/*结点向前移动,覆盖该删除的结点*/

p->list[j]=p->list[j+1];

p->size--;

}

}

display(structList*p)

{

intj;

if(p->size==0)

printf("该线性表为空,不能显示!

\n");

else

{

printf("线性表:

");

if(p->size==1)/*只有一个结点的情况*/

printf("%c",p->list[p->size]);

else/*有一个以上结点的情况*/

{

for(j=0;jsize-1;j++)

printf("%c→",p->list[j]);

printf("%c",p->list[j]);/*显示最后一个结点*/

}

printf("\n");

}

}

main()

{

structListL;

setnull(&L);

insert(&L,'a',1);

insert(&L,'b',2);

insert(&L,'a',1);

insert(&L,'c',2);

insert(&L,'d',1);

insert(&L,'e',2);

display(&L);

printf("值:

%c位置:

%d\n",'a',locate(&L,'a'));

printf("位置:

%d值:

%c\n",4,get(&L,4));

printf("删除第2个结点后");

delete(&L,2);

display(&L);

printf("删除第2个结点后");

delete(&L,2);

display(&L);

printf("删除第1个结点后");

delete(&L,1);

display(&L);

printf("删除第1个结点后");

delete(&L,1);

display(&L);

}

2线性表链式存储的基本操作

/*线性表链式存储-单链表的基本操作*/

#include

#include

typedefcharElemType;

structLNode

{

ElemTypedata;

structLNode*next;

}

setnull(structLNode**p)

{

*p=NULL;

}

intlength(structLNode**p)

{

intn=0;

structLNode*q=*p;

while(q!

=NULL)

{

n++;

q=q->next;

}

return(n);

}

ElemTypeget(structLNode**p,inti)

{

intj=1;

structLNode*q=*p;

while(j

=NULL)/*查找第i个结点*/

{

q=q->next;j++;

}

if(q!

=NULL)/*找到了第i个结点*/

return(q->data);

else

printf("位置参数不正确!

\n");

}

intlocate(structLNode**p,ElemTypex)

{

intn=0;

structLNode*q=*p;

while(q!

=NULL&&q->data!

=x)/*查找data域为x的第一个结点*/

{

q=q->next;

n++;

}

if(q==NULL)/*未找到data域等于x的结点*/

return(-1);

else/*找到data域等于x的结点*/

return(n+1);

}

voidinsert(structLNode**p,ElemTypex,inti)

{

intj=1;

structLNode*s,*q;

s=(structLNode*)malloc(sizeof(structLNode));/*建立要插入的结点s*/

s->data=x;

q=*p;

if(i==1)/*插入的结点作为头结点*/

{

s->next=q;

*p=s;

}

else

{

while(jnext!

=NULL)/*查找第i-1个结点*/

{

q=q->next;j++;

}

if(j==i-1)/*找到了第i-1个结点,由q指向它*/

{

s->next=q->next;/*将结点s插入到q结点之后*/

q->next=s;

}

elseprintf("位置参数不正确!

\n");

}

}

voiddelete(structLNode**p,inti)

{

intj=1;

structLNode*q=*p,*t;

if(i==1)/*删除链表的头结点*/

{

t=q;

*p=q->next;

}

else

{

while(jnext!

=NULL)/*查找第i-1个结点*/

{

q=q->next;j++;

}

if(q->next!

=NULL&&j==i-1)/*找到第i-1个结点,由q指向它*/

{

t=q->next;/*t指向要删除的结点*/

q->next=t->next;/*将q之后的结点删除*/

}

elseprintf("位置参数不正确!

\n");

}

if(t!

=NULL)/*在t不为空时释放该结点*/

free(t);

}

voiddisplay(structLNode**p)

{

structLNode*q;

q=*p;

printf("单链表显示:

");

if(q==NULL)/*链表为空时*/

printf("链表为空!

");

elseif(q->next==NULL)/*链表只有一个结点时*/

printf("%c\n",q->data);

else{/*链表存在一个以上的结点时*/

while(q->next!

=NULL)/*显示前面的结点*/

{

printf("%c→",q->data);q=q->next;

}

printf("%c",q->data);/*显示最后一个结点*/

}

printf("\n");

}

main()

{

structLNode*head;

setnull(&head);

insert(&head,'a',1);

insert(&head,'b',2);

insert(&head,'a',2);

insert(&head,'c',4);

insert(&head,'d',3);

insert(&head,'e',1);

display(&head);

printf("单链表长度=%d\n",length(&head));

printf("位置:

%d值:

%c\n",3,get(&head,3));

printf("值:

%c位置:

%d\n",'a',locate(&head,'a'));

printf("删除第1个结点:

");

delete(&head,1);

display(&head);

printf("删除第5个结点:

");

delete(&head,5);

display(&head);

printf("删除开头3个结点:

");

delete(&head,3);

delete(&head,2);

delete(&head,1);

display(&head);

}

3双链表的基本操作

/*双链表的基本操作*/

#include

#include

typedefcharElemType;

structDNode

{

ElemTypedata;

structDNode*left,*right;

}

setnull(structDNode**p)

{

*p=NULL;

}

intlength(structDNode**p)

{

intn=0;

structDNode*q=*p;

while(q!

=NULL)

{

n++;

q=q->right;

}

return(n);

}

ElemTypeget(structDNode**p,inti)

{

intj=1;

structDNode*q=*p;

while(j

=NULL)/*查找第i个结点*/

{

q=q->right;j++;

}

if(q!

=NULL)/*找到了第i个结点*/

return(q->data);

else

printf("位置参数不正确!

\n");

}

intlocate(structDNode**p,ElemTypex)

{

intn=0;

structDNode*q=*p;

while(q!

=NULL&&q->data!

=x)/*查找data域为x的第一个结点*/

{

q=q->right;

n++;

}

if(q==NULL)/*未找到data域等于x的结点*/

return(-1);

else/*找到data域等于x的结点*/

return(n+1);

}

voidinsert(structDNode**p,ElemTypex,inti)

{

intj=1;

structDNode*s,*q;

s=(structDNode*)malloc(sizeof(structDNode));/*建立要插入的结点s*/

s->data=x;

s->left=s->right=NULL;

q=*p;

if(i==1)/*插入的结点作为表头结点*/

{

s->right=q;

if(q!

=NULL)/*原来的双链表不为空*/

q->left=s;

*p=s;

}

else

{

while(jright!

=NULL)/*查找第i-1个结点*/

{

q=q->right;j++;

}

if(j==i-1)/*找到了第i-1个结点,由q指向它*/

{

if(q->right!

=NULL)/*q不是最后一个结点*/

{

s->right=q->right;/*将结点s插入到q结点和之后结点q->right之间*/

q->right->left=s;

s->left=q;

q->right=s;

}

else/*q是最后一个结点*/

{

s->left=q;/*将s作为表尾结点*/

q->right=s;

}

}

elseprintf("位置参数不正确!

\n");

}

}

voiddelete(structDNode**p,inti)

{

intj=1;

structDNode*q=*p,*t;

if(i==1)/*删除链表的头结点*/

{

t=q;

q=q->right;

if(q!

=NULL)/*当双链表不只一个结点时*/

q->left=NULL;

*p=q;

}

else

{

while(jright!

=NULL)/*查找第i-1个结点*/

{

q=q->right;j++;

}

if(q->right!

=NULL&&j==i-1)/*找到第i-1个结点,由q指向它*/

{

t=q->right;/*t指向要删除的结点*/

if(t->right!

=NULL)/*删除的结点不是最后结点*/

{

q->right=t->right;/*将q之后的结点删除*/

q->right->left=q;

}

else/*删除的结点是最后结点*/

q->right=NULL;

}

elseprintf("位置参数不正确!

\n");

}

if(t!

=NULL)/*在t不为空时释放该结点*/

free(t);

}

voiddisplay(structDNode**p)

{

structDNode*q;

q=*p;

printf("双链表显示:

");

if(q==NULL)/*链表为空时*/

printf("链表为空!

");

elseif(q->right==NULL)/*链表只有一个结点时*/

printf("%c\n",q->data);

else{/*链表存在一个以上的结点时*/

while(q->right!

=NULL)/*显示前面的结点*/

{

printf("%c←→",q->data);q=q->right;

}

printf("%c",q->data);/*显示最后一个结点*/

}

printf("\n");

}

main()

{

structDNode*dhead;

setnull(&dhead);

insert(&dhead,'a',1);

insert(&dhead,'b',2);

insert(&dhead,'a',2);

insert(&dhead,'c',4);

insert(&dhead,'d',3);

insert(&dhead,'e',1);

display(&dhead);

printf("双链表长度=%d\n",length(&dhead));

printf("位置:

%d值:

%c\n",3,get(&dhead,3));

printf("值:

%c位置:

%d\n",'a',locate(&dhead,'a'));

printf("删除第1个结点:

");

delete(&dhead,1);

display(&dhead);

printf("删除第5个结点:

");

delete(&dhead,5);

display(&dhead);

printf("删除开头3个结点:

");

delete(&dhead,3);

delete(&dhead,2);

delete(&dhead,1);

display(&dhead);

}

4顺序表的应用

约瑟夫问题的实现

【问题描述】

设有n个人围坐在圆桌周围,现从某个位置m(1≤m≤n)上的人开始报数,报数到k

的人就站出来。

下一个人,即原来的第k+1个位置上的人,又从1开始报数,再报数到k

的人站出来。

依此重复下去,直到全部的人都站出来为止。

试设计一个程序求出出列序列。

这是一个使用循环链表的经典问题。

因为要不断地出列,采用链表的存储形式能更好地

模拟出列的情况。

【数据描述】

建立一个不带头结点的循环链表,其中的n个人用n个结点来表示。

TypedefintElemtype;

TypedefstructCnode

{Elemtypedata;

structCnode*next;

}CNode;

【C源程序】

#include

#include

#defineNULL0

#defineOK1

#defineERROR0

#defineOVERFLOW-2

typedefintStatus;

typedefintElemtype;/*定义数据元素类型*/

typedefstructCnode

{Elemtypedata;

structCnode*next;

}CNode;

CNode*joseph;/*定义一个全局变量*/

StatusCreate_clist(CNode*clist,intn)

{CNode*p,*q;

inti;

clist=NULL;

for(i=n;i>=1;i--)

{p=(CNode*)malloc(sizeof(CNode));

if(p==NULL)

returnOVERFLOW;/*存储分配失败*/

p->data=i;

p->next=clist;

clist=p;

if(i==n)

q=p;/*用q指向链表的最后一个结点*/

}

q->next=clist;/*把链表的最后一个结点的链域指向链表的第一个结点,构成循环链

表*/

joseph=clist;/*把创建好的循环链表头指针赋给全局变量*/

returnOK;

}/*end*/

StatusJoseph(CNode*clist,intm,intn,intk)

{inti;

CNode*p,*q;

if(m>n)returnERROR;/*起始位置错*/

if(!

Create_clist(clist,n))

returnERROR;/*循环链表创建失败*/

p=joseph;/*p指向创建好的循环链表*/

for(i=1;i

p=p->next;/*p指向m位置的结点*/

while(p)

{for(i=1;i

p=p->next;/*找出第k个结点*/

q=p->next;

printf("%d",q->data);/*输出应出列的结点*/

if(p->next==p)

p=NULL;/*删除最后一个结点*/

else{p->next=q->next;

p=p->next;

free(q);}

}/*while*/

clist=NULL;

}/*end*/

voidmain()

{intm,n,k,i;

CNode*clist;

clist=NULL;/*初始化clist*/

printf("\n请输入围坐在圆桌周围的人数n:

");

scanf("%d",&n);

printf("\n请输入第一次开始报数人的位置m:

");

scanf("%d",&m);

printf("\n你希望报数到第几个数的人出列?

");

scanf("%d",&k);

Create_clist(clist,n);/*创建一个有n个结点的循环链表clist*/

printf("\n出列的顺序如下:

\n");

Joseph(clist,m,n,k);

getch();

}/*main*/

【测试数据】

1、请输入围坐在圆桌周围的人数n:

7

请输入第一次开始报数人的位置m:

3

你希望报数到第几个数的人出列?

2

出列的顺序如下:

4613752

2、请输入围坐在圆桌周围的人数n:

13

请输入第一次开始报数人的位置m:

5

你希望报数到第几个数的人出列?

6

出列的顺序如下:

10394127526118113

3、请输入围坐在圆桌周围的人数n:

21

请输入第一次开始报数人的位置m:

3

你希望报数到第几个数的人出列?

9

出列的顺序如下:

112081871910215941213614121351617

【实验总结】

熟练掌握线性表的基本操作在顺序存储和链式存储上的实现;以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点;掌握线性表的动态分配顺序存储结构的定义和基本操作的实现;通过本章实验帮助学生加深对C语言的使用(特别是函数的参数调用、指针类型的应用和链表的建立等各种基本操作)

通过这个实验让我体会到做实验时,一定要亲力亲为,务必要将每个步骤,每个细节弄清楚,弄明白,实验后,还要复习,思考,这样,你的印象才深刻,记得才牢固。

 

实验二栈和队列的应用

【实验目的】

1.熟练掌握栈和队列的结构,以及这两种数据结构的特点;

2.能够在两种存储结构上实现栈的基本运算,特别注意栈满和栈空的判断条件及描述方法;

3.熟练掌握链队列和循环队列的基本运算,并特

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

当前位置:首页 > 幼儿教育 > 育儿理论经验

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

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