数据结构实验报告.docx
《数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
![数据结构实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/10/118851e1-8afc-4d79-8764-a00b9f9ceb72/118851e1-8afc-4d79-8764-a00b9f9ceb721.gif)
数据结构实验报告
《数据结构》实验报告
专业:
软件工程
班级:
姓名:
2014年12月
太原理工大学学生实验报告
学院名称
软件学院
专业班级
学号
实验成绩
学生姓名
同组人姓名
无
实验日期
课程名称
数据结构
实验题目
线性表
实验记录:
1.目的与要求
主要目的是为了使学生熟练掌握线性表的基本操作在顺序存储结构和链式存储结构上的实现,提高分析和解决问题的能力。
2.主要仪器设备
C,计算机。
3.实验内容
[问题描述]
设顺序表A中的数据元素递增有序,试写一程序,将x插入到顺序表的适当位置上,使该表仍然有序。
[输入]
有序表的元素个数,有序表的元素,要插入的值。
[输出]
插入值后的有序表。
[存储结构]
链式存储结构。
[算法的基本思想]
首先找到需要插入元素的位置,然后进行链表的插入操作即可。
四.[源程序]
#include
#include
typedefintElemType;
#defineLIST_INIT_SIZE100
#defineLISTINCREMENT10
typedefstruct{
ElemType*elem;
intlength;
intlistsize;
}SqList;
//构造空表
voidInitList_Sq(SqList&L){
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L.elem)exit(-2);
L.length=0;
L.listsize=LIST_INIT_SIZE;
}
实验室名称
指导教师签名:
//输入递增有序顺序表
voidputseqList(SqList&L,intn)
{
inti;
for(i=0;iscanf("%d",&(L.elem[i]));
if(i>0&&L.elem[i]printf("您输入的不是顺序表!
");
exit(-2);}
}
L.length=L.length+n;
}
//判断及插入
intListInsert_Sq(SqList&L,intx){
inti,*q,*p;
if(L.length>=L.listsize){
ElemType*newbase=(ElemType*)realloc(L.elem,
(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!
newbase)exit(-2);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
for(i=0;i<=L.length-1;i++){
if(x>L.elem[i]);
elsebreak;
}
q=&(L.elem[i]);
for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;
*q=x;
L.length++;
return1;
}
//输出元素
intOutputSqList(SqList&L)
{
inti;
for(i=0;i<=L.length-1;i++)
printf("%d,",L.elem[i]);
return0;
}
voidmain(){
ints,b;
SqListA;
InitList_Sq(A);
printf("请输入顺序表长度");
scanf("%d",&s);
printf("请输入顺序表");
putseqList(A,s);
printf("请输入要插入的值");
scanf("%d",&b);
ListInsert_Sq(A,b);
printf("插入后的顺序表为");
OutputSqList(A);
printf("\n");
}
五、实验结果与分析
可以看到4成功的插入了有序表中,若输入的不是一个有序表,则程序会提示,然后退出程序。
6、实验心得及体会
第一次做数据结构的实验,对链表的操作还不太熟悉,花了相当长的时间在插入的那一段函数上,
同时由于对C语言中结构体的不熟悉,在为变量申请空间时也发生了不少错误,但最终还是把程序写
了出来。
《数据结构》实验报告
专业:
班级:
姓名:
2014年12月
太原理工大学学生实验报告
学院名称
软件学院
专业班级
学号
实验成绩
学生姓名
同组人姓名
无
实验日期
课程名称
数据结构
实验题目
树
实验记录:
一.目的与要求
熟悉树的各种表示方法和各种遍历方式,掌握有关算法的实现,了解树在计算机科学及其它工程技术中的应用。
4.主要仪器设备
C,计算机。
5.实验内容
[问题描述]
编写递归算法,计算二叉树中叶子结点的数目。
[输入]
按照线序遍历输入一颗二叉树,若其子树为空则用0替代。
[输出]
二叉树的叶子结点数目。
[存储结构]
二叉链表存储。
[算法的基本思想]
首先建立根节点,然后通过递归算法建立左右子树,直到其子树为空,当其左右子树都为空时,
为叶子结点,一次遍历,统计出左右子树为空的结点数目,为叶子结点数目。
四.[源程序]
#include
#include
structnode{
charinfo;
structnode*llink,*rlink;
};
typedefstructnodeNode;
Node*shuru(){
charx;
Node*p;
scanf("%c",&x);
if(x!
='0'){
p=(Node*)malloc(sizeof(Node));
p->info=x;
p->llink=shuru();
p->rlink=shuru();
}
实验室名称
指导教师签名:
else
p=NULL;
returnp;
}
intplay(Node*p){
staticintcount=0;
if(p){
play(p->llink);
play(p->rlink);
if(p->llink==NULL&&p->rlink==NULL){
count++;
}
}
returncount;
}
main(){
Node*T;
intn;
printf("请输入一棵树(空子树用0代替):
\n");
T=shuru();
printf("\n");
if(!
T)
printf("这树是空的啊!
");
else{
n=play(T);
printf("\n这棵树的叶子节点为%d。
\n",n);
}
}
五、实验结果与分析
A
BC该树如左图所示,叶子结点数目为2,注意叶子结点子树也为空,需要输入0。
DE
7、实验心得及体会
该算法是先序遍历输入,采用递归算法,书上有例题,写起来也好懂,遍历过程中加上一个判断左右子树是否都为空即可判断是否为叶子结点。
《数据结构》实验报告
专业:
班级:
姓名
2014年12月
太原理工大学学生实验报告
学院名称
软件学院
专业班级
学号
实验成绩
学生姓名
同组人姓名
无
实验日期
课程名称
数据结构
实验题目
图
实验记录:
一.目的与要求
通过本次实验,掌握查找表上的有关查找方法,并分析时间复杂度。
6.主要仪器设备
C,计算机。
7.实验内容
[问题描述]
采用邻接表存储结构,编写一个求无向图的连通分量个数的算法。
[输入]
无向图(包括顶点个数,两点之间的弧)
[输出]
无向图的连通分量个数。
[存储结构]
邻接表存储结构。
[算法的基本思想]
从其中一个结点开始深度优先搜索,直到下一个结点为空则结束遍历,使得连通分量增加一,
然后选择一个没有经过遍历的结点重新开始深度优先搜索,等到下一个结点为空时结束遍历,使得
连通分量增加一,以此类推,直到所有点都经过遍历为止。
8.[源程序]
#include
#include
intn;
structVNode{//点
intposition;
structVNode*next;
};
structArcNode{//弧
intmark;
structVNode*first;
};
//深度优先搜索
实验室名称
指导教师签名:
voidDFS(structArcNode*v,structArcNode*w){
structVNode*L;
w->mark=1;
L=w->first;
while(L!
=NULL){
if((v+(L->position))->mark==0){
DFS(v,(v+L->position));
}
L=L->next;
}
}
intmain(){
inti,j,k;
intnum=0;
structArcNode*p;
structVNode*temp;
structVNode*flag;
printf("该无向图有多少个顶点:
\n");
scanf("%d",&n);
while(n<1){
printf("你输入的值不合理,请重新输入:
\n");
scanf("%d",&n);
}
p=(structArcNode*)malloc(n*sizeof(structArcNode));
for(i=0;iprintf("请输入以V%d为弧尾的所有弧,并以0结束输入\n",i+1);
scanf("%d",&k);
if(k==0){
p[i].mark=0;
p[i].first=NULL;
}
else{
temp=(structVNode*)malloc(sizeof(structVNode));
temp->position=k;
temp->next=NULL;
p[i].first=temp;
p[i].mark=0;
flag=temp;
scanf("%d",&k);
while(k!
=0){
temp=(structVNode*)malloc(sizeof(structVNode));
temp->position=k;
temp->next=NULL;
flag->next=temp;
flag=temp;
scanf("%d",&k);}
}
}
i=0;
while(p[i].mark==0){
DFS(p,(p+i));
num++;
i=0;
while(p[i].mark!
=0&&ii++;}
}
printf("此图的连通分量个数为:
%d\n",num);
return0;
}
五、实验结果与分析
该图为:
V4--V2--V1--V3--V5
输入以VX为弧尾的所有弧,意为输入所有与VX相连的点序号即可,随后可以构造出无向图,
可以求出其中的连通分量个数。
8、实验心得及体会
图的构造比较难,它不像链表是一对一,树是一对多,图为多对多,因此容易发生错误,我也
是上网查阅了很多资料后才弄懂理解了。
《数据结构》实验报告
专业:
班级:
姓名:
2014年12月
太原理工大学学生实验报告
学院名称
软件学院
专业班级
学号
实验成绩
学生姓名
同组人姓名
无
实验日期
课程名称
数据结构
实验题目
查找
实验记录:
一.目的与要求
通过本次实验,掌握查找表上的有关查找方法,并分析时间复杂度。
9.主要仪器设备
C,计算机。
10.实验内容
[问题描述]
编写程序实现下面运算:
在二叉排序树中查找关键字为key的记录。
[输入]
排序二叉树,以及要查找的数字(节点)。
[输出]
显示该节点是否存在。
[存储结构]
有序表采用顺序方式存储。
[算法的基本思想]
如果二叉排序树为空树,返回空,不然,将key与根节点的关键字比较,若key等于根节点的关键字,查找成功,若key小于根节点的关键字,继续在左子树中查找,若key大于根节点的关键字,继续在右子树中查找。
四.[源程序]
#include
#include
typedefstructBiTNode{
intdata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
//插入
voidInsertBST(BiTree*T,BiTrees){
if(*T==0)*T=s;
elseif(s->data<(*T)->data)InsertBST(&((*T)->lchild),s);
elseif(s->data>(*T)->data)InsertBST(&((*T)->rchild),s);
}
//查找
BiTreeSearchBST(BiTreeT,intkey){
if(T==0)return0;
elseif(T->data==key)returnT;
elseif(keydata)returnSearchBST(T->lchild,key);
elsereturnSearchBST(T->rchild,key);
}
实验室名称
指导教师签名:
main(){
intkey;
BiTreebt,s;
inti=0;
printf("\n请输入元素,0为结束(先序序列):
\n");
scanf("%d",&key);
bt=0;
while(key!
=0){
s=(BiTree)malloc(sizeof(BiTNode));
s->data=key;
s->lchild=s->rchild=0;
InsertBST(&bt,s);
scanf("%d",&key);
}
printf("\n输入你想要查找的元素:
");
scanf("%d",&key);
s=SearchBST(bt,key);
if(s!
=0)
printf("\n查找成功!
\n");
else
printf("\n没有找到!
\n");
}
五、实验结果与分析
书上的二叉树的插入不是递归算法,改为递归算法可以使程序看起来变的简洁,注意该二叉树为先序序列输入,结果可以实现关键字为key的查找。
9、实验心得及体会
虽然插入的递归算法想起来比较难想,但是写出来以后可以简化程序,若不用递归算法,代码的数量还会增加,需要注意的是二叉排序树插入时,需要比较大小后再行插入到树中,随后查找运用书上的递归算法即可。
自己在递归算法方面还是有欠缺,需要多加练习才能熟练运用。
《数据结构》实验报告
专业:
班级:
姓名:
2014年12月
太原理工大学学生实验报告
学院名称
软件学院
专业班级
学号
实验成绩
学生姓名
同组人姓名
无
实验日期
课程名称
数据结构
实验题目
内排序
实验记录:
一.目的与要求
通过本次实验,掌握线性表的排序方法,并分析时间复杂度。
11.主要仪器设备
C,计算机。
12.实验内容
[问题描述]
设计一个用链表表示的直接选择排序算法,并用程序实现。
[输入]
N个数据。
[输出]
N个数据由小到大的序列。
[存储结构]
待排序记录顺序存储。
[算法的基本思想]
已知待排序初始序列用单链表存贮,头指针head指向第一个结点,从这个待排序列中找出最小结点,插入head之后,用r来指示。
r以前为已排序序列,r以后为未排序序列。
再从未排序序列中找出最小结点插入r的后面,让r指向这个结点。
反复执行这个过程,直到排好序。
四.[源程序]
#include
#include
typedefstructLNode{
intdate;
structLNode*next;
}LNode,*LinkList;
voidshuru(LinkList&L,intn){
if(n!
=0){
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
LNode*p,*t;
t=L;
for(inti=0;ip=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->date);
p->next=t->next;
t->next=p;
t=p;}
}
实验室名称
指导教师签名:
else{
printf("输入个数不能为空,程序结束");
exit(-2);
}
}
voidshuchu(LinkList&L,intn){
LNode*p;
p=L->next;
for(;n>0;--n){
printf("%d",p->date);
p=p->next;
}
}
voidpaixu(LNode*head,intn){
if(n==0)
return;
intmin;
inti,s=0;
LNode*p,*r,*t;
p=head->next;
r=head->next;
t=head;
min=p->date;
for(i=0;iif(min>p->date){
min=p->date;
r=p;
s=i;
}
p=p->next;
}
for(i=0;i
t=t->next;
t->next=r->next;
r->next=head->next;
head->next=r;
paixu(head->next,n-1);
}
voidmain(){
intn;
LinkListA;
printf("输入个数n:
");
scanf("%d",&n);
printf("输入%d个数据:
\n",n);
shuru(A,n);
printf("您输入的数据为:
\n");
shuchu(A,n);
printf("\n排序后的数据为:
\n");
paixu(A,n);
shuchu(A,n);
}
五、实验结果与分析
经过直接选择排序可以看到序列已经变得有序,但是我只考虑了当输入个数为0是程序会退出,未做异常状况的处理。
10、实验心得及体会
单链表的建立是用到了尾插法,需要定义头尾两个结点,排序用到了递归算法,通过多次递归可以使得头指针head后移,不需要定义头尾,若不用递归算法,需要建立多次的循环,程序阅读起来不方便,容易导致错误的发生,所以在该程序中我使用了递归算法,不过花了相当长的时间去理解,递归算法依然对我来说是难点,需要多加练习。