数据结构实验报告全安工大.docx
- 文档编号:5898255
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:56
- 大小:196.14KB
数据结构实验报告全安工大.docx
《数据结构实验报告全安工大.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告全安工大.docx(56页珍藏版)》请在冰豆网上搜索。
数据结构实验报告全安工大
数据结构实验报告
*****
学号:
*********
班级:
软件工程141班
学院:
计算机科学与技术学院
实验时间:
2016
指导老师:
***
实验一约瑟夫问题实现
1、实验目的
1)掌握线性表的两类存储结构(顺序存储结构和链式存储结构)的描述方法。
2)掌握在顺序结构中实现查找、插入、删除操作的基本方法。
3)掌握在各种链表结构中实现查找、插入、删除操作的基本方法
2、实验内容
设有n个人围坐在一圈,现从指定的第个人开始报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m个人又出列,如此重复,直到所有的人全部出列为止。
3、实验要求
针对实验内容,认真设计算法,上机过程中,能够熟练运用高级语言的程序调试器DEBUG调试程序,上机后,认真整理源程序及其注释,完成实验报告(包括源程序、实验结果、算法分析、心得体会等)
顺序结构:
#include"stdio.h"
#include"stdlib.h"
#defineMAXSIZE100
typedefstructnode{
intdata[MAXSIZE];
intlength;
}SeqList,*PSeqList;
intDelete(PSeqListPL,inti)
{
intj;
if(!
PL)
{
printf("表不存在");
return(-1);
}
if(i<1||i>PL->length)
{
printf("删除位置不合法");
return(0);
}
for(j=i;j
{PL->data[j-1]=PL->data[j];}
PL->length--;
return
(1);
}
PSeqListInit(void)
{
intn,i;
PSeqListPL;
PL=(PSeqList)malloc(sizeof(SeqList));
if(PL){PL->length=0;}
printf("请输入圆桌人数:
\n");
scanf("%d",&n);
if(n>MAXSIZE)
printf("溢出");
for(i=0;i { PL->data[i]=i; PL->length++; } returnPL; } intjosephus(PSeqListjosephus,ints,intm)/*josephus为顺序表,s为首位置,m为计数值*/ { ints1,i,w; if(! josephus->length) { printf("表中无元素"); return(0); } s1=s-1; printf("输出约瑟夫序列: \n"); for(i=josephus->length;i>0;i--) { s1=(s1+m-1)%i; w=josephus->data[s1]; printf("%d\t",w); Delete(josephus,s1+1); } return (1); } intmain() { PSeqListPL; intm,n; PL=Init(); printf("请分别输入起始序号和计数值: \n"); scanf("%d%d",&m,&n); josephus(PL,4,3); return(0); } 链式结构: #include #include #include typedefstructnode { intdata; structnode*next; }Lnode,*Linklist; /*创建一个单链表并初始化*/ Linklistcreate(intn)/*此函数带回一个指向链表头的指针*/ { inti; Linklisthead; Linklistp1,p2; p1=p2=(Linklist)malloc(sizeof(Lnode));/*开辟一个新单元*/ p1->data=0; head=p1; for(i=1;i { p2=p1; p1=(Linklist)malloc(sizeof(Lnode)); p1->data=i; p2->next=p1; } p1->next=head; return(head); } intjosephus(Linklistjosephus,ints,intm) { Linklistp,pre; intcount; if(! josephus) { printf("表中无元素"); return(0); } p=josephus; for(count=1;count { p=p->next; } printf("输出约瑟夫序列: \n"); while(p! =p->next) { pre=p->next; while(pre->next! =p){pre=pre->next;} for(count=1;count { pre=p; p=p->next; } printf("%d\t",p->data); pre->next=p->next; free(p); p=pre->next; } printf("%d\t",p->data); free(p); return (1); } intmain() { LinklistPL; ints,m,n,i; printf("请输入圆桌的人数,起始位置,间隔"); scanf("%d%d%d",&s,&m,&n); PL=create(s); /*for(i=0;i { printf("%d",PL->data); PL=PL->next; } */ josephus(PL,m,n); return (1); } 静态链表: #include"stdio.h" #include"stdlib.h" #defineMAXSIZE100 typedefstruct{ intdata; intnext; }SNode; typedefstruct{ SNodesp[MAXSIZE]; intSL; }StList,*PStList; PStListInit(intn) { inti; //设置游标 PStListPL; PL=(PStList)malloc(sizeof(StList)); if(PL){PL->SL=0;} for(i=0;i { PL->sp[i].next=i+1; PL->sp[i].data=i; } PL->sp[n-1].next=0; PL->sp[n-1].data=n; return(PL); } voidjosephus(PStListp,ints,intm,intn) { inti,s1,h,j; printf("输出约瑟夫序列: \n"); s1=s-1; for(i=n;i>1;i--) { for(j=1;j s1=p->sp[s1].next; h=s1; s1=p->sp[s1].next; printf("%d",p->sp[s1].data); p->sp[h].next=p->sp[s1].next; } s1=p->sp[s1].next; printf("%d",p->sp[s1].data); } intmain() { ints,m,n; printf("请输入人数: \n"); scanf("%d",&n); printf("请输入起始位置和间隔: \n"); scanf("%d%d",&s,&m); PStListPL; PL=Init(n); josephus(PL,s,m,n); return(0); } 心得体会: 通过这次的是实验我可以基本掌握线性表的两类存储结构(顺序存储结构和链式存储结构)的描述方法。 掌握在各种链表结构中实现查找、插入、删除操作的基本方法,掌握在顺序结构中实现查找、插入、删除操作的基本方法。 并且将这些方法运用到实际的约瑟夫问题中,难点在于对约瑟夫算法的理解,在实验中因为未能深刻理解约瑟夫算法出过很多小问题使得输出的约瑟夫序列不正确。 实验二: 数制转换算法实现 1、实验目的 1)掌握栈、队列的两类存储结构(顺序存储结构和链式存储结构)的描述方法。 2)掌握在不同结构中实现基本操作的基本方法。 3)掌握在两种结构中实现查找、插入、删除操作的基本方法 2、实验内容 编写算法实现任意一个十进制数转换r进制数。 3、实验要求 针对实验内容,认真设计算法,上机过程中,能够熟练运用高级语言的程序调试器DEBUG调试程序,上机后,认真整理源程序及其注释,完成实验报告(包括算法、源程序、实验结果、算法分析等) 源程序1(顺序结构): #include #include #include #define maxsize 100 typedef struct { int data[maxsize]; int top; }seqstack,*Pseqstack; typedef struct { int data[maxsize]; int rear,front; }seqqueue,*Pseqqueue; Pseqstack init_seqstack(void) { Pseqstack S; S=(Pseqstack)malloc(sizeof(seqstack)); if(S) S->top=-1; return S; }//初始化栈 int empty_seqstack(Pseqstack S) { if(S->top==-1) return 1; else return 0; }//判断栈是否为空 int push_seqstack(Pseqstack S,int x) { if(S->top==maxsize-1) { printf("the stack is full"); return 0; } else { S->top++; S->data[S->top]=x; return 1; } }//入栈 int pop_seqstack(Pseqstack S,int *x) { if(empty_seqstack(S)) { printf("the stack is empty "); return 0; } else { *x=S->data[S->top]; S->top--; return 1; } }//出栈 int destory_seqstack(Pseqstack *S) { if(*S) free(*S); *S=NULL; return 0; }//销毁栈 int conversion(Pseqstack S,int n,int r) { int x; /*if(! r) { printf("基数不能为0"); return 0; }*/ S=init_seqstack(); /*if(! S) { printf("初始化栈失败"); return 0; }*/ while(n) { push_seqstack(S,n%r); n=n/r; } while(! empty_seqstack(S)) { pop_seqstack(S,&x); printf("%d",x); } destory_seqstack(&S); return 0; }//整数部分转换 Pseqqueue init_seqqueue(void) { Pseqqueue Q; Q=(Pseqqueue)malloc(sizeof(seqqueue)); if(Q) { Q->front=0; Q->rear=0; } return Q; }//初始化队列 int empty_seqqueue(Pseqqueue Q) { if(Q&&Q->rear==Q->front) return 1; else return 0; }//判断队是否为空 int in_seqqueue(Pseqqueue Q,int x) { if((Q->rear+1)%maxsize==Q->front) { printf("队满"); return -1; } else { Q->rear=(Q->rear+1)%maxsize; Q->data[Q->rear]=x; return 0; } }//入队 int out_seqqueue(Pseqqueue Q,int *x) { if(empty_seqqueue(Q)) { printf("队空"); return 0; } else { Q->front=(Q->front+1)%maxsize; *x=Q->data[Q->front]; return 1; } }//出队 void destory_seqqueue(Pseqqueue *Q) { if(*Q) free(*Q); *Q=NULL; }//销毁队列 int translate(Pseqqueue Q,float a,int b) { int x; /*if(! b) { printf("基数不能为0"); return 0; }*/ Q=init_seqqueue(); /*if(Q) { printf("队列初始化失败"); return -1; }*/ while(a) { in_seqqueue(Q,int(a*b)); a=a*b-int(a*b); } while(! empty_seqqueue(Q)) { out_seqqueue(Q,&x); printf("%d",x); } destory_seqqueue(&Q); return 1; } //小数部分的转化 void change(Pseqstack S,Pseqqueue Q) { int z,r; float c,x; printf("请输入需要转换的数: "); scanf("%f",&x); printf("进制是: "); scanf("%d",&r); z=int(x); c=x-int(x); printf("转换后的结果是: "); conversion(S,z,r); printf("."); translate(Q,c,r); }//链接栈、队列 int main() { //float X; //int R; Pseqstack S; //S=(Pseqstack)malloc(sizeof(seqstack)); Pseqqueue Q; //Q=(Pseqqueue)malloc(sizeof(seqqueue)); change(S,Q); return 0; } 2链式结构: #include #include typedefintdatatype; typedefstructnode { datatypedata; structnode*next; }StackNode,*PStackNode; typedefstruct { PStackNodetop; }LinkStack,*PLinkStack; typedefstructNode { datatypedata; structNode*next; }Qnode,*PQNode;/*链队结点的类型*/ typedefstruct { PQNodefront,rear; }LinkQueue,*PLinkQueue;/*将头尾指针封装在一起的链队*/ PLinkStackCreat1() {/*初始化链栈,入口参数: 空,返回值: 链栈指针,NULL表示初始化失败*/ PLinkStackS; S=(PLinkStack)malloc(sizeof(LinkStack)); if(S) S->top==NULL; returnS; } intEmpty(PLinkStackS) {/*判断链栈是否为空,入口参数: 链栈指针*/ return(S->top==NULL); } voidPush(PLinkStackS,datatypex) {/*进栈,入口参数: 链栈指针*/ PStackNodeP; P=(PStackNode)malloc(sizeof(StackNode)); if(! P) printf("内存溢出! \n"); else { P->data=x; P->next=S->top; S->top=P; } } voidPop(PLinkStackS,datatype*x) {/*出栈,*x保存被删除的元素值*/ PStackNodeP; if(Empty(S)) printf("栈空不能出栈! \n"); else { *x=S->top->data; P=S->top; S->top=S->top->next; free(P); } } voidConvert1(PLinkStackS,intn,intr) {/*转化,入口参数: 链栈指针,数n,进制r*/ intx; S=Creat1(); while(n) { Push(S,n%r); n/=r; } while(! Empty(S)) { Pop(S,&x); printf("%d",x); } } PLinkQueueCreat2() {/*初始化一新队列,入口参数: 无,返回值: 新链队列指针,NULL表示失败*/ PLinkQueueQ; Q=(PLinkQueue)malloc(sizeof(LinkQueue));/*申请链队结点*/ if(Q) { Q->front=NULL; Q->rear=NULL; } returnQ; } intEmpty_LinkQueue(PLinkQueueQ) { if(Q&&Q->front==NULL&&Q->rear==NULL) return1; else return0; } voidIn_LinkQueue(PLinkQueueQ,datatypex) {/*入队操作,入口参数: 链队列和待入队元素x,返回值: 1表示成功,0表示系统内存溢出*/ PQNodep; p=(PQNode)malloc(sizeof(Qnode)); if(! p) { printf("内存溢出! \n"); return; } p->data=x; p->next=NULL; if(Empty_LinkQueue(Q)) Q->front=Q->rear=p; else { Q->rear->next=p; Q->rear=p; }/*入队完成*/ } voidOut_LinkQueue(PLinkQueueQ,datatype*x) {/*出队操作,入口参数: 链队列,返回值: 1表示成功,0表示队空*/ PQNodep; if(Empty_LinkQueue(Q)) { printf("队空不能出队! \n");/*队空不能出队*/ return; } else { *x=Q->front->data; p=Q->front; Q->front=Q->front->next; free(p); if(! Q->front) Q->rear=NULL; }/*出队完成*/ } voidConvert2(PLinkQueueQ,floatn,intr) { intx; Q=Creat2(); while(n) { In_LinkQueue(Q,n*r); n=n*r-int(n*r); } while(! Empty_LinkQueue(Q)) {//依次从队列中弹出每一个余数,并输出之 Out_LinkQueue(Q,&x); printf("%d",x); } } voidChange(PLinkStackS,PLinkQueueQ) { intr,X; floatn,Y; printf("请输入要转化的数: "); scanf("%f",&n); printf("请输入要转化的进制r: "); scanf("%d",&r); X=int(n); Y=n-X; printf("转化的r进制数为: "); Convert1(S,X,r); printf("."); Convert2(Q,Y,r); getchar(); } intmain() { PLinkStackS; PLinkQueueQ; Change(S,Q); return0; } 心得体会: 通过本次实验我基本掌握了栈、队列的两类存储结构(顺序存储结构和链式存储结构)的描述方法。 掌握在不同结构中实现基本操作的基本方法。 掌握在两种结构中实现查找、插入、删除操作的基本方法,通过运用队列和堆栈,实现了数制转换问题,实验中主要是要注意链式和顺序的基本操作的运用,有些地方是有区别的,要注意这方面的使用。 实验三二叉树的遍历 试编写程序: (1)建立下面这样一棵二叉树 (2)后序遍历这棵二叉树 (3)按层次遍历 (4)求叶子数和深度。 #include"stdio.h" #include"stdlib.h" typedefcharData
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 全安工大
![提示](https://static.bdocx.com/images/bang_tan.gif)