数据结构与算法设计实验一
数据结构上机指导书_实验一

数据结构与算法实验指导书中国石油大学(北京)计算机科学与技术系前言《数据结构》是计算机及相关专业的一门核心基础课程,也是很多高校考研专业课之一。
它主要介绍线性结构、树结构、图结构三种逻辑结构元素的存储实现,在此基础上介绍一些典型算法及时、空效率分析。
这门课程的主要任务是培养学生的算法设计能力及良好的程序设计习惯。
通过学习,要求学生能够掌握典型算法的设计思想及程序实现,能够根据实际问题选取合适的存储方案,设计出简洁、高效、实用的算法,为后续课程的学习及软件开发打下良好的基础。
学习这门课程,习题和实验是两个关键环节。
学生理解算法,上机实验是最佳的途径之一。
因此,实验环节的好坏是学生能否学好《数据结构》的关键。
为了更好地配合学生实验,特编写实验指导书。
一、实验目的更好的理解算法的思想、培养编程能力。
二、实验要求1、每次实验前学生必须根据试验内容认真准备实验程序及调试时所需的输入数据。
2、在指导教师的帮助下能够完成实验内容,得出正确的实验结果。
3、实验结束后总结实验内容、书写实验报告。
4、遵守实验室规章制度、不缺席、按时上、下机。
5、实验学时内必须做数据结构的有关内容,不允许上网聊天或玩游戏,如发现上述现象,取消本次上机资格,平时成绩扣10分。
6、实验报告有一次不合格,扣5分,两次以上不合格者,平时成绩以零分记。
三、实验环境 VC++6.0或者VC2010四、说明1、本实验的所有算法中元素类型可以根据实际需要选择。
2、实验题目中带*者为较高要求,学生可自选;其余部分为基本内容,应尽量完成(至少完成70%,否则实验不合格)。
3、数据结构是很多高校的硕士研究生入学考试的专业课之一,希望有志于考研的学生能够在学习过程中注意各种算法的理解,以便为考研做一定的准备。
五、实验报告的书写要求1.明确实验的目的及要求;2.记录实验的输入数据和输出结果;3.说明实验中出现的问题和解决过程;4.写出实验的体会和实验过程中没能解决的问题;六、参考书目《数据结构》(C++语言描述)王红梅等清华大学出版社《DATA STRUCTURE WITH C++》 William Ford,William Topp清华大学出版社(影印版)实验平台控制台程序1、启动Microsoft VC6.0集成开发环境如图所示:2、单击“文件”菜单,选择“新建”项。
数据结构与算法实验报告

数据结构与算法实验报告一、实验目的1.学习并掌握线性表的链式存储结构和链表的基本操作;2.掌握链表的插入、删除、查找等基本操作算法的实现;3.了解链表的应用场景。
二、实验内容与过程本次实验主要包括以下实验内容:1.链表的定义与建立;2.链表的插入操作;3.链表的删除操作;4.链表的查找操作;5.链表的遍历操作;6.链表的逆序操作;7.链表的合并操作。
实验过程如下:1.链表的定义与建立首先,我们定义一个链表的结构,其中包括节点的定义,节点的数据域和指针域。
节点的数据域存放具体的数据,指针域用于指向下一个节点。
```typedef struct Nodeint data;struct Node* next;} Node;```然后,我们定义链表的头指针,并初始化为空链表。
```Node* head = NULL;```2.链表的插入操作插入操作是指在链表中间或末尾插入一个新节点。
首先,我们创建一个新节点,并为其分配内存空间。
```Node* newNode = (struct Node*) malloc(sizeof(Node));newNode->data = 10;newNode->next = NULL;```然后,我们遍历链表,找到插入位置。
```Node* current = head;while (current->next != NULL)current = current->next;```最后,我们将新节点插入到链表中。
```current->next = newNode;```3.链表的删除操作删除操作是指删除链表中的一些节点。
首先,我们找到要删除的节点的前一个节点。
```Node* current = head;while (current->next != NULL && current->next->data != data) current = current->next;```然后,我们将要删除的节点的指针域赋值给前一个节点的指针域。
数据结构与算法分析实验报告

数据结构与算法分析实验报告一、实验目的本次实验旨在通过实际操作和分析,深入理解数据结构和算法的基本概念、原理和应用,提高解决实际问题的能力,培养逻辑思维和编程技巧。
二、实验环境本次实验使用的编程语言为 Python,使用的开发工具为 PyCharm。
操作系统为 Windows 10。
三、实验内容(一)线性表的实现与操作1、顺序表的实现使用数组实现顺序表,包括插入、删除、查找等基本操作。
通过实验,理解了顺序表在内存中的存储方式以及其操作的时间复杂度。
2、链表的实现实现了单向链表和双向链表,对链表的节点插入、删除和遍历进行了实践。
体会到链表在动态内存管理和灵活操作方面的优势。
(二)栈和队列的应用1、栈的实现与应用用数组和链表分别实现栈,并通过表达式求值的例子,展示了栈在计算中的作用。
2、队列的实现与应用实现了顺序队列和循环队列,通过模拟银行排队的场景,理解了队列的先进先出特性。
(三)树和二叉树1、二叉树的遍历实现了先序、中序和后序遍历算法,并对不同遍历方式的结果进行了分析和比较。
2、二叉搜索树的操作构建了二叉搜索树,实现了插入、删除和查找操作,了解了其在数据快速查找和排序中的应用。
(四)图的表示与遍历1、邻接矩阵和邻接表表示图分别用邻接矩阵和邻接表来表示图,并比较了它们在存储空间和操作效率上的差异。
2、图的深度优先遍历和广度优先遍历实现了两种遍历算法,并通过对实际图结构的遍历,理解了它们的应用场景和特点。
(五)排序算法的性能比较1、常见排序算法的实现实现了冒泡排序、插入排序、选择排序、快速排序和归并排序等常见的排序算法。
2、算法性能分析通过对不同规模的数据进行排序实验,比较了各种排序算法的时间复杂度和空间复杂度。
四、实验过程及结果(一)线性表1、顺序表在顺序表的插入操作中,如果在表头插入元素,需要将后面的元素依次向后移动一位,时间复杂度为 O(n)。
删除操作同理,在表头删除元素时,时间复杂度也为 O(n)。
数据结构实验指导书(新版)

