数据结构实验报告杨辉三角约瑟夫环Word下载.docx

上传人:b****5 文档编号:19848001 上传时间:2023-01-10 格式:DOCX 页数:19 大小:295.88KB
下载 相关 举报
数据结构实验报告杨辉三角约瑟夫环Word下载.docx_第1页
第1页 / 共19页
数据结构实验报告杨辉三角约瑟夫环Word下载.docx_第2页
第2页 / 共19页
数据结构实验报告杨辉三角约瑟夫环Word下载.docx_第3页
第3页 / 共19页
数据结构实验报告杨辉三角约瑟夫环Word下载.docx_第4页
第4页 / 共19页
数据结构实验报告杨辉三角约瑟夫环Word下载.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

数据结构实验报告杨辉三角约瑟夫环Word下载.docx

《数据结构实验报告杨辉三角约瑟夫环Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告杨辉三角约瑟夫环Word下载.docx(19页珍藏版)》请在冰豆网上搜索。

数据结构实验报告杨辉三角约瑟夫环Word下载.docx

QueueLength(Q)

返回Q的元素个数,即队列长度

GetHead(Q,&

e)

Q为非空队列

用e返回Q的队头元素

EnQueue(&

Q,e)

插入元素e为Q的新队尾元素

DeQueue(&

Q,&

删除Q的队头元素,并用e返回其值

QueueTraverse(Q,visit())

Q已存在且非空

从队头到队尾,依次对Q的每个数据元素调用函数visit()。

一旦visit()失败,则操作失败。

}ADTQueue

2.主程序流程

voidmain()

{

初始化;

输入数据;

执行功能;

显示结果;

}

3.各程序模块间调用关系

主程序

各功能模块

三、详细设计

1.抽象数据类型定义

定义数据类型QNode

整形数据data;

指针变量*next;

}QNode,*QueuePtr;

typedefstruct

设定队头指针

设定队尾指针

}LinkQueue;

2.各功能模块算法

(1)//构造空队列Q

intInitQueue

获取数据结构类型QNode;

设定头结点,头尾指针指向头结点;

(2)//插入e为Q的队尾元素

intEnQueue

分配动态内存空间;

确认分配成功;

队尾元素赋值;

定义队尾指针;

(3)//销毁Q的队头元素并用e返回其值

intDeQueue

若头尾元素相等

返回ERROR;

队头元素赋p;

P值赋e;

销毁队头元素;

(4)//用e返回Q的队头元素

intGetHead

若头尾元素不相等

队头元素赋e返回;

否则

不返回;

3.主函数

voidmain()

定义整形变量n,j,i,t,x,level;

通过键盘输入杨辉三角级数level

初始化队列

插入1为队列队尾元素

//输出杨辉三角

令n=1;

当n<

=level+1时循环,每轮循环结束n+1

{

插入1为队列队尾元素

令j=1;

当j<

=level-n+1时循环,每轮循环结束j+1

{

输出空格以调整三角结构;

}

令i=1;

当i<

=n-1时循环,每轮循环结束i+1;

{

输出t;

用x获取Q的队头元素;

t=t+x;

运算结果t插入队尾;

//判断语句确保首行为空,即去除杨辉三角顶角

若n>

1

//输出行尾的1,完成一行的输出

用x获取并销毁Q的队头元素;

输出x;

将1插入队尾;

输出换行以调整结构;

}

4.函数调用关系图

Main函数

调用InitQueue函数

调用EnQueue函数

调用DeQueue函数

调用GetHead函数

结束

四、调试分析

程序的编写及调试基本正常,开始时由于细节问题导致杨辉三角结构上出现些许问题:

1.主函数输出的杨辉三角有顶角(即首行为1),后调整循环判定条件并增加if语句消除首行使三角输出正常

2.杨辉三角结构混乱,不整齐,后通过设定输出字符数调整正常

五、用户使用说明

根据提示输入所需杨辉三角级数即可

示例:

请输入所需的杨辉三角级数:

7

六、测试结果

操作及输出流程详见如下截图

七、附录

源程序如下:

#include<

stdio.h>

stdlib.h>

//引用的函数库

typedefstructQNode

intdata;

structQNode*next;

QueuePtrfront;

//队头指针

QueuePtrrear;

//队尾指针

intInitQueue(LinkQueue&

Q)

//构造空队列Q

Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));

if(!

Q.front)

exit(-2);

Q.front->

next=NULL;

return1;

intEnQueue(LinkQueue&

Q,inte)

//插入e为Q的队尾元素

QueuePtrP=(QueuePtr)malloc(sizeof(QNode));

P)

P->

data=e;

Q.rear->

next=P;

Q.rear=P;

intDeQueue(LinkQueue&

Q,int&

e)

//销毁Q的队头元素并用e返回其值

if(Q.front==Q.rear)

return0;

QueuePtrP=Q.front->

next;

e=P->

data;

next=P->

if(Q.rear==P)

Q.rear=Q.front;

free(P);

