06054109何旭飞.docx
- 文档编号:9312900
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:45
- 大小:153.82KB
06054109何旭飞.docx
《06054109何旭飞.docx》由会员分享,可在线阅读,更多相关《06054109何旭飞.docx(45页珍藏版)》请在冰豆网上搜索。
06054109何旭飞
绍兴文理学院
数理信息学院
数据结构实验报告册
学生姓名何旭飞
学号06054109
班级电信081-
目录
实验一。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
线性表基本操作
实验二。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
栈和队列的应用
实验三。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
树的遍历及应用
实验四。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
停车场
(范例)上机实训1:
约瑟夫(joseph)问题
姓名:
×××班级:
×××日期:
××年××月××日
1.实例描述
约瑟夫(joseph)问题是由编号为1,…,n的n个人按顺时针方向围坐一圈,从第1号的人开始按顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
2.实例分析
设计的程序是模拟约瑟夫问题,按照出列的顺序印出各人的编号。
要求:
(1)输入总人数,建立一个顺序表或单向循环链表存储n个人的编号信息
(2)输出在
(1)中建立的顺序表或单向循环链表上实现约瑟夫问题的求解
3.设计思路
为完成本程序的功能。
(1)设置变量num标记出列人数,控制循环执行次数,当num取值0到n-1时,执行循环,否则退出循环。
(2)设置变量count累计报数人数,决定某一个人是否出列,count从1开始累计,当count==m时,做如下处理:
①刚刚报数的人需要出列,即将其所在结点从表中删除。
若采用循环链表结构,为了实现该操作,需要两个工作指针pre和p,分别指向链表中的两个相邻结点;
②出列人数num加1;
③count重新置1,准备开始下一轮报数。
需要的数据结构定义为:
typedefstructpoint
{intdata;
intNo;
structpoint*next;
}LNode,*LinkList;
本程序包含3个函数:
①主函数main()
②生成单向循环链表create()
③实现报数问题search()
4.程序实现
#include"stdlib.h"
#include"stdio.h"
#defineNULL0
typedefstructpoint
{intdata;
intNo;
structpoint*next;
}LNode,*LinkList;
intn,m;
LinkListcreate()/*生成单向循环链表并返回*/
{inti;
LinkListhead,tail,new;
head=NULL;
printf("\ninputn(总人数):
");
scanf("%d",&n);
printf("\ninputm:
");
scanf("%d",&m);
for(i=1;i<=n;i++)
{new=(LinkList)malloc(sizeof(LNode));
new->No=i;
if(head==NULL)/*链表的第一个结点插入*/
{head=new;tail=head;}
else/*链表的其余结点插入*/
{tail->next=new;tail=new;}
}
tail->next=head;/*循环单链表的生成*/
returnhead;
}
voidsearch(LinkListhead)
{/*用循环链表实现报数问题*/
intcount,num;
LinkListpre,p;
num=0;count=1;
p=head;
printf("\noutputdata:
");
while(num {do/*累计报数*/ {count++;pre=p;p=p->next;}while(count pre->next=p->next;/*报m的人出列*/ printf("%3d",p->No); free(p); p=pre->next; count=1; num++; } } main() {LinkListhead; clrscr(); head=create(); search(head); getchar(); getchar(); } 5.测试结果 inputn(总人数): 8 inputm: 3 outputdata: 36152847 6.实习心得 (略) 上机实训1: 线性表基本操作 姓名: 何旭飞班级: 电信081日期: 11年03月26日 1.实例描述 一元多项式的求导运算。 已知一个一元多项式,试设计一个程序对该多项式求导。 所设计的程序应实现如下基本功能: 1)输入一元多项式,建立与其对应的有序链表;2)对多项式进行求导,建立并输出求导后的多项式。 2.实例分析 要对一元多项式求导,首先要确定该一元多项式能否求导,即满足求导的要求,求导存在常数或一元不定式,如果仅有常数,是不能求导的,因为常数求导以后变为零,从节点中删除该节点。 如果是一元不定式与常数的混合,或者是一元多项式,都可以求导。 导数的运算原则如下: 常数的导数为零,xn的导数等于n*xn-1。 假设qa指向多项式的当前操作结点,则结点中各数据项的变化为: 1)若qa所指结点的指数项为0,求导以后应从多项式中删除该结点,释放qa。 2)若qa所指结点的指数项不为0,则求导以后,该结点的系数为该结点的 3.设计思路 在这我们选择带头结点的单链表或单向循环链表存储多项式。 头结点的指数值为-1,系数项存放多项式的项数。 数据结构定义为: typedefstructpnode {floatcoef;/*系数*/ intexp;/*指数*/ structpnode*next; }pnode,*polynode; 4.程序实现 实例一程序 #include"stdio.h" #include“stdlib.h”//forvc6 typedefstructpnode { floatcoef;/*系数*/ intexp;/*指数*/ structpnode*next; }pnode,*polynode; voidcreatpolyn(polynodep,intm) {/*输入m项的系数和指数,建立一元多项式的有序单链表*/ inti;floatcoef;intexp; polynodetail,new; p->coef=m;p->exp=-1;tail=p; /*定义各变量建立单链表或单向循环链表存储多项式*/ for(i=1;i<=m;i++) { new=(polynode)malloc(sizeof(pnode)); /*重新分配存储空间*/ printf("\ninputcoef(系数)andexp(指数): "); scanf("%f%d",&coef,&exp); /*完成输入与输出的系数和指数*/ new->coef=coef; new->exp=exp; new->next=NULL; tail->next=new; tail=new; 单链表循环p coefexpnew=tail→coefexptail->next→coef(new)expnew=null 尾节点对应头结点 } } voidderivative(polynodep) {/*对一元多项式的有序链表p求导*/ polynodepa,qa; pa=p->next; qa=p; while(pa) { if(pa->exp==0)/*从多项式中删除*pa结点并释放存储空间*/ { qa->next=pa->next; free(pa);p->coef--; pa=qa->next; } else/*修改*pa结点的系数和指数*/ { pa->coef*=pa->exp; pa->exp-=1; qa=pa;pa=pa->next; } } } voidprintpolyn(polynodep) {/*打印输出一元多项式p*/ intn;polynodeq; q=p->next;n=0; while(q) { n++; if(n==1) {if(q->exp==0)printf("%.2f",q->coef); elseif(q->exp==1) {if(q->coef==1)printf("x"); elseif(q->coef==-1)printf("-x"); else{printf("%.2f",q->coef);printf("x");} } elseif(q->coef==1)printf("x^%d",q->exp); elseif(q->coef==-1)printf("-x^%d",q->exp); elseprintf("%.2fx^%d",q->coef,q->exp); }/*if(n==1)*/ elseif(q->exp==0)printf("+%.2f",q->coef); elseif(q->exp==1) {if(q->coef==1)printf("+x"); elseif(q->coef==-1)printf("-x"); elseif(q->coef>0)printf("+%.2fx",q->coef); elseprintf("%.2fx",q->coef); } elseif(q->coef==1)printf("+x^%d",q->exp); elseif(q->coef==-1)printf("-x^%d",q->exp); elseif(q->coef>0)printf("+%.2fx^%d",q->coef,q->exp); elseprintf("%.2fx^%d",q->coef,q->exp); q=q->next; }/*while*/ }/*printpolyn*/ main() { polynodep; intm; printf("\ninputm(多项式的项数): "); scanf("%d",&m); p=(polynode)malloc(sizeof(pnode)); creatpolyn(p,m); printf("\np(x)="); printpolyn(p); derivative(p); printf("\np'(x)="); printpolyn(p); getchar(); getchar(); } 5.测试结果 实例一结果图形 6.实习心得 程序输入系数和指数,求一元多项式的导数,并将其存储在单链表或单链循环链表中。 从而输出一元多项式以及它的导数多项式。 若多项式中含有常数,那么它的导数是零,程序将会删除导数后出现的零项,来释放链表中的空间,若不是常数,则求导后,会显示出来,在求导式中。 这个程序的单链表是以CEOF为头结点,NEW为尾节点,其中TAIL等于尾节点,尾节点的下一个是不存在的。 即NEW->NEXT=NULL。 单链表循环p coefexpnew=tail→coefexptail->next→coef(new)expnew=null 尾节点对应头结点 1.实例描述 顺序存储的线性表的插入与删除操作。 在顺序循环存储表中插入或删除一个数据,通过输入函数来确定线性表中元素个数,以及插入元素或删除元素的位置。 2.实例分析 1)建立线性表 2)从线性表插入一个元素 3)从线性表中删除一个元素 3.设计思路 在这实验中,首先要确定输入元素的个数最大为多少,MAXSIZE<=100。 printf("pleaseinputthenumberforn\n"); printf("n="); scanf("%d",&n); 通过函数来确定输入的元素个数及其值是多少。 确定线性表中插入元素 intsq_insert(intlist[],int*p_n,inti,intx) {intj; if(i<0||i>*p_n)return (1); if(*p_n==MAXSIZE)return (2); for(j=*p_n+1;j>i;j--) list[j]=list[j-1]; list[i]=x; (*p_n)++; return(0); } /*删除线性表中的元素*/ intsq_delete(intlist[],int*p_n,inti) {intj; if(i<0||i>=*p_n)return (1); for(j=i+1;j<=*p_n;j++) list[j-1]=list[j]; (*p_n)--; return(0); } 如果输入元素不合条件,返回一,如果等于最大元素值,返回2,,否则进入FOR循环,输入元素x,则线性表元素右移一位。 然后返回元素个数,即(*p_n)++; 。 删除元素和插入元素相反,线性表元素左移一位,然后返回元素个数,即(*p_n)--;。 Return(0)。 4.实例程序实现 实例二程序 #include #defineMAXSIZE100 intlist[MAXSIZE]; intn; /*在线性表中插入元素*/ intsq_insert(intlist[],int*p_n,inti,intx) {intj; if(i<0||i>*p_n)return (1); if(*p_n==MAXSIZE)return (2); for(j=*p_n+1;j>i;j--) list[j]=list[j-1]; list[i]=x; (*p_n)++; return(0); } /*删除线性表中的元素*/ intsq_delete(intlist[],int*p_n,inti) {intj; if(i<0||i>=*p_n)return (1); for(j=i+1;j<=*p_n;j++) list[j-1]=list[j]; (*p_n)--; return(0); } /*主程序*/ voidmain() {inti,x,temp; printf("pleaseinputthenumberforn\n"); printf("n="); scanf("%d",&n); for(i=0;i<=n;i++) {printf("list[%d]=",i); scanf("%d",&list[i]);} printf("Thelistbeforeinsertionis\n"); for(i=0;i<=n;i++)printf("%d",list[i]); printf("\n"); printf("pleaseinputthepositionwhereyouwanttoinsertavalue\nposition="); scanf("%d",&i); printf("pleaseinputthevalueyouwanttoinsert.\nx="); scanf("%d",&x); temp=sq_insert(list,&n,i,x); switch(temp) {case0: printf("Theinsertionissuccessful! \n"); printf("Thelistisafterinsertionis\n"); for(i=0;i<=n;i++)printf("%d",list[i]); printf("\n"); printf("%d\n",n); break; case1: case2: printf("Theinsertionisnotsuccessful! \n");break;} /*deleting*/ printf("Thelistbeforedeletingis\n"); for(i=0;i<=n;i++)printf("%d",list[i]); printf("\n"); printf("pleaseinputthepositionwhereyouwanttodeleteavalue\nposition="); scanf("%d",&i); temp=sq_delete(list,&n,i); switch(temp) {case0: printf("Thedeletingissuccessful! \n"); printf("Thelistisafterdeletingis\n"); for(i=0;i<=n;i++)printf("%d",list[i]); printf("\n"); printf("%d",n); break; case1: printf("Thedeletingisnotsuccessful! ");break;} } 5.测试结果 实例二结果图形 6.实习心得 在插入或删除某个元素时,必须要注意删除或插入的元素在你输入的元素个数范围之内,插入值或删除值的大小则与元素个数无关。 程序会自动计算动作之后的元素个数,加一或则减一,以及新生成的序列,例如: 12334567,它的长度为7个元素,原序列右移一位。 而接下来的序列则是被选择删除了一个元素: 5。 新生成了一个新的序列,1333467,缺少了一个5,长度变为6,序列“12334567”左移一位。 上机实训2: 栈和队列的应用 姓名: 何旭飞班级: 电信081日期: 11年04月18日 1.实例一描述 通用数制转换程序: 将一个十进制数转换成其他进制的数。 2.实例一分析 常用的数制有: 二进制、八进制、十进制、十六进制。 数制转换就是利用“待转换数与相应的进制数反复相除,所得余数的逆置即为转换结果”的方法,本实例的功能就是将一个十进制数转换成其他进制的数。 假设待转换的十进制数为m,要转换成一个n进制的数,转换的具体方法如下: 1)用m除以n,得到相应的余数,将余数进栈stack(栈stack初始为空)。 2)用上一步所得的商再除以n,得到的余数继续进栈stack。 3)反复作 (2)直到商为0,将最后一次所得的余数也进栈。 4)对栈stack依次进行出栈操作,直至栈stack为空,所得结果即为转换结果。 3.设计思路 栈是限定仅在表尾进行插入或删除操作的线性表。 假设栈S=(a1,a2,…,an),则称a1为栈底元素,an为栈顶元素。 栈中元素按a1,a2,…,an的次序进栈,退栈的第一个元素应为栈顶元素。 栈的修改是按后进先出的原则进行的。 因此,栈又称为后进先出的线性表。 利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。 栈的链式存储结构称为链栈。 链栈是不带头结点的单链表。 队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素。 最早进入队列的元素最早离开。 在队列中,允许插入的一端叫做队尾,允许删除的一端则称为队头。 假设队列为Q=(a1,a2,…,an),那么,a1就是队头元素素,an则是队尾元素。 队列中的元素是按照a1,a2,…,an的顺序进入的,退出队列也只能按照这个次序依次退出,为了克服顺序队列中“假溢出”,通常将一维数组Sq.elem[0]到Sq.elem.[MaxSize-1]看成是一个首尾相接的圆环,即Sq.elem[0]与Sq.elem.[maxsize-1]相接在一起。 这种形式的顺序队列称为循环队列。 当Sq->front==Sq->rear,则称为队空,当(Sq->rear+1)modMaxSize=Sq->front,则称为队满。 用链表表示的队列称为链队列,一个链队列显然需要两个分别指示队头和队尾的指针(分别称为头指针和尾指针)才能唯一确定。 为了操作方便,给链队列添加一个头结点,并令头指针指向头结点。 由此,空的链队列的判决条件为头指针和尾指针均指向头结点。 链队列的操作即为单链表的插入和删除操作的特殊情况,只是尚需修改尾指针或头指针。 4.程序实现 实例一程序 #include"stdio.h" #defineMAX50 charstack[MAX];/*栈的类型定义为字符型*/ inttop=0;/*初始化栈*/ voidpush(charx)/*进栈子函数*/ {if(top>=MAX) printf("overflow"); else{ stack[top]=x;/*进栈操作*/ top++;} } charpop()/*出栈子函数,返回值类型为字符型*/ {if(top==0){ printf("underflow"); return(NULL);} top--; return(stack[top]); } intempty()/*判栈空子函数,空返回0,不空返回1*/ {if(top==0) return(0); else return (1); } charfun(intx)/*整数转换成字符子函数*/ {chart; switch(x){ case0: t='0';break; case1: t='1';break; case2: t='2';break; case3: t='3';break; case4: t='4';break; case5: t='5';break; case6: t='6';break; case7: t='7';break; case8: t='8';break; case9: t='10';break; case10: t='A';break; case11: t='B';break; case12: t='C';break; case13: t='D';break; case14: t='E';break; case15: t='F';break;} return(t);/*将转换后的字符返回,以备进栈*/ } voidmain() {intm,n,x,t,r; chary; while (1){/*可循环输入待转换数*/ printf("pleaseinputtheoperation: \n");/*1为继续,0为退出*/ printf("1iscontinue\t0ise
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 06054109
![提示](https://static.bdocx.com/images/bang_tan.gif)