《数据结构》实验报告参考.docx
- 文档编号:26914261
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:16
- 大小:24.30KB
《数据结构》实验报告参考.docx
《《数据结构》实验报告参考.docx》由会员分享,可在线阅读,更多相关《《数据结构》实验报告参考.docx(16页珍藏版)》请在冰豆网上搜索。
《数据结构》实验报告参考
《数据结构》实验指导
一、教学目的和要求:
数据结构是信息与计算科学、信息管理专业中一门重要的专业基础课程。
当用计算机来解决实际问题时,就要涉及到数据的表示及数据的处理,而数据表示及数据处理正是数据结构课程的主要研究对象,通过这两方面内容的学习,为后续课程,特别是软件方面的课程打下了厚实的知识基础,同时也提供了必要的技能训练。
因此,数据结构课程在计算机应用专业中具有举足轻重的作用。
本课程的任务是:
通过实践,学生对常用数据结构的基本概念及其不同的实现方法的理论得到进一步的掌握,并对在不同存储结构上实现不同的运算方式和技巧有所体会。
二、实验报告要求:
⒈每个实验都要认真写出实验报告,实验报告书写要求清晰、简明、扼要。
⒉实验报告内容要求如下:
⑴实验目的、内容
⑵实验中所采用方法的简要说明(包括对问题的描述)
⑶所用算法的描述,要求有相应的注释和说明,如各变量或数组的意义,必要的功能说明等。
⑷程序清单
⑸运行结果(包括调试中的问题说明等)
⑹实验体会。
三、主要实验内容:
1.线性结构:
线性结构的定义、组织形式、结构特征和类型说明以及在这两种存储方式下实现的插入、删除和按值查找的算法。
循环链表、双(循环)链表的结构特点和在其上施加的插入、删除等操作。
2.树形结构:
二叉树的二叉链表存储方式、结点结构和类型定义;二叉树的上的基本运算及应用。
3.图形结构:
图的两种存储结构(邻接矩阵和邻接表)的表示方法;图的基本运算及应用。
4.查找:
顺序查找、树表查找、散列表查找的基本思想及存储、运算的实现。
5.排序:
插入排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序及基数排序的基本思想及实现。
6.综合实验:
利用所学到的知识设计出合适的存储结构解决相关的实际问题。
四、具体实验内容:
实验一顺序表的基本操作
1.实验目的:
了解顺序表的基本概念、顺序表结构的定义及在顺序表上的基本操作(插入、删除、查找以及线性表合并),通过在VC实现以上操作更好的了解书本上的知识。
2.实验预备知识:
⑴复习C语言中数组的用法。
⑵了解线性表和顺序表的概念,顺序表的定义方法;
线性表是n个数据元素的有限序列,至于每个数据元素的具体含义,在不同的情况下各不相同。
顺序表是线性表的顺序存储表示,是用一组地址连续的存储单元依次存储线性表的数据元素。
在C语言中,顺序表是用数组来实现的。
⑶掌握线性表在顺序存储结构上实现基本操作:
查找、插入、删除和合并的算法。
在实现这些算法的时候,要注意判断输入数据的合法性,除此之外还要要注意以下内容:
在实现查找的时候,首先要判断该顺序表是否为空,其次要判断查找后的结果(查到时输出查到的数据,未查到时给出未查到提示)。
在实现插入的时候,首先要判断该顺序表是否为满,如为满则报错(此时要注意:
顺序表是用数组来实现的,它不能随机分配空间);如不为满,则需判断要插入的位置是否合法(例如:
如果一个线性表的元素只有10个,而要在第0个元素前插入或在第11个元素后插入就为不合法)。
其次要注意是前插还是后插,两者是有区别的;最后还要注意插入时各个数据元素移动的次序是从后面依次开始移动。
在实现删除的时候,首先要判断该顺序表是否为空,如为空则报错,如不为空,则需判断要删除的位置是否合法(例如:
如果一个线性表的元素只有10个,而要删除第0个或第十一个元素就为不合法)。
其次还要注意删除时各个数据元素移动的次序是从前面依次开始移动。
3.实验内容:
⑴顺序表的插入算法
⑵顺序表的删除算法
⑶顺序表的合并算法(选做)
4.部分实验代码:
⑴顺序表结构的定义:
#include
#definemaxnum255
typedefintelemtype;
typedefstruct
{elemtypelist[maxnum];
intnum;
}qltype;
⑵顺序表前插(在第i号元素前插入一个新的元素)
intqiancha(qltype*la,inti,intx)
{intj;
if(i<0||i>la->num+1)
{printf(“\nthevalueofiiswrong!
”);
return0;
}
if(la->num+1>=maxnum)
{printf(“\noverflow!
”);
return0;
}
.for(j=la->num;j>=i;j--)
la->list[j+1]=la->list[j];
la->list[i]=x;
la->num++;
return1;
}
⑶顺序表删除
intshanchu(qltype*la,inti)
{if(i<0||i>la->num)
{printf(“\nthepositioniswrong!
\n”);
return0;
}
for(i;i
la->list[i-1]=la->list[i];
la->num--;
return1;
}
实验二不带头结点的单链表的基本操作
1.实验目的:
了解单链表的基本概念、结构的定义及在单链表上的基本操作(插入、删除、查找以及线性表合并),通过在VC实现以上操作更好的了解书本上的内容并体会线性表的两种存储结构的区别。
2.实验预备知识:
⑴复习C语言中指针的用法,特别是结构体的指针的用法;
⑵了解单链表的概念,单链表的定义方法;
单链表是线性表的链式存储表示,是用一组任意的存储单元依次存储线性表的数据元素。
因此,为了表示每个数据元素ai与其直接后继元素ai+1之间的逻辑关系,对数据元素ai来说,,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置),而这部分就是用指针来完成的。
⑶掌握线性表在链式存储结构上实现基本操作:
查找、插入、删除的算法;
在实现这些算法的时候,要注意判断输入数据的合法性,除此之外还要要注意以下内容:
在实现查找的时候,首先要判断该顺序表是否为空,其次要判断查找后的结果(查到时输出查到的数据,未查到时给出错误提示)。
在实现插入的时候,由于是链式存储,它可以随机产生和回收存储空间,所以它不要判断线性表是否为满,但仍需判断要插入的位置是否合法,原因同实验一,其次要注意插入的时候语句的顺序不可颠倒,否则出错。
例如:
p
s
s所指向结点要插入在p所指向的结点之后,则:
正确形式:
s->next=p->next
p->next=s
错误形式:
p->next=s
s->next=p->next(因为此时p->next已经指向s了)
在实现删除的时候,首先要判断线性表是否为空,为空则不能删除;
其次在删除后要回收空间。
p
s
例如:
删除如上图所示s所指向的结点
p->next=p->next->next
frees
3.实验内容:
⑴单链表的插入算法
⑵单链表的删除算法
⑶循环链表的插入和删除算法(选做)
4.部分实验代码:
⑴单链表的结构定义:
#include
typedefintelemtype;
typedefstructlnode
{elemtypedata;
structlnode*next;
}*linklist;
⑵建立单链表的算法
intn;/*n作为整个程序的全局变量*/
linklist*creat(void)
{linklist*head,*p1,*p2;
n=0;
p1=p2=(linklist*)malloc(sizeof(linklist));
scanf(“%d”,&p1->data);
head=null;
while(p1->data!
=0)
{n=n+1;
if(n==1)head=p1;
elsep2->next=p1;
p2=p1;
p1=(linklist*)malloc(sizeof(linklist));
scanf(“%d”,&p1->data);
}
p2->next=null;
return(head);
}
⑶单链表的插入算法
intinsert(linklist*head,inti,elemtypee)
{linklist*p,*s;
intj;
p=head;j=0;
while(p&&j {p=p->next; ++j; } if(! p||j>i-1) {printf(“无法插入”); return0; } s=(linklist*)malloc(sizeof(lnode)); s->data=e; s->next=p->next; p->next=s; return1; } ⑷单链表的删除算法 intdeltree(linklist*head,inti,elemtypee) {linklist*p,*q; intj;l p=head;j=0; while(p->next&&j {p=p->next; ++j; } if(! (p->next)||j>i-1) {printf(“无法删除”); return0; } q=p->next;p->next=q->next; e=q->data; free(q); return1; } 实验三带头结点的单链表中数据就地逆置 1.实验目的: 了解单链表的基本概念、结构的定义及在单链表上的基本操作(插入、删除、查找以及线性表合并),通过在VC实现以上操作更好的了解书本上的内容并体会线性表的两种存储结构的区别。 2.实验预备知识: 同实验二 3.实验内容: ⑴单链表的创建算法 ⑵单链表的逆置算法 ⑶单链表的显示算法 4.部分实验代码: (略) 实验四顺序栈的基本操作 1.实验目的: 了解栈的概念、栈的特性、在两种存储结构上如何实现栈的基本操作以及栈在程序设计中的应用。 通过在VC++中实现顺序栈的插入和删除加深理解顺序栈的意义。 2.实验预备知识: ⑴掌握栈这种抽象数据类型的特点,并能在相应的应用任务中正确选用它; 栈是操作受限的线性表,是限定仅在表尾进行插入或删除操作的线性表。 因此,对栈来说,表尾端有其特殊含义,称为栈顶(top),相应地,表头端称为栈底(botton); 栈又称为后进先出(LastInFirstOut)的线性表,简称LIFO结构,因为它的修改是按后进先出的原则进行的。 ⑵熟练掌握栈类型的两种实现方法,即两种存储结构表示时的基本操作实现算法,特别应注意栈满和栈空的条件以及它们的描述方法。 ⑶在学习顺序栈的基本操作实现算法时,应注意: 在书上给出的结构定义是采用了一种动态管理方式(不够时,可以再分配),但在C语言中,用数组来存储顺序栈,是静态分配,即不能随机分配空间,这点易引起大家的误解。 3.实验内容: ⑴顺序栈的初始化、进栈、出栈算法 ⑵链式栈的初始化、进栈、出栈算法(选做) 4.部分实验代码: ⑴顺序栈的结构定义 #definemaxnum255 typedefintelemtype; typedefstruct {elemtypestack[maxnum]; inttop; }qstype; ⑵顺序栈的初始化算法 voidinitqstack(qstype*s) {s->top=-1;} ⑶顺序栈进栈操作算法 intpushqstack(qstype*s,elemtypex) {if(s->top>=maxnum-1)return0; else {s->stack[++(s->top)]=x; return1; } } ⑷顺序栈出栈操作算法 elemtypepopqstack(qstype*s) {if(s->top<0)printf(“空栈,无法出栈! ”); elsereturn(s->stack[(s->top)--]; } ⑸链栈的结构定义 typedefintelemtype; typedefstructnode {elemtypedata; structnode*next; }linkstktp; linkstktp*top; ⑹链栈的进栈操作算法 voidpush(linkstktp*top,elemtypex) {linkstktp*p; p=(linkstktp*)malloc(sizeof(linkstktp)); p->data=x; p->next=top->next; top->next=p; } ⑺链栈的出栈操作算法 elemtypepop(linkstktp*top) {linkstktp*p; elemtypex; p=top->next; if(p=null) {printf(“栈已空! ”); return0; } else {top->next=p->next; x=p->data; free(p); return(x); } } 实验五循环队列的应用 1.实验目的: 了解队列的概念、队列的特性、在两种存储结构上如何实现队列的基本操作以及队列在程序设计中的应用。 通过在VC中实现队列的插入和删除加深理解链队列和循环队列的意义。 2.实验预备知识: ⑴掌握队列这种抽象数据类型的特点,并能在相应的应用任务中正确选用它; 队列是操作受限的线性表,是只允许仅在表的一端进行插入,而在另一端进行删除操作的线性表。 在队列中,允许插入的一端称为队尾(rear),允许删除的一端称为对头(front); 队列又称为先进先出(FirstInFirstOut)的线性表,简称FIFO结构。 因为它的修改是按先进先出的原则进行的。 ⑵熟练掌握循环队列和链队列的基本操作实现算法,特别注意在循环队列中队满和队空的描述方法。 3.实验内容: ⑴链队列的进队和出队算法 ⑵循环队列的进队和出队算法 4.部分实验代码: ⑴链队列的结构定义: typedefintelemtype; typedefstructqnode {elemtypedata; structqnode*next; }slnodetype; typedefstruct {slnodetype*head; slnodetype*rear; }slqtype; ⑵链队列的进队列操作算法(在队列尾插入) #definenil0 #definenull0 intinsertslqueue(slqtype*q,elemtypex) {slnodetype*p; if((p=(slnodetype*)malloc(sizeof(slnodetype))==null) {printf(“\n申请空间失败! ”); return0; } p->data=x; p->next=null; q->rear->next=p; q->rear=p; return1; } ⑶链队列的出队列操作算法(在队列头删除) elemtypedeleteslqueue(slqtype*q) {slnodetype*p; elemtypex; if(q->head->next==null)returnnil; p=q->head->next; q->head->next=p->next; x=p->data; free(p); returnx; } ⑷循环队列的结构定义 #definemaxnum255 typedefintelemtype; typedefstruct {elemtypequeue[maxnum]; intfront; intrear; }qqtype; ⑸循环队列进队列操作算法 intinsertqqeue(qqtype*q,elemtypex) {if((q->rear+1)%maxnum==q->front) {printf(“\n队列已满! ”); return0; } q->rear=(q->rear+1)%maxnum; q->queue[q->rear]=x; return1;} ⑹循环队列出队列操作算法 elemtypedeleteqqueue(qqtype*q) {if(q->front==q->rear) {printf(“\n队列已空! ”); return0; } q->front=(q->front+1)%maxnum; returnq->queue[q->front]; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 参考
![提示](https://static.bdocx.com/images/bang_tan.gif)