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