intGetHead(LinkQueueQ,int&

//用e返回Q的对头元素

if(Q.front!

=Q.rear)

e=Q.front->

next->

return1;

else

intn,j,i,t,x,level;

//定义变量

printf("

请输入所需的杨辉三角级数:

\n"

);

scanf("

%d"

&

level);

//获取杨辉三角级数

LinkQueueQ;

InitQueue(Q);

EnQueue(Q,1);

//插入1为队列队尾元素

\n所求杨辉三角如下:

for(n=1;

n<

=level+1;

n++)

EnQueue(Q,1);

//插入1为队列队尾元素

for(j=1;

j<

=level-n+1;

j++)

printf("

"

for(i=1;

i<

=n-1;

i++)

//逐个输出队列元素,并构建下一行需输出的队列

DeQueue(Q,t);

%3d"

t);

//输出Q的队头元素并销毁

GetHead(Q,x);

t=t+x;

EnQueue(Q,t);

//运算结果插入队尾

if(n>

1)//判断语句确保首行为空,即去除杨辉三角顶角

DeQueue(Q,x);

printf("

x);

\n"

 

实验二约瑟夫环(JosephusRing)

本程序中,需输入的系数n,s,m都是正整数,由键盘按提示依次输入,以回车结束

从屏幕输出出列顺序

用户由键盘输入约瑟夫环的必要数据(人数,起始序号,出列数),由屏幕输出出列顺序

723

4731625

以单向循环链表实现该程序

1.抽象数据类型的定义

ADTListNode

D={ai|ai∈CharSet,i=1,2,…,n,n≥0}

ai-1,ai>

|ai∈D,I=2,…,n}

InitList(&

L)

构造一个最大长度ms内容为空的有序表L。

ClearList(&

线性表L已经存在。

将L重置为空表。

EmptyList(L)

若L为空表返回TRUE,否则返回FALSE。

ListLength(L)

返回L中数据元素个数。

GetElem(L,pos,&

线性表L已经存在,1≤i≤ListLength(L)。

用e返回L中第i个数据元素的值。

LocateElem(L,e)

返回L中第1个与e相同的元素的位序。

若不存在返回0。

ListInsert(L,i,e)

在L中的第i个元素的位置之前插入新元素e,L的长度加1。

ListDelete(L,pos,e)

删除L的第i个数据元素,并用e返回其值,L的长度减1。

ListTraverse(L)

依次对L的每个数据元素进行访问。

}ADTCirLinkedList

voidmain()

初始化;

输入数据;

执行功能;

3.程序模块间调用关系

主程序

定义数据类型LNode

整形变量num;

指针变量*next;

};

定义LNode类型NODE;

2.各程序模块算法

NODE*createlinklist(intn)

//初始化循环链表,并返回头指针

定义指针*head,*p,*q;

整形i=1;

定义头指针;

赋p值i;

令i=2;

=n是循环,每轮循环结束i+1

动态内存分配;

若q==0

返回0;

q->

p->

next;

p=q;

表尾指针指向表头;

返回头指针;

joseph函数(NODE*p,intn,intm)

//约瑟夫函数,用于输出约瑟夫环

整形i,j;

NODE*q;

令i=1;

=n时循环,每轮循环末i+1

m时循环,每轮循环末j+1

p->

p;

p->

q;

q->

输出q值;

释放q;

3.主函数算法

main()

NODE*head;

整形n,s,m;

整形i;

由键盘获取n;

由键盘获取s;

由键盘获取m;

获取头指针head;

若s=1

n时循环,每轮循环结束i+1

head->

head;

else

s-1时循环,每轮循环结束i+1

调用joseph函数,输出序列;

4.函数调用关系图

main函数

调用createlinklist函数

调用joseph函数

结束

程序的编写和调试基本正常,开始编写程序时忘记考虑s=1时的情况,导致程序出现bug,经过单步跟踪调试后发现程序的错误,采用if语句对s=1的情况单独处理将问题解决。

本实验采用数据抽象的与模块化程序设计方法。

这对于提高我们编写算法的能力是一次很好的锻炼机会。

根据提示输入人数n,起始点s,间隔m

围绕圆桌的人数为?

7

从第几人开始?

2

数到几的人出列?

3

#include<

//引用函数库

structLNode

intnum;

structLNode*next;

};

//定义链表

typedefstructLNodeNODE;

//初始化循环链表,并返回头指针

NODE*head,*p,*q;

inti=1;

head=p=(structLNode*)malloc(sizeof(structLNode));

p->

num=i;

for(i=2;

=n;

q=(structLNode*)malloc(sizeof(structLNode));

if(q==0)return(0);

next=q;

p=q;

next=head;

//使链表尾指向链表头,形成循环链表

returnhead;

voidjoseph(NODE*p,intn,intm)

inti,j;

NODE*q;

for(i=1;

for(j=1;

m;

p=p->

//计算出列者序号

q=p->

next=q->

%d"

q->

num);

free(q);

NODE*head;

intn,s,m;

inti;

//确定计算系数

围绕圆桌的人数为?

n);

从第几人开始?

s);

数到几的人出列?

m);

//确定头指针

head=createlinklist(n);

if(s==1)

for(i=1;

n;

head=head->

else

s-1;

head=head->

//输出约瑟夫环出列顺序

出列的顺序如下:

joseph(head,n,m);

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

当前位置:首页 > 农林牧渔 > 水产渔业

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

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