《数据结构和算法》实验指导书实验及学时数分配序号实验名称学时数(小时)1 实验一线性表 42 实验二树和二叉树 23 实验三图 24 实验四查找 25 实验五内部排序 2合计12几点要求:一、上机前:认真预习相关实验内容,提前编写算法程序,上机时检查(未提前编写程序者,扣除平时成绩中实验相关分数)。
二、上机中:在Turbo C或VC6.0环境中,认真调试程序,记录调试过程中的问题、解决方法以及运行结果。
上机时签到;下机时验收签字。
三、下机后:按要求完成实验报告,并及时提交(实验后1周内)。
实验一线性表【实验目的】1、掌握用Turbo c上机调试线性表的基本方法;2、掌握线性表的基本操作,插入、删除、查找以及线性表合并等运算在顺序存储结构和链式存储结构上的运算;3、运用线性表解决线性结构问题。
【实验学时】4 学时【实验类型】设计型【实验内容】1、顺序表的插入、删除操作的实现;2、单链表的插入、删除操作的实现;3、两个线性表合并算法的实现。
(选做)【实验原理】1、当我们在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表中第i个元素之后的所有元素依次后移一个位置,以便腾出一个位置,再把新元素插入到该位置。
若是欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置;2、当我们在线性表的链式存储结构上的第i个位置上插入一个元素时,只需先确定第i个元素前一个元素位置,然后修改相应指针将新元素插入即可。
若是欲删除第i个元素时,也必须先确定第i个元素前一个元素位置,然后修改相应指针将该元素删除即可;3、详细原理请参考教材。
【实验步骤】一、用C语言编程实现建立一个顺序表,并在此表中插入一个元素和删除一个元素。
1、通过键盘读取元素建立线性表;(从键盘接受元素个数n以及n个整形数;按一定格式显示所建立的线性表)2、指定一个元素,在此元素之前插入一个新元素;(从键盘接受插入位置i,和要插入的元素值;实现插入;显示插入后的线性表)3、指定一个元素,删除此元素。
数据结构与算法实验报告

数据结构实验报告题目:线性表班级:网络工程1401班学号: 1408020106指导教师:高峰日期: 2016/7/6实验一:线性表一:实验要求掌握数据结构中线性表的基本概念。
熟练掌握线性表的基本操作:创建、插入、删除、查找、输出、求长度及合并并运算在顺序存储结构撒谎能够的实验。
熟练掌握链表的各种操作和应用。
二.实验内容1. 编程实现在顺序存储的有序表中插入一个元素(数据类型为整型)。
2. 编程实现把顺序表中从i个元素开始的k个元素删除(数据类型为整型)。
三:实验过程及步骤源代码:#include<stdio.h>#include<malloc.h>#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct{int * elem;int length;int listsize;}SqList;//SqList sq;void InitList_Sq(SqList *sq) //初始化列表{sq->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));sq->length=0;sq->listsize=LIST_INIT_SIZE;printf("---申请空间成功---!\n");}void GetElem(SqList *sq,int i)//获取第i位置元素的值{int *p;p=&(sq->elem[i-1]);printf("%d",*p);printf("\n");}int ListInsert_Sq(SqList *sq,int i,int a)//在i位置之前插入a{int *p,*q;if(i<=0||i>sq->length+1){printf("---位置不合法---!\n");return 0;}if(sq->length>=sq->listsize){int* newbase=(int *)realloc(sq->elem,(sq->listsize+LISTINCREMENT)*sizeof(int)); if(!newbase){printf("申请空间溢出\n");return 0;}sq->elem=newbase;sq->listsize+=LISTINCREMENT;}p=&(sq->elem[i-1]);//p指向第i位置的元素q=&(sq->elem[sq->length-1]);//q指向最后一个元素for(;q>=p;--q) *(q+1)=*q;*p=a;++sq->length;return 1;}int ListDelete_Sq(SqList *sq,int i) //删除i位置上的值{int *p,*q;if(i<1||i>sq->length) return 0;p=&(sq->elem[i-1]);//p指向第i位置的元素q=sq->elem+sq->length-1;//q指向最后一个元素for(++p;p<=q;++p){*(p-1)=*p;}--sq->length;return 1;}void visit(SqList *sq)//输出数据{int i=1;for(;i<=sq->length;i++){int *p;p=&sq->elem[i-1];printf("%d",*p);printf(" ");}}void main(){int i=1,a=0,boo=1,number=0;SqList s,*sq;sq=&s;InitList_Sq(sq);printf("初始化空表\n");printf("输入数据个数:\n");scanf("%d",&number);printf("输入%d个数据:",number);printf("\n");for(;i<=number;i++){scanf("%d",&a);if(boo=ListInsert_Sq(sq,i,a)){printf("---插入成功!---\n");}else{printf("---插入不成功,重新插入---!\n"); i=i-1;}}printf("输出所有元素\n");visit(sq);printf("\n");printf("输出删除的位置:");scanf("%d",&a);if(boo=ListDelete_Sq(sq,a)){printf("---数据删除成功!---\n");}else{printf("---没有删除成功---\n");}printf("输出所有元素:\n");visit(sq);printf("\n");printf("输出要显示数据的位置:");scanf("%d",&a);printf("输出%d位置数值\n",a);if(a<0||a>sq->length){printf("---输出位置的数据不存在---\n");}else{GetElem(sq,a);}}步骤:1.初始化空表2.顺序插入数据后输出所有元素3.选择删除位置,删除数据后输出所有元素4.选择查看的数据位置,输出选择查看的数据四:实验结果及分析分析:本程序在实现顺序存储插入以及删除i个元素开始的k个元素删除(数据类型为整型)。
软件设计师数据结构与算法(一)

