实验报告书写要求实验报告原则上要求学生手写,要求书写工整。
若因课程特点需打印的,要遵照以下字体、字号、间距等的具体要求。
纸张一律采用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<stdio.h>#define maxsize 100 typedef struct{int datatype [maxsize]; int last;}sequenlist; void main(){sequenlist a={{1,2,3,4},4};for(int i=0;i<st;i++){printf("%d ",a.datatype[i]);}}第二题:#include<stdio.h>#define maxsize 100typedef struct{int datatype[maxsize];int last;}sequenlist;int search(sequenlist a,int x){ for(int i=0;i<st;i++){if(a.datatype[i]==x){return(i);}}return (-1);}void main(){sequenlist a={{1,2,3,5,6},5};int b=1;printf("%d",search(a,b));}第三题:#include <stdio.h>#define maxsize 100typedef struct{int datatype[maxsize];int last ;}sequenlist;sequenlist insert(sequenlist a,int x){for(int i=0;i<st;i++){if(a.datatype[i]>=x){for(intj=st;j>i;j--){a.datatype[j]=a.datatype[j-1];}a.datatype[i]=x;st=st+1;return (a);}}return a;}void main(){sequenlista={{1,2,3,4,5,6},6};sequenlist c;int b=1;c=insert(a,b);for(int i=0;i<st;i++){printf("%d",c.datatype[i]);}}第四题:#include<stdio.h>#define maxsize 100typedef struct {int datatype[maxsize];int last;}sequenlist;sequenlist dele(sequenlist a,int x){for(int i=0;i<st;i++){if(a.datatype[i]==x){for(intj=i;j<st-1;j++){a.datatype[j]=a.datatype[j+1];}st=st-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;i<st;i++){printf("%d",b.datatype[i]);}}第五题:#include<stdio.h>#define maxsize 100typedef struct {int datatype[maxsize];int last;}sequenlist;sequenlist combine(sequenlist a,sequenlist b){int i=0;sequenlist c;st =0;int j=st-1;int h=st-1;while(j>=0 && h>=0){if(a.datatype[j]>=b.datatype[h ]){c.datatype[i++]=a.datatype[j--];st++;}else{c.datatype[i++]=b.datatype[h--];st++;}} if(j==-1 && h>=0){while(h>=0){c.datatype[i++]=b.datatype[h--];st++;}return c;}else if(j>=0 && h==-1){while(j>=0){c.datatype[i++]=a.datatype[j--];st++;}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;i<st;i++){printf("%d ",c.datatype[i]);}}四、实验结果与分析(程序运行结果及其分析)第一题:1 2 3 4此题即直接输出第二题:此题输出1的位置为0第三题:1 1234 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<stdio.h>#include<stdlib.h>typedef struct node{int data;struct node *next;}linklist;void main(){linklist *head,*r,*p;int a;head=malloc(sizeof(linklist)); 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;while(r!=NULL){printf("%d",r->data);r=r->next;}}第二题:#include<stdio.h>#include<stdlib.h>typedef struct node{int 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; 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;}else{while( r!=NULL && r->data<p->data){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;}}第三题:#include "stdio.h"#include "stdlib.h"typedef 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; printf("\nAfter changed:\n");p=head->next;while(p!=NULL){printf("%d",p->data);p=p->next;}}第四题:#include<stdio.h>#include<stdlib.h>typedef struct node{int 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;h<=len;h++){q=q->next;//q指向第len+1个节点}a=q;}else{for(h=1;h<i-1;h++){p=p->next;//p指向第i-1个节点}q=p->next;for(h=1;h<=len;h++){q=q->next;//q指向第len+1个节点}p->next=q;//链表a中已经删除了len个节点}p=b;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 ;}}四、实验结果与分析(程序运行结果及其分析)第一题: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五、实验体会(遇到问题及解决办法,编程后的心得体会)本次试验最要花心思的是第四题因为其需要分情况讨论,比如是从第一条的第一个元素开始删除还是从其他元素。