1、金陵科技学院实验报告学 生 实 验 报 告 册(理工类)课程名称:算法与数据结构 专业班级: M13 软件工程 学生学号: 1321106033 学生姓名: 贾莹 所属院部: 龙蟠学院 指导教师: 徐永华 20 14 20 15 学年 第 一 学期金陵科技学院教务处制金陵科技学院实验报告实验报告书写要求实验报告原则上要求学生手写,要求书写工整。若因课程特点需打印的,要遵照以下字体、字号、间距等的具体要求。纸张一律采用 A4 的纸张。实验报告书写说明实验报告中一至四项内容为必填项,包括实验目的和要求;实验仪器和设备;实验内容与过程;实验结果与分析。各院部可根据学科特点和实验具体要求增加项目。填写
2、注意事项(1)细致观察,及时、准确、如实记录。(2)准确说明,层次清晰。(3)尽量采用专用术语来说明事物。 (4)外文、符号、公式要准确,应使用统一规定的名词和符号。(5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。实验报告批改说明实验报告的批改要及时、认真、仔细,一律用红色笔批改。实验报告的批改成绩采用百分制,具体评分标准由各院部自行制定。实验报告装订要求实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。金陵科技学院实验报告实验项目名称: 顺序表 实验学时: 2 同组学生姓名: 无 实验地点:
3、 A203 实验日期: 2014/10/13 实验成绩: 批改教师: 批改时间: 金陵科技学院实验报告实验 1 顺序表一、实验目的和要求掌握顺序表的定位、插入、删除等操作。二、实验仪器和设备Turbo C 2.0 / Visual C + 6.0三、实验内容与过程(含程序清单及流程图)1、必做题(1) 编写程序建立一个顺序表,并逐个输出顺序表中所有数据元素的值。编写主函数测试结果。(2) 编写顺序表定位操作子函数,在顺序表中查找是否存在数据元素 x。如果存在,返回顺序表中和 x 值相等的第 1 个数据元素的序号(序号从 0 开始编号) ;如果不存在,返回 1。编写主函数测试结果。(3) 在递增
4、有序的顺序表中插入一个新结点 x,保持顺序表的有序性。解题思路:首先查找插入的位置,再移位,最后进行插入操作;从第一个元素开始找到第一个大于该新结点值 x 的元素位置 i 即为插入位置;然后将从表尾开始依次将元素后移一个位置直至元素 i;最后将新结点 x 插入到 i 位置。(4) 删除顺序表中所有等于 X 的数据元素。2、选做题(5) 已知两个顺序表 A 和 B 按元素值递增有序排列,要求写一算法实现将 A 和 B 归并成一个按元素值递减有序排列的顺序表(允许表中含有值相同的元素) 。程序清单:1、必做题( 1) (2) (3) (4)#include#define maxsize 64typ
5、edef struct nodeint tag;/*记录线性表最后一个元素的下标*/int datamaxsize;list;/(1)顺序表的创建list CREAT()int i;金陵科技学院实验报告int a;list p;printf(“输入顺序表的值 ,-1表示输入结束:n“);scanf(“%d“,i=0;while(a!=-1)/*-1表示输入结束 */if(i=maxsize)printf(“顺序表已满 !“);break;elsep.datai=a;i+;scanf(“%d“,p.tag=i-1;printf(“创建完毕!n“);return p;/(2)顺序表的定位int G
6、ET(list p,int x)/*存在返回下标,不存在返回-1。*/int i;for(i=0;itagdata0)for(j=p-tag;j=0;j-)金陵科技学院实验报告p-dataj+1=p-dataj;p-data0=x;else if(xp-datap-tag)p-datap-tag+1=x;elsefor(i=1;itag;i+)if(xp-datai j=i+1;j-)p-dataj+1=p-dataj;p-datai+1=x;p-tag+;printf(“成功插入!“);elseprintf(“顺序表已满 ,无法插入!“);/(4)顺序表的删除list DELETE(list
7、 p,int x)/*删除顺序表中所有数据元素为 x 的数*/int i=0,j;while(ip.dataj)temp=p.datai;p.datai=p.dataj;p.dataj=temp;printf(“排序完成!“);return p;/顺序表的打印void PRINT(list p)int i;printf(“ntag=%dn“,p.tag);for(i=0;i#define maxsize 64typedef struct nodeint tag;/*记录线性表最后一个元素的下标*/金陵科技学院实验报告int datamaxsize;list;/顺序表的创建list CREAT(
8、)int i;int a;list p;printf(“输入顺序表的值 ,-1表示输入结束:n“);scanf(“%d“,i=0;while(a!=-1)/*-1表示输入结束 */if(i=maxsize)printf(“顺序表已满 !“);break;elsep.datai=a;i+;scanf(“%d“,p.tag=i-1;printf(“创建完毕!n“);return p;/顺序表的打印void PRINT(list p)int i;printf(“ntag=%dn“,p.tag);for(i=0;ilb.dataj)lc.datak=la.datai;i-;elselc.datak=l
9、b.dataj;j-;k+;while(i!=-1)lc.datak=la.datai;i-;k+;while(j!=-1)lc.datak=lb.dataj;j-;k+;lc.tag=la.tag+lb.tag+1;return lc;/主函数int main()list a,b,c;a.tag=-1;b.tag=-1;a=CREAT();PRINT(a);b=CREAT();PRINT(b);c=MERGE(a,b);PRINT(c);return 0;金陵科技学院实验报告四、实验结果与分析(程序运行结果及其分析)1、必做题(1) (2) (3) (4)2、选做题(5)金陵科技学院实验报告
10、五、实验体会(遇到问题及解决办法,编程后的心得体会) 基于顺序表上的操作相对还是比较简单的,就相当于对数组进行操作,但是代码的篇幅较长,需要一段一段的运行排错,而且添加必要的注释便于阅读。金陵科技学院实验报告实验项目名称: 单链表 实验学时: 2 同组学生姓名: 无 实验地点: A203 实验日期: 2014/10/20 实验成绩: 批改教师: 批改时间: 金陵科技学院实验报告实验 2 单链表一、实验目的和要求1、实验目的掌握单链表的定位、插入、删除等操作。2、实验要求(1)注意链表的空间是动态分配的,某结点不用之后要及时进行物理删除,以便释放其内存空间。(2)链表不能实现直接定位,一定注意指
11、针的保存,防止丢失。二、实验仪器和设备Turbo C 2.0 / Visual C + 6.0三、实验内容与过程(含程序清单及流程图)1、必做题(1) 编写程序建立一个单链表,并逐个输出单链表中所有数据元素。(2) 在递增有序的单链表中插入一个新结点 x,保持单链表的有序性。解题思路:首先查找插入的位置然后进行插入操作;从第一个结点开始找到第一个大于该新结点值的结点即为插入位置;然后在找到的此结点之前插入新结点;注意保留插入位置之前结点的指针才能完成插入操作。(3) 编写实现带头结点单链表就地逆置的子函数,并编写主函数测试结果。2、选做题已知指针 LA 和 LB 分别指向两个无头结点单链表的首
12、元结点。要求编一算法实现,从表 LA 中删除自第 i 个元素起共 len 个元素后,将它们插入到表LB 中第 j 个元素之前。程序清单:1、必做题( 1) (2) (3)#include#includetypedef struct nodeint data;struct node *next;linklist;/(1)单链表的建立(带头结点的尾插法)linklist *CREAT()金陵科技学院实验报告linklist *head=NULL,*p=NULL,*s=NULL;int a;head=(linklist *)malloc(sizeof(linklist);p=head;printf(
13、“输入顺序表的值 ,-1表示输入结束:n“);scanf(“%d“,while(a!=-1)s=(linklist *)malloc(sizeof(linklist);if(s=NULL)exit(0);s-data=a;p-next=s;p=s;scanf(“%d“,s-next=NULL;printf(“建立完毕!n“);return head;/(2)单链表的插入linklist *INSERT(linklist *head,int x)/*在递增链表中插入 x,保持链表的有序性。*/linklist *s=NULL,*p=NULL;p=(linklist *)malloc(sizeof
14、(linklist);p-data=x;if(head-next=NULL | head-next-data=x)p-next=head-next;head-next=p;return head;s=head-next;while(s s-next=p;return head;s=s-next;金陵科技学院实验报告s-next=p;p-next=NULL;return head;/(3)单链表的逆置linklist *REVERSE(linklist *head)linklist *s=NULL,*p=NULL;p=head-next;if(head-next=NULL)return head
15、;s=p-next;while(p-next)p-next=s-next;s-next=head-next;head-next=s;dos=s-next;while(s!=p-next);printf(“逆转成功!n“);return head;/单链表的排序linklist *SORT(linklist *head1)/*直接插入法排序*/linklist *p,*pre;p=head1-next;head1-next=NULL;while(p)head1=INSERT(head1,p-data);p=p-next;printf(“排序完成!n“);return head1;/单链表的打印v
16、oid PRINT(linklist *head)金陵科技学院实验报告linklist *s=NULL;s=head-next;while(s)printf(“%d “,s-data);s=s-next;printf(“打印完毕!nn“);/主函数int main()linklist *lhead=NULL;int m;lhead=CREAT();PRINT(lhead);lhead=SORT(lhead);PRINT(lhead);printf(“请输入你要插入的数 :n“);scanf(“%d“,lhead=INSERT(lhead,m);PRINT(lhead);lhead=REVERS
17、E(lhead);PRINT(lhead);return 0;2、选做题( 4)#include#includetypedef struct nodeint data;struct node *next;linklist;/(4)单链表的连接linklist *CONNECT(linklist *la,int i,linklist *lb,int j)linklist *q=NULL,*w=NULL,*e=NULL;q=la;w=lb;while(i-2!=0 金陵科技学院实验报告i-;q-next=NULL;while(j-2!=0 j-;q-next=w-next;w-next=la;re
18、turn lb;/单链表的建立(不带头结点的尾插法)linklist *CREAT()linklist *head=NULL,*p=NULL,*s=NULL;int a;printf(“输入顺序表的值 ,-1表示输入结束:n“);scanf(“%d“,while(a!=-1)s=(linklist *)malloc(sizeof(linklist);if(s=NULL)exit(0);s-data=a;if(head=NULL)head=s;elsep-next=s;p=s;scanf(“%d“,p-next=NULL;printf(“建立完毕!n“);return head;/单链表的打印v
19、oid PRINT(linklist *head)linklist *s=NULL;s=head;while(s)printf(“%d “,s-data);金陵科技学院实验报告s=s-next;printf(“打印完毕!nn“);/主函数int main()linklist *h1,*h2;printf(“创建链表 1n“);h1=CREAT();PRINT(h1);printf(“创建链表 2n“);h2=CREAT();PRINT(h2);printf(“删除单链表 1 后第 3 个元素后所有元素, n“);printf(“剩余元素插入单链表 2 中第 3 个元素之前 :n“);h2=CO
20、NNECT(h1,3,h2,3);PRINT(h2);return 0;四、实验结果与分析(程序运行结果及其分析)1、必做题(1) (2) (3)2、选做题(4)金陵科技学院实验报告五、实验体会(遇到问题及解决办法,编程后的心得体会)在做必做题和选做题时,我分别把单链表带头结点和不带头结点的方式都熟悉了一下,并且单链表的逆置使用了头插法重新建立带头结点的新链表,就不需要每插入一个元素就遍历单链表一次,此外,逆置用递归也是可以做的。金陵科技学院实验报告实验项目名称: 堆栈和队列 实验学时: 2 同组学生姓名: 无 实验地点: A203 实验日期: 2014/10/27 实验成绩: 批改教师: 批
21、改时间: 金陵科技学院实验报告实验 3 堆栈和队列一、实验目的和要求(1)掌握应用栈解决问题的方法。(2)掌握利用栈进行表达式求和的算法。(3)掌握队列的存储结构及基本操作实现,并能在相应的应用问题中正确选用它们。二、实验仪器和设备Turbo C 2.0 / Visual C + 6.0三、实验内容与过程(含程序清单及流程图)1、必做题(1) 判断一个算术表达式中开括号和闭括号是否配对。(2) 假设称正读和反读都相同的字符序列为”回文”,试写一个算法判别读入的一个以为结束符的字符序列是否是“回文” 。2、选做题(1)测试“ 汉诺塔”问题。(2)在顺序存储结构上实现输出受限的双端循环队列的入列和
22、出列算法。设每个元素表示一个待处理的作业,元素值表示作业的预计时间。入队列采取简化的短作业优先原则,若一个新提交的作业的预计执行时间小于队头和队尾作业的平均时间,则插入在队头,否则插入在队尾。程序清单:1、必做题( 1)#include#include#define N 64/链栈的构造typedef struct nodechar ch;struct node *next;linkstack;/链栈的进栈linkstack *PUSH(linkstack *top,char x)linkstack *p=NULL;p=(linkstack *)malloc(sizeof(linkstack)
23、;p-ch=x;金陵科技学院实验报告p-next=top;return p;/链栈的出栈void POP(linkstack *top)(*top)=(*top)-next;/链栈的判栈空int EMPTY(linkstack *top)if(top=NULL)return 1;return 0;/1(1)判断表达式的括号是否配对void PAIR(char exp)linkstack *t=NULL;int i,k;int flag=0;/*标记表达式中是否存在括号*/i=0;while(expi!=0)if(expi=()t=PUSH(t,();flag=1;else if(expi=)P
24、OP(i+;k=EMPTY(t);if(k else if(k)printf(“表达式中不存在括号。 n“);elseprintf(“表达式中括号不配对。 n“);/主函数int main()金陵科技学院实验报告int y,n,l;char cN;printf(“请输入你想要验证的表达式个数 :“);scanf(“%d“,getchar();for(l=0;l#include/带双链表的队列构造typedef struct dnodechar ch;struct dnode *prior,*next;linklist;typedef struct linklist *front,*rear;l
25、inkqueue;/1(2)判断字符序列是否是回文void PALINDROME(linkqueue *q,int j)int k;linklist *la,*lb;la=q-front-next;lb=q-rear;for(k=0;kch=lb-ch)la=la-next;lb=lb-prior;if(la-ch=lb-ch)printf(“该字符序列是回文 !n);else金陵科技学院实验报告printf(“该字符序列不是回文 !n“);/队列的置空void STUNULL(linkqueue *q)q-front=(linklist*)malloc(sizeof(linklist);if
26、(q-front=NULL)exit(0);q-front-next=NULL;q-front-prior=NULL;q-rear=q-front;/队列的入队void ENQUEUE(linkqueue *q,char x,int *j)q-rear-next=(linklist *)malloc(sizeof(linklist);if(q-rear-next=NULL)exit(0);q-rear-next-ch=x;q-rear-next-prior=q-rear;q-rear=q-rear-next;q-rear-next=NULL;(*j)+;int main()linkqueue
27、p;char y;int i=0;STUNULL(printf(“请输入一个字符序列 ,以 结束:“);y=getchar();while(y!=)ENQUEUE(y=getchar();PALINDROME(return 0;2、选做题( 1)#include#define N 64/顺序栈的构造金陵科技学院实验报告typedef struct nodeint dataN;char naem;int top;sqstack;/顺序栈的置空void SETNULL(sqstack *q)q-top=-1;/顺序栈的进栈int PUSH(sqstack *q,int x)if(q-top=N-1
28、)return 0;q-top+;q-dataq-top=x;return 1;/顺序栈的出栈int POP(sqstack *q,int *x)if(q-top=-1)return 0;(*x)=q-dataq-top;q-top-;return 1;/盘子的移动void MOVE(sqstack *x,sqstack *y)int l;POP(x,printf(“nttt%d 环%c 柱子“,l,y-naem);PUSH(y,l);/汉诺塔的递归运算int HANOI(int n,sqstack *a,sqstack *b,sqstack *c)static int i=0;if(n=1)
29、金陵科技学院实验报告MOVE(a,c);i+;elseHANOI(n-1,a,c,b);MOVE(a,c);i+;HANOI(n-1,b,a,c);return i;/主函数int main()int m,t,k;sqstack A,B,C;SETNULL(SETNULL(SETNULL(A.naem=A;B.naem=B;C.naem=C;printf(“请输入汉诺塔中圆环的数目 :“);scanf(“%d“,for(t=m;t0;t-)PUSH(printf(“nt 假设有三根柱子 A、B、C,开始时 A 柱子上有 1%d 环,并且它们是按照从小到大的顺序放在 A 柱子上的,按照汉诺塔规则
30、,将 A 柱子上所有环通过 B 柱子,移动到 C 柱子的则移动方法为: nn“,m);k=HANOI(m,printf(“nn 总共需要移动的次数为:%d 次n“,k);return 0;2、选做题( 2)#include#include# define N 64typedef struct int *base;int front,rear;sqqueue;金陵科技学院实验报告/顺序循环队列的置空int SETNULL(sqqueue *q)q-base=(int *)malloc(N*sizeof(int);if(q=NULL)exit(0);q-front=q-rear=0;return
31、1;/2、选做题(2) 顺序循环队列的短作业优先原则进队int ENQUEUE(sqqueue *q,int e)if(q-rear+1)%N=q-front)return 0;if( (e*2) = (q-baseq-front+q-baseq-rear-1) )q-baseq-rear=e;q-rear=(q-rear+1)%N;elseq-front=(q-front-1)%N;q-baseq-front=e;printf(“队头元素为:%d,队尾元素为:%d;“,q-baseq-front,q-baseq-rear-1);return 1;/顺序循环队列的打印void PRINT(sq
32、queue *q)int f,r;f=q-front,r=q-rear;while(f!=r)printf(“%d “,q-basef);f=(f+1)%N;printf(“n“);/主函数int main()金陵科技学院实验报告sqqueue que;int m,p;SETNULL(printf(“请输入你要插入的元素 ,以-1结束:n“);scanf(“%d“,while(m!=-1)ENQUEUE(printf(“n 顺序循环队列为 :“);PRINT(printf(“再次请输入你要插入的元素 :n“);scanf(“%d“,return 0;四、实验结果与分析(程序运行结果及其分析)1、必做题(1)2、必做题(2)金陵科技学院实验报告2、选做题(1)2、选做题(2)