[模拟] 软件设计师数据结构与算法(一)选择题第1题:循环链表的主要优点是______。
A.不再需要头指针了B.已知某个结点的位置后,能很容易找到它的直接前驱结点C.在进行删除操作后,能保证链表不断开D.从表中任一结点出发都能遍历整个链表参考答案:D第2题:表达式a*(b+c)-d的后缀表达式为______。
A.abcd*+-B.abc+*d-C.abc*+d-D.-+*abcd参考答案:B第3题:若二叉树的先序遍历序列为ABDECF,中序遍历序列为DBEAFC,则其后序遍历序列为______。
A.DEBAFCB.DEFBCAC.DEBCFAD.DEBFCA参考答案:D第4题:无向图中一个顶点的度是指图中______。
A.通过该顶点的简单路径数B.通过该顶点的回路数C.与该顶点相邻的顶点数D.与该顶点连通的顶点数参考答案:C第5题:利用逐点插入法建立序列(50,72,43,85,75,20,35,45,65,30)对应的二叉排序树以后,查找元素30要进行______次元素间的比较。
A.4B.5C.6D.7参考答案:B第6题:在常用的描述二叉排序树的存储结构中,关键字值最大的结点______。
A.左指针一定为空B.右指针一定为空C.左、右指针均为空D.左、右指针均不为空参考答案:B第7题:一个具有n(n>0)个顶点的连通无向图至少有______条边。
A.n+1B.nC.n/2D.n-1参考答案:D第8题:由权值为9,2,5,7的4个叶子结点构造一棵哈夫曼树,该树的带权路径长度为______。
A.23B.37C.44D.46参考答案:C第9题:在最好和最坏情况下的时间复杂度均为O(nlog<sub>2</sub>n)且稳定的排序方法是______。
A.基数排序B.快速排序C.堆排序D.归并排序参考答案:D第10题:己知一个线性表(38,25,74,63,52,48),假定采用散列函数h(key)=key % 7计算散列地址,并散列存储在散列表A[0,…,6]中,若采用线性探测方法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为______。
数据结构与算法实验报告

