算法与数据结构实验册.doc_第1页
算法与数据结构实验册.doc_第2页
算法与数据结构实验册.doc_第3页
算法与数据结构实验册.doc_第4页
算法与数据结构实验册.doc_第5页
免费预览已结束,剩余36页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

金陵科技学院实验报告实验报告书写要求实验报告原则上要求学生手写,要求书写工整。若因课程特点需打印的,要遵照以下字体、字号、间距等的具体要求。纸张一律采用A4的纸张。实验报告书写说明实验报告中一至四项内容为必填项,包括实验目的和要求;实验仪器和设备;实验内容与过程;实验结果与分析。各院部可根据学科特点和实验具体要求增加项目。填写注意事项(1)细致观察,及时、准确、如实记录。(2)准确说明,层次清晰。(3)尽量采用专用术语来说明事物。(4)外文、符号、公式要准确,应使用统一规定的名词和符号。(5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。实验报告批改说明实验报告的批改要及时、认真、仔细,一律用红色笔批改。实验报告的批改成绩采用百分制,具体评分标准由各院部自行制定。实验报告装订要求实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。实验项目名称: 顺序表 实验学时: 2 同组学生姓名: 全班同学 实验地点: 1318 实验日期: 10 月14号 实验成绩: 批改教师: 批改时间: 实验1 顺序表一、实验目的和要求掌握顺序表的定位、插入、删除等操作。二、实验仪器和设备Turbo C 2.0三、实验内容与过程(含程序清单及流程图)1、必做题(1) 编写程序建立一个数续表,并逐个输出顺序表中所有数据元素的值。编写主函数测试结果。(2) 编写顺序表定位操作子函数,在顺序表中查找是否存在数据元素x。如果存在,返回顺序表中和x值相等的第1个数据元素的序号(序号从0开始编号);如果不存在,返回1。编写主函数测试结果。(3) 在递增有序的顺序表中插入一个新结点x,保持顺序表的有序性。解题思路:首先查找插入的位置,再移位,最后进行插入操作;从第一个元素开始找到第一个大于该新结点值x的元素位置i即为插入位置;然后将从表尾开始依次将元素后移一个位置直至元素i;最后将新结点x插入到i位置。(4) 删除顺序表中所有等于X的数据元素。2、选做题(5) 已知两个顺序表A和B按元素值递增有序排列,要求写一算法实现将A和B归并成一个按元素值递减有序排列的顺序表(允许表中含有值相同的元素)。程序清单:第一题:#include#define maxsize 100typedef structint datatype maxsize;int last;sequenlist;void main()sequenlist a=1,2,3,4,4;for(int i=0;ia.last;i+)printf(%d ,a.datatypei);第二题:#include#define maxsize 100typedef structint datatypemaxsize;int last;sequenlist;int search(sequenlist a,int x)for(int i=0;ia.last;i+)if(a.datatypei=x)return(i);return (-1);void main()sequenlist a=1,2,3,5,6,5;int b=1;printf(%d,search(a,b);第三题:#include #define maxsize 100typedef structint datatypemaxsize;int last ;sequenlist;sequenlist insert(sequenlist a,int x)for(int i=0;i=x)for(int j=a.last;ji;j-)a.datatypej=a.datatypej-1;a.datatypei=x;a.last=a.last+1; return (a);return a;void main()sequenlist a=1,2,3,4,5,6,6;sequenlist c;int b=1;c=insert(a,b); for(int i=0;ia.last;i+)printf(%d ,c.datatypei);第四题:#include#define maxsize 100typedef struct int datatypemaxsize;int last;sequenlist;sequenlist dele(sequenlist a,int x)for(int i=0;ia.last;i+)if(a.datatypei=x)for(int j=i;ja.last-1;j+)a.datatypej=a.datatypej+1;a.last=a.last-1;return a;void main()sequenlist a=1,2,3,4,5,5;sequenlist b;int x=4;b=dele(a,x);for(int i=0;ib.last;i+)printf(%d ,b.datatypei);第五题:#include#define maxsize 100typedef struct int datatypemaxsize;int last;sequenlist;sequenlist combine(sequenlist a,sequenlist b)int i=0;sequenlist c;c.last =0;int j=a.last-1;int h=b.last-1;while(j=0 & h=0)if(a.datatypej=b.datatypeh)c.datatypei+=a.datatypej-;c.last+;elsec.datatypei+=b.datatypeh-;c.last+;if(j=-1 & h=0)while(h=0)c.datatypei+=b.datatypeh-;c.last+;return c;else if(j=0 & h=-1)while(j=0)c.datatype i+=a.datatypej-;c.last+;return c;return c;void main()sequenlist a=1,3,4,5,7,8,6;sequenlist b=2,3,4,5,6,5;sequenlist c=combine(a,b);for(int i=0;ic.last;i+)printf(%d ,c.datatypei);四、实验结果与分析(程序运行结果及其分析)第一题:1 2 3 4 此题即直接输出第二题:0 此题输出1的位置为0第三题:1 1 2 3 4 5 此题插入一个新节点1后有序输出第四题:1 2 3 5 此题删除一个节点4第五题:8 7 6 5 4 4 3 3 2 1 此题用一个新的顺序表存储新的序列五、实验体会(遇到问题及解决办法,编程后的心得体会)我认为第三题和第五题比较有挑战性,第三题写了 insert函数,但此时实参给实参的传递是值传递,因此要在函数体内写输出函数或把新的书序表返回给主函数;第五题有很多易错地方,要做到仔细细心!第五题的解题思路是:分别把两个书序表从后往前比较,谁大谁的值就赋值新的序列表,并且把记录它下标的值减一;如果有一个序列表的值已经赋值完毕,就把另一个序列表的剩下的值从后往前依次赋值给新的序列表。实验项目名称: 单链表 实验学时: 2 同组学生姓名: 全班同学 实验地点: 1318 实验日期: 10月21号 实验成绩: 批改教师: 批改时间: 实验2 单链表一、实验目的和要求1、实验目的掌握单链表的定位、插入、删除等操作。2、实验要求(1)注意链表的空间是动态分配的,某结点不用之后要及时进行物理删除,以便释放其内存空间。(2)链表不能实现直接定位,一定注意指针的保存,防止丢失。二、实验仪器和设备Turbo C 2.0三、实验内容与过程(含程序清单及流程图)1、必做题(1) 编写程序建立一个单链表,并逐个输出单链表中所有数据元素。(2) 在递增有序的单链表中插入一个新结点x,保持单链表的有序性。解题思路:首先查找插入的位置然后进行插入操作;从第一个结点开始找到第一个大于该新结点值的结点即为插入位置;然后在找到的此结点之前插入新结点;注意保留插入位置之前结点的指针才能完成插入操作。(3) 编写实现带头结点单链表就地逆置的子函数,并编写主函数测试结果。2、选做题已知指针LA和LB分别指向两个无头结点单链表的首元结点。要求编一算法实现,从表LA中删除自第i个元素起共len个元素后,将它们插入到表LB中第j个元素之前。程序清单:第一题:#include#includetypedef struct nodeint data;struct node *next;linklist;void main()linklist *head,*r,*p;int a;head=malloc(sizeof(linklist);while(r!=NULL)printf(%d,r-data);r=r-next;第二题:#include#includetypedef struct nodeint data;struct node *next;linklist;void main()linklist *head,*r,*p,*q;int a;head=malloc(sizeof(linklist);r=head;printf(请输入原链表的值:(输入0时将结束输入)n);scanf(%d,&a);while(a!=0)p=malloc (sizeof(linklist);p-data=a;r-next=p;r=p;scanf(%d,&a);r-next=NULL;第三题:#include stdio.h#include stdlib.htypedef struct node int data; struct node *next;linklist;main() int a; linklist *head,*s,*r,*p,*q,*t; head=malloc(sizeof(linklist); r=head; printf(Input some numbers:); scanf(%d,&a); while(a!=0) s=malloc(sizeof(linklist); s-data=a; r-next=s; r=s; scanf(%d,&a); r-next=NULL; printf(n The linklist before changed is:n ); p=head-next; while(p) printf(%d,p-data); p=p-next; p=head-next; q=p-next; while(q!=NULL) t=q-next; q-next=p; p=q; q=t; head-next-next=NULL; head-next=p; q=a;while(q-next!=NULL)q=q-next;/q指向a的尾节点;scanf(%d,&h1);printf(请输入第从一条链的第i个元素删除几个元素n);scanf(%d,&h2);printf(请输入在第二条链的第几个元素前开始插入n);scanf(%d,&h3);b=fun(a,b,h1,h2,h3);printf(修改后的链表为:n);while(b!=NULL) printf(%d ,b-data); b=b-next ;r=head;scanf(%d,&a);while(a!=0)p=malloc (sizeof(linklist);p-data=a;r-next=p;r=p;scanf(%d,&a);r=head-next; p=malloc(sizeof(linklist);printf(请输入插入节点的值:n);scanf(%d,&p-data); p-next=NULL;r=head-next;q=head;if(head-next =NULL) head-next =p;elsewhile( r!=NULL & r-datadata)q=q-next;r=r-next;p-next =r;q-next=p;/q指向r的前一个节点r=head-next;printf(插入后的链表是:n);while(r!=NULL)printf(%d ,r-data);r=r-next;printf(nAfter changed:n); p=head-next; while(p!=NULL) printf(%d,p-data);p=p-next; 第四题:#include#includetypedef struct nodeint data;struct node *next;linklist;linklist * fun(linklist *a,linklist *b,int i,int len,int j)linklist *p,*q,*r,*z;int h;p=a;if(i=1)q=p;for(h=1;hnext;/q指向第len+1个节点a=q;elsefor(h=1;hnext;/p指向第i-1个节点 q=p-next;for(h=1;hnext;/q指向第len+1个节点p-next=q;/链表a中已经删除了len个节点p=b;四、实验结果与分析(程序运行结果及其分析)第一题:1 2 3 4 5此题较简单建立链表后可以直接输出(运用指针后移直至指针指向空)第二题:请输入原链表的值:(输入0时将结束输入)1 2 3 4 5 0请输入插入节点的值:2插入后的链表是:1 2 2 3 4 5此题要思考全面特别是原链表为空或插入节点比原链表的任意一个节点都大时要考虑到!第三题:请输入单链表:(以0结束)1 2 3 4 5 0逆置后的链表是:5 4 3 2 1此题用p指向一个节点q指向p的前一个节点,p的指针域指向q.此时应该用一个指针记录p的后继节点,因为一旦p的指针指向q时将找不到p的后继节点!第四题:请输入要建立的链表:(以0结束)1 2 3 4 5 0请输入要建立的链表:(以0结束)1 2 3 4 5 0请输入在第一条链的第几个元素开始删除:1请输入从第一条链的第i个元素删除几个元素:4修改后的链表为:5 1 2 3 4 5五、实验体会(遇到问题及解决办法,编程后的心得体会) 本次试验最要花心思的是第四题因为其需要分情况讨论,比如是从第一条的第一个元素开始删除还是从其他元素。插入的时候是从第二条链的第一个元素开始插入还是从其他位置插入等。实验项目名称: 堆栈和队列 实验学时: 2 同组学生姓名: 全班同学 实验地点: A203 实验日期: 10月28 号 实验成绩: 批改教师: 批改时间: 实验3 堆栈和队列一、实验目的和要求(1)掌握应用栈解决问题的方法。(2)掌握利用栈进行表达式求和的算法。(3)掌握队列的存储结构及基本操作实现,并能在相应的应用问题中正确选用它们。二、实验仪器和设备Turbo C 2.0三、实验内容与过程(含程序清单及流程图)1、必做题(1) 判断一个算术表达式中开括号和闭括号是否配对。(2) 测试“汉诺塔”问题。(3) 假设称正读和反读都相同的字符序列为”回文”,试写一个算法判别读入的一个以为结束符的字符序列是否是“回文”。2、选做题在顺序存储结构上实现输出受限的双端循环队列的入列和出列算法。设每个元素表示一个待处理的作业,元素值表示作业的预计时间。入队列采取简化的短作业优先原则,若一个新提交的作业的预计执行时间小于队头和队尾作业的平均时间,则插入在队头,否则插入在队尾。程序清单:第一题:#include#define maxsize 100typedef structchar datamaxsize;int top;seqstack;void main()seqstack b;char a;b.top=0;b.top-;a=getchar();if(b.top=0)printf(配对成功);elseprintf(配对不成功);第二题:#includevoid hanoi(int n,char a,char b,char c) if(n=1) printf(n Move disk %d from pile %c to pile %c,n,a,c);/n等于1时只需把盘子1移向c; else hanoi(n-1,a,c,b);/把n-1个盘子移向B printf(n Move disk %d from pile %c to pile %c,n,a,c);/把第n个盘子移向C hanoi(n-1,b,a,c);/把n-1个盘子移向C i+;a.top+;a.top-;ifor(i=0;stri!=;i+)if(a.dataa.top=stri)a.top-;if(a.top=-1)printf(是回文数);elseprintf(不是回文数);第四题:#include#define maxsize 100typedef structint datamaxsize;int front;int rear;sequeue;void ruDui(sequeue *a,int x)int aver;if(a-front=(a-rear+1)%maxsize)printf(列满);elseaver=(a-dataa-rear+a-dataa=getchar();while(a!=0)if(a=()b.top+;b.datab.top=a;if(a=)if(b.top=0)printf(不配对);exit();else void main() int n; printf(n Please enter the number of disks to be moved:); scanf(%d,&n); hanoi(n,A,B,C);/不需知道盘子是怎么移动的,只要知道移动n+1个盘子与移动n个盘子的关系,即移动N+1个盘子到C即是吧N个盘子移向b,再把第N个盘子/移向C,最后再把那个盘子移向第三题:#includetypedef structchar data100;int top;seqstack;void main()int i=0;char str20;seqstack a;a.top=0;gets (str);while(stri!=)a.dataa.top=stri;a-front+1)/2;if(xfront-;a-dataa-front+1=x;elsea-rear=(a-rear+1)%maxsize;a-dataa-rear=x;void chuDui(sequeue *a)if(a-rear=a-front)printf(列空);elsea-front=(a-front+1)%maxsize;printf(%d,a-dataa-front);void main()sequeue *a;sequeue b;a=&b;a-front=-1;a-rear=-1;ruDui(a,3)ruDui(a,5);ruDui(a,6);ruDui(a,1);chuDui(a);chuDui(a);chuDui(a);chuDui(a);chuDui(a);chuDui(a);实验结果与分析(程序运行结果及其分析)第一题:配对成功第二题: Please enter the number of disks to be moved:2 Move disk 1 from A to B Move disk 2 from A to C Move disk 1from B to C第三题:1221是回文数第四题:1356列空列空5、 实验体会(遇到问题及解决办法,编程后的心得体会) 本次试验我掌握了栈和队列的知识,栈有着先入后出的特性,队列则是先入先出第二题描述汉诺塔问题要用到递归的思想,需要用栈来解决!第四题较为麻烦要考虑到地址传递与值传递的区别,而且写程序的过程中也出现了较多了错误需要细心考虑,总体试验比较顺利!实验项目名称: 串 实验学时: 2 同组学生姓名: 全班同学 实验地点: A203 实验日期: 11月4号 实验成绩: 批改教师: 批改时间: 实验4 串一、实验目的和要求掌握串的存储及应用。二、实验仪器和设备Turbo C 2.0三、实验内容与过程(含程序清单及流程图)1、必做题(1) 编写输出字符串s中值等于字符ch的第一个字符的函数,并用主函数测试结果。(2) 编写输出字符串s中值等于字符ch的所有字符的函数,并用主函数测试结果。解题思路:可以将第一题程序改进成一个子函数,在本题中循环调用。(3) 设字符串采用单字符的链式存储结构,编程删除串s从位置i开始长度为k的子串。2、选做题假设以链结构表示串,编写算法实现将串S插入到串T中某个字符之后,若串T中不存在这个字符,则将串S联接在串T的末尾。提示:为提高程序的通用性,插入位置字符应设计为从键盘输入。程序清单:第一题:#include#define maxsize 100typedef struct char chmaxsize; int curlen;seqstring;main() int i; 第二题:#include#define maxsize 100typedef structchar chmaxsize;int curlen;seqstring;void search(seqstring a,char b)int i;for( i=0;ia.curlen;i+)if(a.chi=b)printf(ch=a.ch%d%=bn,i);void main()seqstring a=abcdefgc,8;char b=c;search(a,b);第三题:#include#includetypedef struct linknodechar data;struct linknode *next;linkstring;linkstring *creat()char ch;linkstring *a,*head;head=NULL;scanf(%c,&ch);while(ch!=$)a=malloc(sizeof(linkstring);a-data=ch;a-next=head;head=a;scanf(%c,&ch);return head;linkstring;linkstring *creat()char ch;linkstring *a,*head;head=NULL;scanf(%c,&ch);while(ch!=$)a=malloc(sizeof(linkstring);a-data=ch;a-next=head;head=a;scanf(%c,&ch);return head;linkstring *insert(linkstring *a,linkstring *b,char c)linkstring *d,*h,*I;int i;d=a;for(i=0;d-next!=NULL & d-data!=c;i+)d=d-next;if(d-next=NULL)d-next=b;/如果a中没有与C相同的字符或是最后一个字符与之相char ch; seqstring s=abcdefg,6; for(i=0;is.curlen;i+) printf(%c,s.chi); printf(请输入要找到的字符:n); scanf(%c,&ch); for(i=0;i=s.curlen) printf(Not find!n);linkstring * delete(linkstring *a,int i,int k)linkstring *b,*q;int c;b=a;for( c=0;b-next!=NULL & cnext;q=b-next;for(c=0;cnext;b-next=q;return a;void main()linkstring *a,*q,*r;a=creat();r=a;while(r!=NULL)printf(%c,r-data);r=r-next;printf(n);q=delete(a,2,3);while(q!=NULL)printf(%c,q-data);q=q-next;第四题:#include#includetypedef struct linknodechar data;struct linknode *next;同,则插队尾return a;else h=b;while(h-next!=NULL)h=h-next;/h指向b链的队尾I=d-next;/I指向d的后继节点d-next=b;h-next=I;return a;void main() linkstring *a=creat(); int i=0;linkstring *b=creat();linkstring *d;char ch;/printf(请输入h的值:);scanf(%c,&ch);d=insert(a,b,ch);while(d!=NULL)i+;printf(%c,d-data);d=d-next;printf(%d,i);四、实验结果与分析(程序运行结果及其分析)第一题:abcd请输入要找到的字符:dch=s.ch3=d第二题:Ch=a,ch2=b第一个等于b的下标是2Ch=a.ch7=b第二个等于b的下标是7第三题:asfdghk$khgdfsa运用后插法建立的链表串Khsa从第二个位子删除3个节点后的串第四题:asd$asd$dsdsaa五、实验体会(遇到问题及解决办法,编程后的心得体会) 因为有了前面单链表的知识,本次实验比较顺利,个人认为写程序用函数实现本比较好,因为函数可以被多次调用,提高了代码的可重用性。通过本次实验我不仅学会了串的建立方法,串的查询删除等,还切身体会了一些编程技巧运用的好处!实验项目名称: 二叉树 实验学时: 2 同组学生姓名: 全班同学 实验地点: A203 实验日期: 11月12号 实验成绩: 批改教师: 批改时间: 实验5 二叉树一、实验目的和要求(1)掌握二叉树的生成,以及前、中、后序遍历算法。(2)掌握应用二叉树递归遍历思想解决问题的方法。二、实验仪器和设备Turbo C 2.0三、实验内容与过程(含程序清单及流程图)1、必做题(1) 建立一棵二叉树。对此树进行前序遍历、中序遍历及后序遍历,输出遍历序列。(2) 在第一题基础上,求二叉树中叶结点的个数。(3) 在第一题基础上,求二叉树中结点总数。(4) 在第一题基础上,求二叉树的深度。2、选做题已知一棵完全二叉树存于顺序表sa中,sa.elem1sa.last存储结点的值。试编写算法由此顺序存储结构建立该二叉树的二叉链表。解题思路:根据完全二叉树顺序存储的性质来确定二叉树的父子关系即“还原”了二叉树,之后再按照二叉树二叉链表的构造方法进行建立。完全二叉树顺序存储的一个重要性质为,第i个结点的左孩子是编号为2i的结点,第i个结点的右孩子是编号为2i+1的结点。程序清单:第一题:#include #includetypedef struct nodechar data;struct node *lchild,*rchild;biTree;biTree * create() biTree *Q100; char ch; int front,rear;s=malloc(sizeof(biTree); s-data=ch; s-lchild=NULL; s-rchild=NULL; rear+;Qrear=s;if(rear=1) root=s; else if(s & Qfront) if(rear%2=0) Qfront-lchild=s;else Qfront-rchild=s; if(rear%2=1)front+; ch=getchar(); return root; void preOrder(biTree *a) if(a)printf(%c,a-data);int total(biTree *a)int num3,num4;if(a=NULL)return 0;else if(a-lchild=NULL & a-rchild=NULL) return 1;else num3=total(a-lchild);num4=total(a-rchild);return(num3+num4+1);int depth(biTree *a)int num1,num2;if(a=NULL) return 0;/else if(a-lchild=NULL & a-lchild=NULL)return 1;elsenum1=depth(a-lchild);num2=depth(a-rchild);if(num1=num2)return num1+1;else return num2+1;void main()biTree *a=create();printf(前序遍历的结果是:);void create (biTree *t,int i,sequenlist a)biTree *q=malloc (sizeof(biTree);biTree *r=malloc(sizeof(biTree);if(2*i+1lchild=NULL;q-rchild=NULL;r-lchild=NULL;r-rchild=NULL;q-data=a.elem2*i-1;r-data=a.elem2*i;t-lchild=q;t-rchild=r;create(q,2*i,a);create(r,2*i+1,a);void preOrder(biTree *t)if(t)printf(%c ,t-data);preOrder(t-lchild);preOrder(t-rchild); biTree *root,*s; root=NULL; front=1; rear=0;printf(请输入你要建立的二叉树的值:); ch=getchar(); while(ch!=#)s=NULL;if(ch!=)preOrder(a-lchild);preOrder(a-rchild); void inOrder(biTree *a) if(a)inOrder(a-lchild);printf(%c,a-data); inOrder(a-rchild); void afterOrder(biTree *a) if(a) afterOrder(a-lchild); afterOrder(a-rchild);printf(%c,a-data); int yeZhi(biTree *a)int num1,num2;if(a=NULL)return 0;else if(a-lchild=NULL & a-rchild=NULL) return 1;else num1=yeZhi(a-lchild);num2=yeZhi(a-rchild);return(num1+num2); preOrder(a);printf(n中序遍历的结果是:);inOrder(a);printf(n后序遍历的结果是:);afterOrder(a);printf(n叶子节点个数是:%d,yeZhi(a);printf(n总结点的个数是:%d,total(a);printf(n深度是:%d,depth(a);第二题:#include#include#define maxsize 100typedef struct char elemmaxsize;int last;sequenlist;typedef struct nodechar data;struct node *lchild,*rchild;biTree;void main()sequenlist a=1,2,3,4,5,6,7,7;biTree *root=malloc(sizeof

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论