数据结构与算法实验报告实验目的:1.加深对链表的理解,掌握链表的基本操作;2.掌握递归算法的设计思想及应用。
实验内容:本次实验主要包括两个部分的实现与测试,分别为链表的基本操作及递归算法的应用。
一、链表的基本操作1.链表的创建链表的创建主要包括新建链表头结点和逐个插入新结点两个步骤。
首先通过malloc函数新建一个链表头结点,并使链表头结点的指针域为空。
然后通过循环输入新节点的数据值,并将新节点插入到链表的尾部。
2.链表的插入链表的插入操作主要包括在链表头部插入新节点、在链表尾部插入新节点和在链表中间插入新节点。
在插入链表头部时,首先通过malloc函数生成新节点,并将链表头节点指针域的原指向设置为新节点;在插入链表尾部时,首先通过循环找到链表的尾节点,并生成新节点,将尾节点指针域的原指向设置为新节点;在插入链表中间时,首先通过循环找到要插入的位置节点,然后生成新节点,并将新节点指针域的原指向设置为下一个节点,将前一个节点的指针域设置为新节点。
3.链表的删除链表的删除操作主要包括删除头节点、删除尾节点和删除中间节点。
在删除头节点时,首先通过free函数释放头节点的内存空间,然后将链表的头节点指针指向第二个节点;在删除尾节点时,首先通过循环找到倒数第二个节点,并将倒数第二个节点的指针域置空,最后通过free函数释放尾节点的内存空间;在删除中间节点时,首先通过循环找到要删除的节点的前一个节点,然后将前一个节点的指针域指向要删除节点的下一个节点,最后通过free函数释放要删除节点的内存空间。
4.链表的查询链表的查询操作主要包括按位置查询和按值查询。
在按位置查询时,通过循环找到指定位置的节点,然后返回节点的数据值;在按值查询时,通过循环比较节点的数据值与指定值,找到匹配的节点,并返回该节点的位置。
二、递归算法的应用递归算法是一种函数自己调用自己的算法设计思想,具有简洁、清晰的特点。
本次实验主要应用递归算法解决实际问题,包括斐波那契数列的求解和二叉树的遍历。
数据结构与算法实验报告[1]
![数据结构与算法实验报告[1]](https://img.taocdn.com/s3/m/ba40520cb80d6c85ec3a87c24028915f804d84df.png)
数据结构与算法实验报告实验目的:本次实验主要目的是掌握数据结构与算法的基本概念和实际应用。
通过设计和实现特定的数据结构和算法,加深对其原理和应用的理解,培养分析和解决实际问题的能力。
实验内容:本次实验包括以下几个部分:1\实验环境和工具介绍在本部分,将介绍实验所使用的开发环境和工具,包括操作系统、编程语言、集成开发环境等。
2\实验设计和思路本部分将详细介绍实验的设计思路、算法的选择和实现方式。
具体包括数据结构的选择、算法的设计原理、时间和空间复杂度分析等。
3\实验步骤和代码实现在本部分,将详细列出实验的具体步骤和算法的实现代码。
包括数据结构的定义和操作、算法的实现和测试数据的等。
4\实验结果和分析在本部分,将展示实验的运行结果,并对实验结果进行分析和讨论。
包括实际运行时间、空间占用、算法的优缺点等方面的讨论。
5\实验总结和思考在本部分,将对整个实验进行总结和思考。
包括实验过程中遇到的问题和解决方法,对实验结果的评价,以及对进一步的研究方向的思考等内容。
附件:本文档附带以下附件:1\源代码:包括数据结构的定义和操作,算法的实现等。
2\测试数据:用于验证算法实现的测试数据。
3\实验结果截图:包括算法运行结果、时间和空间占用等方面的截图。
法律名词及注释:1\数据结构:在计算机科学中,数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
2\算法:算法是解决问题的一系列清晰而简明的指令,是计算或操作的一种良定义的规程。
3\时间复杂度:时间复杂度是度量算法运行时间长短的一个表达式,用大O符号表示。
4\空间复杂度:空间复杂度是度量算法运行过程中所需的存储空间的一个表达式,用大O符号表示。
结语:本文档详细介绍了数据结构与算法实验的设计思路、步骤和实现代码,并对实验结果进行了分析和讨论。
实验过程中,我们掌握了数据结构与算法的基本概念和实际应用,提高了问题解决能力和编程实践能力。
算法与数据结构实验报告

2015-2016学年第二学期《算法与数据结构》课程实验报告专业软件工程学生姓名成晓伟班级软件141学号1410075094实验学时16实验教师徐秀芳信息工程学院实验一单链表的基本操作一、实验目的1.熟悉C语言上机环境,进一步掌握C语言的基本结构及特点。
2.掌握线性表的各种物理存储表示和C语言实现。
3.掌握单链表的各种主要操作的C语言实现。
4.通过实验理解线性表中的单链表存储表示与实现。
二、主要仪器及耗材普通计算机三、实验内容与要求1、用C语言编写一个单链表基本操作测试程序。
(1)初始化单链表(2)创建单链表(3)求单链表长度(4)输出单链表中每一个结点元素(5)指定位置插入某个元素(6)查找第i个结点元素的值(7)查找值为e 的结点,并返回该结点指针(8)删除第i个结点(9)销毁单链表2、实验要求(1)程序中用户可以选择上述基本操作。
程序启动后,在屏幕上可以菜单形式显示不同功能,当按下不同数字后完成指定的功能,按其他键,则显示错误后重新选择。
(2)要求用线性表的顺序存储结构,带头结点的单链表存储结构分别实现。
(3)主函数实现对基本操作功能的调用。
3、主要代码(1)初始化单链表LinkList *InitList(){ //创建一个空链表,初始化线性表LinkList *L;L=(LinkList *)malloc(sizeof(LinkList));L->next=NULL;return L;}(2)创建单链表//头插法void CreateListF(LinkList *L){LinkList *s;int i=1,a=0;while(1){printf("输入第%d个元素(0表示终止)",i++);scanf("%d",&a);if(a==0)break;s=(LinkList *)malloc(sizeof(LinkList));s->data=a;s->next=L->next;L->next=s;}}(3)求链表长度int ListLength(LinkList *L){ //求链表长度int n=0;LinkList *p=L;while(p->next!=NULL){p=p->next;n++;}return(n);}(4)在指定位置插入元素int InsertList(LinkList *L,int i,ElemType e){LinkList *p=L,*s;int j=0;while(p!=NULL&&j<i-1){p=p->next;j++;} //找出要插入的位置的前一个位置if(p==NULL){return 0;}else{s=(LinkList *)malloc(sizeof(LinkList));s->data=e;s->next=p->next;p->next=s;return 1;}}(5)输出链表void DispList(LinkList *L){ //输出链表LinkList *p=L->next;while(p!=NULL){printf("%d",p->data);p=p->next;}printf("\n");}(6)查找链表中指定元素int GetElem(LinkList *L,int i){ //查找链表中指定元素LinkList *p=L;int j=0;while(j<i&&p!=NULL){j++;p=p->next;}if(p==NULL){return 0;}else{return p->data;}}(7)查找值是e的结点并返回该指针LinkList *LocateElem(LinkList *L,ElemType e){ //查找值是e的结点并返回该指针int i=1;LinkList *p=L;while(p!=NULL)if(p->data==e) return p;}if(p==NULL){return NULL;}}(8)删除元素int ListDelete(LinkList *L,int i,ElemType *e){ //删除元素LinkList *p=L,*q;int j=0;while(p!=NULL&&j<i-1){p=p->next;j++;} //找到要删除元素地址的前一个地址if(p==NULL){ return 0;} //不能删除else{q=p->next;*e=q->data;p->next=q->next;free(q); //删除成功return 1;}}(9)销毁链表void DestroyList(LinkList *L){//销毁链表LinkList *pre=L,*p=L->next;while(p!=NULL){free(pre);pre=p;p=pre->next;}free(pre);}main函数:int main(){LinkList *L;ElemType e;int i;L=InitList();CreateListF(L);DispList(L);printf("输入要查找的元素位置:\n");scanf("%d",&i);e=GetElem(L,i);printf("%d\n",e);printf("单链表长度为:%d\n",ListLength(L));printf("输入要删除元素的位置:");scanf("%d",&i);if (i>ListLength(L)){printf("超出范围重新输入");scanf("%d",&i);}if(ListDelete(L,i,&e)==0){printf("未找到元素\n");}else DispList(L);printf("输入插入元素的位置和值:");scanf("%d%d",&i,&e);InsertList(L,i,e);DispList(L);return 0;}4、测试数据及测试结果输入:23 56 12 28 45输出:四、注意事项1、存储结构定义和基本操作尽可能用头文件实现。
算法与及数据结构实验报告

算法与及数据结构实验报告算法与数据结构实验报告一、实验目的本次算法与数据结构实验的主要目的是通过实际操作和编程实现,深入理解和掌握常见算法和数据结构的基本原理、特性和应用,提高我们解决实际问题的能力和编程技巧。
二、实验环境本次实验使用的编程语言为 Python,开发环境为 PyCharm。
同时,为了进行算法性能的分析和比较,使用了 Python 的 time 模块来计算程序的运行时间。
三、实验内容1、线性表的实现与操作顺序表的实现:使用数组来实现顺序表,并实现了插入、删除、查找等基本操作。
链表的实现:通过创建节点类来实现链表,包括单向链表和双向链表,并完成了相应的操作。
2、栈和队列的应用栈的实现与应用:用数组或链表实现栈结构,解决了表达式求值、括号匹配等问题。
队列的实现与应用:实现了顺序队列和循环队列,用于模拟排队系统等场景。
3、树结构的探索二叉树的创建与遍历:实现了二叉树的先序、中序和后序遍历算法,并对其时间复杂度进行了分析。
二叉搜索树的操作:构建二叉搜索树,实现了插入、删除、查找等操作。
4、图的表示与遍历邻接矩阵和邻接表表示图:分别用邻接矩阵和邻接表来存储图的结构,并对两种表示方法的优缺点进行了比较。
图的深度优先遍历和广度优先遍历:实现了两种遍历算法,并应用于解决路径查找等问题。
5、排序算法的比较插入排序、冒泡排序、选择排序:实现了这三种简单排序算法,并对不同规模的数据进行排序,比较它们的性能。
快速排序、归并排序:深入理解并实现了这两种高效的排序算法,通过实验分析其在不同情况下的表现。
6、查找算法的实践顺序查找、二分查找:实现了这两种基本的查找算法,并比较它们在有序和无序数据中的查找效率。
四、实验步骤及结果分析1、线性表的实现与操作顺序表:在实现顺序表的插入操作时,如果插入位置在表的末尾或中间,需要移动后续元素以腾出空间。
删除操作同理,需要移动被删除元素后面的元素。
在查找操作中,通过遍历数组即可完成。
数据结构实验一顺序表

数据结构实验一1、实验目的∙掌握线性表的逻辑特征∙掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算2、实验内容:建立顺序表,完成顺序表的基本操作:初始化、插入、删除、逆转、输出、销毁, 置空表、求表长、查找元素、判线性表是否为空;1.问题描述:利用顺序表,设计一组输入数据(假定为一组整数),能够对顺序表进行如下操作:∙创建一个新的顺序表,实现动态空间分配的初始化;∙根据顺序表结点的位置插入一个新结点(位置插入),也可以根据给定的值进行插入(值插入),形成有序顺序表;∙根据顺序表结点的位置删除一个结点(位置删除),也可以根据给定的值删除对应的第一个结点,或者删除指定值的所有结点(值删除);∙利用最少的空间实现顺序表元素的逆转;∙实现顺序表的各个元素的输出;∙彻底销毁顺序线性表,回收所分配的空间;∙对顺序线性表的所有元素删除,置为空表;∙返回其数据元素个数;∙按序号查找,根据顺序表的特点,可以随机存取,直接可以定位于第i 个结点,查找该元素的值,对查找结果进行返回;∙按值查找,根据给定数据元素的值,只能顺序比较,查找该元素的位置,对查找结果进行返回;∙判断顺序表中是否有元素存在,对判断结果进行返回;.编写主程序,实现对各不同的算法调用。
2.实现要求:∙“初始化算法”的操作结果:构造一个空的顺序线性表。
对顺序表的空间进行动态管理,实现动态分配、回收和增加存储空间;∙“位置插入算法”的初始条件:顺序线性表L 已存在,给定的元素位置为i,且1≤i≤ListLength(L)+1 ;操作结果:在L 中第i 个位置之前插入新的数据元素e,L 的长度加1;∙“位置删除算法”的初始条件:顺序线性表L 已存在,1≤i≤ListLength(L) ;操作结果:删除L 的第i 个数据元素,并用e 返回其值,L 的长度减1 ;∙“逆转算法”的初始条件:顺序线性表L 已存在;操作结果:依次对L 的每个数据元素进行交换,为了使用最少的额外空间,对顺序表的元素进行交换;∙“输出算法”的初始条件:顺序线性表L 已存在;操作结果:依次对L 的每个数据元素进行输出;∙“销毁算法”初始条件:顺序线性表L 已存在;操作结果:销毁顺序线性表L;∙“置空表算法”初始条件:顺序线性表L 已存在;操作结果:将L 重置为空表;∙“求表长算法”初始条件:顺序线性表L 已存在;操作结果:返回L 中数据元素个数;∙“按序号查找算法”初始条件:顺序线性表L 已存在,元素位置为i,且1≤i≤ListLength(L)操作结果:返回L 中第i 个数据元素的值∙“按值查找算法”初始条件:顺序线性表L 已存在,元素值为e;操作结果:返回L 中数据元素值为e 的元素位置;∙“判表空算法”初始条件:顺序线性表L 已存在;操作结果:若L 为空表,则返回TRUE,否则返回FALSE;分析: 修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。
本科专业认证《程序设计、算法与数据结构(一)》教学大纲

《程序设计、算法与数据结构(一)》教学大纲课程编号:0812000217课程名称:程序设计、算法与数据结构(一)英文名称:Programming,Algorithm and Data Structure I学分:3 课程性质:必修总学时:48 其中,讲授48学时,实验0学时,上机0学时,实训0学时适用专业:网络工程建议开设学期: 1先修课程:无开课单位:计算机与通信工程学院一、课程简介《程序设计、算法与数据结构(一)》是计算机科学与技术、软件工程、网络工程、通信工程专业基础课程,是课程群的启蒙课,也是学生进入大学后的第一门程序设计类课程,其目的是以C语言程序设计为基础,使学生熟悉C程序设计的基本语法,通过大量的编程练习,引导学生进入程序设计的殿堂,培养学生基本的数据结构和算法分析能力,为后续课程的学习打下基础。
二、课程目标与毕业要求依据2017培养方案中的毕业要求,考虑本课程与专业毕业要求的支撑关系,制定本课程学习目标。
课程目标1:通过程序三种基本控制结构,函数等知识点的学习,要求学生掌握结构化程序设计的基本思想,深入领会自顶向下、逐步求精的设计方法,识别网络工程项目的设计与开发过程中功能模块划分的问题。
(支持毕业要求 2.1能运用数学、自然科学及网络工程的基本原理,识别和判断网络工程问题的关键环节。
)课程目标2:在程序设计C语言后阶段学习过程中,针对成绩管理信息系统大作业的要求,将同学分组了解系统功能与应用背景,对具体的开发任务进行分工联调并编程实现。
通过系统实现强化个体的角色意识和团队意识。
(支撑毕业要求9.1:能够理解多学科背景下的团队中每个角色的定位与责任,具有团队合作意识,能够胜任个体、团队成员的角色任务。
)课程目标3:通过学习标准的C语言程序设计语法,运用函数、线性表、字符串、链表等基本知识,通过学习算法的描述方法,使学生能将实际问题转换成计算机描述的算法问题,培养学生运用程序算法的描述方法进行交流的能力。
数据结构(C语言版)实验报告 (内部排序算法比较)

《数据结构与算法》实验报告一、需求分析问题描述:在教科书中,各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。
试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。
基本要求:(l)对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。
(2)待排序表的表长不小于100000;其中的数据要用伪随机数程序产生;至少要用5组不同的输入数据作比较;比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动)。
(3)最后要对结果作简单分析,包括对各组数据得出结果波动大小的解释。
数据测试:二.概要设计1.程序所需的抽象数据类型的定义:typedef int BOOL; //说明BOOL是int的别名typedef struct StudentData { int num; //存放关键字}Data; typedef struct LinkList { int Length; //数组长度Data Record[MAXSIZE]; //用数组存放所有的随机数} LinkList int RandArray[MAXSIZE]; //定义长度为MAXSIZE的随机数组void RandomNum() //随机生成函数void InitLinkList(LinkList* L) //初始化链表BOOL LT(int i, int j,int* CmpNum) //比较i和j 的大小void Display(LinkList* L) //显示输出函数void ShellSort(LinkList* L, int dlta[], int t,int* CmpNum, int* ChgNum) //希尔排序void QuickSort (LinkList* L, int* CmpNum, int* ChgNum) //快速排序void HeapSort (LinkList* L, int* CmpNum, int* ChgNum) //堆排序void BubbleSort(LinkList* L, int* CmpNum, int* ChgNum) //冒泡排序void SelSort(LinkList* L, int* CmpNum, int* ChgNum) //选择排序void Compare(LinkList* L,int* CmpNum, int* ChgNum) //比较所有排序2 .各程序模块之间的层次(调用)关系:二、详细设计typedef int BOOL; //定义标识符关键字BOOL别名为int typedef struct StudentData //记录数据类型{int num; //定义关键字类型}Data; //排序的记录数据类型定义typedef struct LinkList //记录线性表{int Length; //定义表长Data Record[MAXSIZE]; //表长记录最大值}LinkList; //排序的记录线性表类型定义int RandArray[MAXSIZE]; //定义随机数组类型及最大值/******************随机生成函数********************/void RandomNum(){int i; srand((int)time(NULL)); //用伪随机数程序产生伪随机数for(i=0; i小于MAXSIZE; i++) RandArray[i]<=(int)rand(); 返回;}/*****************初始化链表**********************/void InitLinkList(LinkList* L) //初始化链表{int i;memset(L,0,sizeof(LinkList));RandomNum();for(i=0; i小于<MAXSIZE; i++)L->Record[i].num<=RandArray[i]; L->Length<=i;}BOOL LT(int i, int j,int* CmpNum){(*CmpNum)++; 若i<j) 则返回TRUE; 否则返回FALSE;}void Display(LinkList* L){FILE* f; //定义一个文件指针f int i;若打开文件的指令不为空则//通过文件指针f打开文件为条件判断{ //是否应该打开文件输出“can't open file”;exit(0); }for (i=0; i小于L->Length; i++)fprintf(f,"%d\n",L->Record[i].num);通过文件指针f关闭文件;三、调试分析1.调试过程中遇到的问题及经验体会:在本次程序的编写和调试过程中,我曾多次修改代码,并根据调试显示的界面一次次调整代码。
数据结构实验指导书(新版)

《数据结构与算法》实验指导书实验及学时数分配几点要求:一、上机前:认真预习相关实验内容,提前编写算法程序,上机时检查(未提前编写程序者,扣除平时成绩中实验相关分数)。
二、上机中:在Turbo C或VC6.0环境中,认真调试程序,记录调试过程中的问题、解决方法以及运行结果。
上机时签到;下机时验收签字。
三、下机后:按要求完成实验报告,并及时提交(实验后1周内)。
实验一线性表【实验目的】1、掌握用Turbo c上机调试线性表的基本方法;2、掌握线性表的基本操作,插入、删除、查找以及线性表合并等运算在顺序存储结构和链式存储结构上的运算;3、运用线性表解决线性结构问题。
【实验学时】4 学时【实验类型】设计型【实验内容】1、顺序表的插入、删除操作的实现;2、单链表的插入、删除操作的实现;3、两个线性表合并算法的实现。
(选做)【实验原理】1、当我们在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表中第i个元素之后的所有元素依次后移一个位置,以便腾出一个位置,再把新元素插入到该位置。
若是欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置;2、当我们在线性表的链式存储结构上的第i个位置上插入一个元素时,只需先确定第i个元素前一个元素位置,然后修改相应指针将新元素插入即可。
若是欲删除第i个元素时,也必须先确定第i个元素前一个元素位置,然后修改相应指针将该元素删除即可;3、详细原理请参考教材。
【实验步骤】一、用C语言编程实现建立一个顺序表,并在此表中插入一个元素和删除一个元素。
1、通过键盘读取元素建立线性表;(从键盘接受元素个数n以及n个整形数;按一定格式显示所建立的线性表)2、指定一个元素,在此元素之前插入一个新元素;(从键盘接受插入位置i,和要插入的元素值;实现插入;显示插入后的线性表)3、指定一个元素,删除此元素。
(从键盘接受删除元素位置i,实现删除;显示删除后的线性表)二、用C语言编程实现建立一个单链表,并在此表中插入一个元素和删除一个元素。
数据结构 实验一:实现单链表各种基本运算的算法

- 1 -实验一:实现单链表各种基本运算的算法一、 实验目的1、 掌握单链表存储结构的类型定义;2、 实现单链表各种基本运算的算法。
二、 实验环境1、 Windows 操作系统;2、 Visual C++ 6.0三、 实验内容实现单链表各种基本运算的算法。
四、 概要设计1.存储结构的类型定义:Typedef struct LNode{ElemType data;Struct LNode *next;}LinkList;2.单链表示意图:3.项目组成图:4.algo2_2.cpp 的程序文件包含的函数原型及功能:InitList(LinkList *&L) 初始化单链表LDestroyList(LinkList *&L) 释放单链表LListEmpty(LinkList *L)判断单链表L 是否为空表ListLength(LinkList *L)返回单链表L 的元素个数DispList(LinkList *L)输出单链表LGetElem(LinkList *L,int i,ElemType &e)获取单链表L 的第i 个元素LocateElem(LinkList *L,ElemType e)在单链表L 中查找元素eListInsert(LinkList *&L,int i,ElemType e)在单链表L 中的第i 个位置上插入元素e…… head a 1 a 2 a 3 a n ∧ListDelete(LinkList *&L,int i,ElemType &e)在单链表L中删除第i个元素5.exp2_2.cpp程序文件简介:InitList(LinkList *&L) 初始化单链表LDestroyList(LinkList *&L) 释放单链表LListEmpty(LinkList *L) 判断单链表L是否为空表ListLength(LinkList *L) 返回单链表L的元素个数DispList(LinkList *L) 输出单链表LGetElem(LinkList *L,int i,ElemType &e) 获取单链表L的第i个元素LocateElem(LinkList *L,ElemType e) 在单链表L中查找元素eListInsert(LinkList *&L,int i,ElemType e) 在单链表L中的第i个位置上插入元素e ListDelete(LinkList *&L,int i,ElemType &e) 在单链表L中删除第i个元素6.proj2-2的项目的模块结构:在文件algo2-2中,(1)定义单链表结构类型;(2)初始化单链表(3)定义释放单链表的函数(4)定义判断单链表是否为空的函数(5)定义返回单链表元素个数的函数(6)定义输出单链表的函数(7)定义获取第i个元素的函数(8)定义查找元素的函数(9)定义插入元素的函数(10)定义删除元素的函数在文件exp2-2中分别调用algo2-2中所定义的函数7.函数调用关系图:五、详细设计源代码清单见附录。
数据结构与算法实验教程实验

1.1 数据结构与算法的计算环境(实验估计时间:90分钟)1.1.1 背景知识除了进行科学计算之外,计算机已经被广泛地应用在控制、管理和数据处理等非数值计算的领域中。
与此相应,处理对象也由早先纯粹的数值发展到字符、表格和图形图像等各种具有一定结构的数据,这给计算机程序设计带来了新的问题。
为了编写一个“好”的程序,必须明确处理对象的特征及各对象之间的关系。
这就是“数据结构”这门学科形成和发展的背景。
任何实际问题只有建立了数学模型才可以被计算机计算,而数据结构就是实际问题中操作对象 (元素) 的数学抽象,算法则是建立和解决数学模型的方法。
数据结构用来反映计算机加工处理的对象,即数据的内部构成,即数据由哪几部分构成,以什么方式构成,呈什么样的结构等。
数据结构包括逻辑结构和物理结构。
这里的逻辑结构和物理结构是指一个事物的两个方面,而不是指两个不同的对象。
逻辑结构反映数据元素之间的逻辑关系,而物理结构反映了数据元素在计算机内部的存储安排,也称为存储结构。
数据结构是数据存在的形式,也是信息的一种组织方式,其目的是为了提高算法的效率。
数据结构通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。
由于相同算法中的抽象数据类型用不同的数据结构来表示,会造成不同的执行效率,这就有必要来研究不同数据结构表示的效率差异及其适用场实验1 数据结构和算法分析基础2 数据结构与算法实验教程合。
1. 数据结构的研究对象数据结构主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。
因此,主要有3个方面的内容,即数据的逻辑结构、数据的存储(物理) 结构和对数据的操作(或算法) 等。
通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的存储结构。
2. 数据结构的形式化定义数据是指由有限的符号(比如“0”和“1”,具有其自己的结构、操作和相应的语义) 组成的元素的集合。
结构是元素之间关系的集合。
通常来说,一个数据结构DS 可以表示为一个二元组:DS=(D, S)这里,D是数据元素的集合(或者是“结点”,可能还含有“数据项”或“数据域”) ,S是定义在D (或其他集合) 上的关系的集合,S = { R | R : D×D×...} ,称之为元素的逻辑结构。
数据结构与算法实验报告

数据结构与算法实验报告数据结构与算法实验报告1.引言在本实验中,我们将研究和实现一些经典的数据结构和算法,以及它们在各种问题中的应用。
本文档详细介绍了每个实验的目标、方法、结果和分析。
2.实验一:线性表的操作2.1 实验目标本实验旨在熟悉线性表的基本操作,并通过实践掌握线性表的顺序存储结构和链式存储结构的实现。
2.2 实验方法2.2.1 实验环境- 编程语言:C++- 开发工具:Visual Studio Code2.2.2 实验步骤1.实现顺序存储结构的线性表。
2.实现链式存储结构的线性表。
3.通过编写测试用例,验证线性表的各种操作。
2.3 实验结果与分析通过实验,我们完成了线性表的顺序存储结构和链式存储结构的实现,并且通过测试用例验证了它们的正确性。
3.实验二:树的操作3.1 实验目标本实验旨在熟悉树的基本操作,并通过实践掌握二叉树和平衡二叉树的实现。
3.2 实验方法3.2.1 实验环境- 编程语言:C++- 开发工具:Visual Studio Code3.2.2 实验步骤1.实现二叉树的基本操作,如插入节点、删除节点等。
2.实现平衡二叉树,并保持其平衡性。
3.通过编写测试用例,验证树的各种操作。
3.3 实验结果与分析通过实验,我们完成了二叉树和平衡二叉树的实现,并且通过测试用例验证了它们的正确性。
4.实验三:图的操作4.1 实验目标本实验旨在熟悉图的基本操作,并通过实践掌握图的表示方法和常用算法。
4.2 实验方法4.2.1 实验环境- 编程语言:C++- 开发工具:Visual Studio Code4.2.2 实验步骤1.实现图的邻接矩阵表示法和邻接链表表示法。
2.实现图的深度优先搜索和广度优先搜索算法。
3.通过编写测试用例,验证图的各种操作和算法的正确性。
4.3 实验结果与分析通过实验,我们完成了图的邻接矩阵表示法和邻接链表表示法的实现,以及深度优先搜索和广度优先搜索算法的实现,并且通过测试用例验证了它们的正确性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构与算法设计》实验报告——实验一学院:班级:学号:姓名:一、实验目的第一题利用单向环表实现约瑟夫环。
第二题归并顺序表。
二、实验内容第一题采用单向环表实现约瑟夫环。
请按以下要求编程实现:①从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表。
环表中的结点编号依次为1,2,……,m。
②从键盘输入整数s(1<=s<=m)和n,从环表的第s个结点开始计数为1,当计数到第n个结点时,输出该第n结点对应的编号,将该结点从环表中消除,从输出结点的下一个结点开始重新计数到n,这样,不断进行计数,不断进行输出,直到输出了这个环表的全部结点为止。
例如,m=10,s=3,n=4。
则输出序列为:6,10,4,9,5,2,1,3,8,7。
第二题选作:归并顺序表。
请按以下要求编程实现:①从键盘输入两个升序排列的整数序列linka和linkb,每个序列以输入0为结束标记。
②将链表linka和linkb归并为linkc,linkc仍然为升序排列。
归并完成后,linka 和linkb为空表。
输出linkc。
③对linkc进行处理,保持升序不变,删除其中重复的整数,对重复的整数只保留一个,输出删除重复整数后的链表。
例如:linka输入为:10 20 30 40 50 0linkb输入为:15 20 25 30 35 40 45 50 0归并后的linkc为:10 15 20 20 25 30 30 35 40 40 45 50 50删除重复后的linkc为:10 15 20 25 30 35 40 45 50三、程序设计1、概要设计第一题为了实现程序功能,应当建立单向环表来寄存信息及结点,通过查找结点来完成相应的操作。
顺序是:输入数据--建立头结点--建立环表--循环输出和删除结点。
程序流程第二题为了实现程序功能,应当建立单向链表来寄存信息及结点,顺序是:输入数据--建立头结点--建立链表--合并链表--输出链表--删除重复数据--输出链表。
程序流程2、详细设计第一题#include <stdio.h>#include <stdlib.h>//定义结构体typedef struct LNode {int data;struct LNode *next;}LNode,*LinkList;//创建具有m个结点的单向环表void Create(LinkList &l,int m){LinkList p;l=(LinkList)malloc(sizeof(LNode));l->next=NULL;l->data=1;for(int i=m;i>1;i--){p=(LinkList)malloc(sizeof(LNode));p->data=i;if(i==m) p->next=l;else p->next=l->next;l->next=p;}}//主函数int main (){int m,s,n,i;LNode *l,*p,*q;printf("请输入m s n\n");scanf("%d %d %d",&m,&s,&n);Create(l,m);for(i=1,p=l;i<s;i++)//寻找起始结点sp=p->next;while (m--){for(i=1;i<n-1;i++) //计数到第n个结点时,输出该第n结点对应的编号p=p->next;q=p->next;printf("%d ",q->data);p->next=q->next; //将该结点从环表中消除p=p->next;free(q);}return 0;}第二题#include <stdio.h>#include <stdlib.h>typedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;//从键盘输入升序排列的整数序列,序列以输入0为结束标记。
void create(LinkList &head){LinkList p,q;int n;head=(LinkList)malloc(sizeof(LNode));head->next=NULL;scanf("%d",&n);p=(LinkList)malloc(sizeof(LNode));p=head;while(n!=0){q=(LinkList)malloc(sizeof(LNode));q->data=n;q->next=p->next;p->next=q;p=q;scanf("%d",&n);}}//将链表La和Lb归并为Lc,Lc仍然为升序排列void paixu(LinkList &La,LinkList &Lb,LinkList &Lc){ LinkList pa,pb,pc,p,q;pa=La->next; pb=Lb->next;Lc=(LinkList)malloc(sizeof(LNode));Lc->next=NULL;pc=Lc;while(pa&&pb){ if(pa->data<=pb->data){pc->next=pa;pc=pa;pa=pa->next;}else {pc->next=pb;pc=pb;pb=pb->next;}}pc->next=pa?pa:pb;}//对c进行处理,保持升序不变,删除其中重复的整数,对重复的整数保留一个void shanchu(LinkList &c){LinkList p,q;p=(LinkList)malloc(sizeof(LNode));q=(LinkList)malloc(sizeof(LNode));p=c->next;while(p->next!=NULL){if(p->data==p->next->data){q=p->next;p->next=q->next;}else p=p->next;}}//输出链表cvoid output(LinkList &c){LinkList p;p=(LinkList)malloc(sizeof(LNode));p=c->next;while(p->next!=NULL){printf("%d ",p->data);p=p->next;}printf("%d\n",p->data);}//主函数int main(){ LNode *a,*b,*c;printf("请输入整数序列linka:\n");create(a);printf("请输入整数序列linkb:\n");create(b);paixu(a,b,c);free(a); free(b); //归并完成后,a和b为空表output(c);shanchu(c);output(c);return 0;}四、程序调试分析第一题计数到第n个结点时应定位在n-1个节点,这样才能删除第n个节点。
第二题将链表a和链表b合并时易出错,需要理好关系,可以借助画图试思路更清晰。
体会当程序运行出现问题的时候,一定要仔细一步步去调试,很有可能一个很小的漏洞就导致整个程序的错误。
五、程序运行结果与分析第一题测试用例1输入:10 5 4输出:8 2 6 1 7 4 3 5 10 9测试用例2输入:15 3 4输出:6 10 14 3 8 13 4 11 2 12 7 5 9 1 15第二题测试用例1输入:10 20 30 40 010 15 20 25 30 0输出:10 10 15 20 20 25 30 30 4010 15 20 25 30 40测试用例2输入:100 200 300 400 0150 200 300 350 400 0输出:100 150 200 200 300 300 350 400 400100 150 200 300 350 400六、用户使用说明书第一题1、本程序的运行环境为Windows操作系统下的DEV c++。
2、在VC环境下打开程序后,按要求键入m,s,n的值,敲击“回车符”,即可以显示要求的结果。
第二题1、本程序的运行环境为Windows操作系统下的DEV c++。
2、在VC环境下打开程序后,从键盘输入两个升序排列的整数序列a和b,每个序列以输入0为结束标记,敲击“回车符”,即可以显示要求的结果。
七、程序清单第一题注释见程序详细设计。
第二题注释见程序详细设计。