数据结构实验报告(2015级)及答案
- 格式:doc
- 大小:2.44 MB
- 文档页数:159
数据结构课程实验报告要求实验题目:回文判断算法班级通信143姓名刘海波学号2014101114日期2015.6.17一、需求分析1.程序的功能;利用栈和队列的操作来实现对字符序列是否是一个回文序列的判断。
设计和验证入栈、出栈及入队、出队的算法。
2.输入输出的要求;从键盘读入一组字符序列,按输入顺序入队列到链式队列A中。
并将创建好的A队列中元素依次遍历,打印在屏幕上。
将字符序列从A队列出队列,压入到一个顺序栈中。
再将字符序列从顺序栈中出栈,入队到另一个链式队列B中。
将创建好的B队列中元素依次遍历,打印在屏幕上。
将A,B队列中的元素出队逐一比较,判断是否一致。
若一致则是回文,并将判定结果打印到屏幕上。
3.测试数据:输入一组字符串进行判断。
二、概要设计1.本程序所用的抽象数据类型的定义;typedef struct{char item[STACKSIZE];int top;}SqStack;typedef struct QNode{char data;struct QNode *next;}LQNode, *PQNode;typedef struct{PQNode front,rear;} LinkQueue;2.主程序的流程及各程序模块之间的层次关系。
从键盘上读取一个字符,同时存储在顺序栈与链队列之中,直到字符序列的最后一个字符为*停止插入。
在程序中设置了一个标志位flag,将输入的序列分别做入栈、出栈、入队、出队操作,若出栈与出队的数据完全一致,则将flag标志为1,否则为零。
Flag 为1,则表示该序列是回文序列,否则,为非回文序列。
三、详细设计1.采用c语言定义相关的数据类型;typedef struct{char item[STACKSIZE];int top;}SqStack;typedef struct QNode{char data;struct QNode *next;}LQNode, *PQNode;typedef struct{PQNode front,rear;} LinkQueue;2.写出各模块的伪码算法;int InitStack(SqStack *S)int StackEmpty(SqStack S)int Push(SqStack *s, char data)int Pop(SqStack *s, char *data)int InitQueue(LinkQueue *q)int QueueEmpty(LinkQueue q)int EnQueue(LinkQueue *q, char item)int DeQueue(LinkQueue *q, char *item)int PutOutQueue(LinkQueue q)四、调试分析1.调试中遇到的问题及对问题的解决方法;对于语句中的一般回文单词能正常输出,句末跟标点符号连在一起的回文单词也能通过程序把字符串末尾的标点给去掉并正常输出,而字符串中的连接符可以作为回文单词的组成部分一起输出。
《数据结构》实验报告模板(附实例)---实验一线性表的基本操作实现实验一线性表的基本操作实现及其应用一、实验目的1、熟练掌握线性表的基本操作在两种存储结构上的实现,其中以熟悉各种链表的操作为重点。
2、巩固高级语言程序设计方法与技术,会用线性链表解决简单的实际问题。
二、实验内容√ 1、单链表的表示与操作实现 ( * )2、约瑟夫环问题3、Dr.Kong的艺术品三、实验要求1、按照数据结构实验任务书,提前做好实验预习与准备工作。
2、加“*”题目必做,其他题目任选;多选者并且保质保量完成适当加分。
3、严格按照数据结构实验报告模板和规范,及时完成实验报告。
四、实验步骤(说明:依据实验内容分别说明实验程序中用到的数据类型的定义、主程序的流程以及每个操作(成员函数)的伪码算法、函数实现、程序编码、调试与分析、总结、附流程图与主要代码)㈠、数据结构与核心算法的设计描述(程序中每个模块或函数应加注释,说明函数功能、入口及出口参数)1、单链表的结点类型定义/* 定义DataType为int类型 */typedef int DataType;/* 单链表的结点类型 */typedef struct LNode{ DataType data;struct LNode *next;}LNode,*LinkedList;2、初始化单链表LinkedList LinkedListInit( ){ // 每个模块或函数应加注释,说明函数功能、入口及出口参数 }3、清空单链表void LinkedListClear(LinkedList L){// 每个模块或函数应加注释,说明函数功能、入口及出口参数}4、检查单链表是否为空int LinkedListEmpty(LinkedList L){ …. }5、遍历单链表void LinkedListTraverse(LinkedList L){….}6、求单链表的长度int LinkedListLength(LinkedList L){ …. }7、从单链表表中查找元素LinkedList LinkedListGet(LinkedList L,int i){ //L是带头结点的链表的头指针,返回第 i 个元素 }8、从单链表表中查找与给定元素值相同的元素在链表中的位置LinkedList LinkedListLocate(LinkedList L, DataType x){ …… }9、向单链表中插入元素void LinkedListInsert(LinkedList L,int i,DataType x) { // L 为带头结点的单链表的头指针,本算法// 在链表中第i 个结点之前插入新的元素 x}10、从单链表中删除元素void LinkedListDel(LinkedList L,DataType x){ // 删除以 L 为头指针的单链表中第 i 个结点 }11、用尾插法建立单链表LinkedList LinkedListCreat( ){ …… }㈡、函数调用及主函数设计(可用函数的调用关系图说明)㈢程序调试及运行结果分析㈣实验总结五、主要算法流程图及程序清单1、主要算法流程图:2、程序清单(程序过长,可附主要部分)说明:以后每次实验报告均按此格式书写。
数据结构实验报告数据结构实验报告精选2篇(一)实验目的:1. 熟悉数据结构的基本概念和基本操作;2. 掌握线性表、栈、队列、链表等经典数据结构的实现方法;3. 掌握数据结构在实际问题中的应用。
实验内容:本次实验主要包括以下几个部分:1. 线性表的实现方法,包括顺序表和链表,分别使用数组和链表来实现线性表的基本操作;2. 栈的实现方法,包括顺序栈和链式栈,分别使用数组和链表来实现栈的基本操作;3. 队列的实现方法,包括顺序队列和链式队列,分别使用数组和链表来实现队列的基本操作;4. 链表的实现方法,包括单链表、双链表和循环链表,分别使用指针链、双向链和循环链来实现链表的基本操作;5. 综合应用,使用各种数据结构来解决实际问题,例如使用栈来实现括号匹配、使用队列来实现马铃薯游戏等。
实验步骤及结果:1. 线性表的实现方法:a) 顺序表的基本操作:创建表、插入元素、删除元素、查找元素等;b) 链表的基本操作:插入节点、删除节点、查找节点等;c) 比较顺序表和链表的优缺点,分析适用场景。
结果:通过实验,确认了顺序表适用于频繁查找元素的情况,而链表适用于频繁插入和删除节点的情况。
2. 栈的实现方法:a) 顺序栈的基本操作:进栈、出栈、判空、判满等;b) 链式栈的基本操作:进栈、出栈、判空、判满等。
结果:通过实验,掌握了栈的基本操作,并了解了栈的特性和应用场景,例如括号匹配。
3. 队列的实现方法:a) 顺序队列的基本操作:入队、出队、判空、判满等;b) 链式队列的基本操作:入队、出队、判空、判满等。
结果:通过实验,掌握了队列的基本操作,并了解了队列的特性和应用场景,例如马铃薯游戏。
4. 链表的实现方法:a) 单链表的基本操作:插入节点、删除节点、查找节点等;b) 双链表的基本操作:插入节点、删除节点、查找节点等;c) 循环链表的基本操作:插入节点、删除节点、查找节点等。
结果:通过实验,掌握了链表的基本操作,并了解了链表的特性和应用场景。
《数据结构》实验报告姓名:学号:班级:学院:实验一单链表实验(一)实验目的1.理解线性表的链式存储结构。
2.熟练掌握动态链表结构及有关算法的设计。
3.根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法。
(二)实验任务编写算法实现下列问题的求解1.求链表中第i个结点的指针(函数),若不存在,则返回NULL。
2.在第i个结点前插入值为x的结点。
3.删除链表中第i个元素结点。
4.在一个递增有序的链表L中插入一个值为x的元素,并保持其递增有序特性。
5.将单链表L中的奇数项和偶数项结点分解开,并分别连成一个带头结点的单链表,然后再将这两个新链表同时输出在屏幕上,并保留原链表的显示结果,以便对照求解结果。
6.求两个递增有序链表L1和L2中的公共元素,并以同样方式连接成链表L3。
(三)主要仪器设备PC机,Windows操作平台,Visual C++(四)实验分析顺序表操作:定义一个顺序表类,该类包括顺序表的存储空间、存储容量和长度,以及构造、插入、删除、遍历等操作的方法(五)源程序头文件文件名:linklist.h#include<iostream>using namespace std;struct node{int data;node *next;};class list{public:list();int length()const{return count; //求链表长度}~list();void create(); //链表构建,以0为结束标志void output(); //链表输出int get_element(const int i)const; //按序号取元素node *locate(const int x) const; //搜索对应元素int insert(const int i,const int x); //插入对应元素int delete_element(const int i); //删除对应元素node *get_head(){return head; //读取头指针}void insert2(const int x);friend void SplitList(list L1, list&L2, list &L3);friend void get_public(list L1, list L2, list &L3);private:int count;node *head;};list::list(){head=new node;head->next=NULL;count=0;}void list::create() //链表构建,以0为结束标志{int x;cout<<"请输入当前链表,以0为结束符。
班级:姓名:学号:实验一线性表的基本操作一、实验目的1、掌握线性表的定义;2、掌握线性表的基本操作;如建立、查找、插入和删除等..二、实验内容定义一个包含学生信息学号;姓名;成绩的顺序表和链表二选一;使其具有如下功能:1 根据指定学生个数;逐个输入学生信息;2 逐个显示学生表中所有学生的相关信息;3 根据姓名进行查找;返回此学生的学号和成绩;4 根据指定的位置可返回相应的学生信息学号;姓名;成绩;5 给定一个学生信息;插入到表中指定的位置;6 删除指定位置的学生记录;7 统计表中学生个数..三、实验环境Visual C++四、程序分析与实验结果#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<string.h>#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status; // 定义函数返回值类型typedef struct{char num10; // 学号char name20; // 姓名double grade; // 成绩}student;typedef student ElemType;typedef struct LNode{ElemType data; // 数据域struct LNode *next; //指针域}LNode;*LinkList;Status InitListLinkList &L // 构造空链表L {L=struct LNode*mallocsizeofstruct LNode; L->next=NULL;return OK;}Status GetElemLinkList L;int i;ElemType &e // 访问链表;找到i位置的数据域;返回给 e{LinkList p;p=L->next;int j=1;whilep&&j<i{p=p->next;++j;}ifp||j>i return ERROR;e=p->data;return OK;}Status SearchLNode L;char str;LinkList &p // 根据名字查找{p=L.next;whilep{ifstrcmpp->;str==0return OK;p=p->next;}return ERROR;}Status ListInsertLinkList L;int i;ElemType e // 在i个位置插入某个学生的信息{LinkList p;s;p=L;int j=0;whilep&&j<i-1{p=p->next;++j;}ifp||j>i-1 return ERROR;s=struct LNode*mallocsizeofLNode;s->data=e;s->next=p->next;p->next=s;return OK;}Status ListDeleteLinkList p;int i // 删除i位置的学生信息{int j=0;whilep->next&&j<i-1{p=p->next;++j;}ifp->next||j>i-1 return ERROR;LinkList q;q=p->next;p->next=q->next;delete q;return OK;}void InputElemType *e{printf"姓名:"; scanf"%s";e->name;printf"学号:"; scanf"%s";e->num;printf"成绩:"; scanf"%lf";&e->grade;printf"输入完成\n\n";}void OutputElemType *e{printf"姓名:%-20s\n学号:%-10s\n成绩:%-10.2lf\n\n";e->name;e->num;e->grade;}int main{LNode L;LinkList p;ElemType a;b;c;d;printf"\n********************************\n\n";puts"1. 构造链表";puts"2. 录入学生信息";puts"3. 显示学生信息";puts"4. 输入姓名;查找该学生";puts"5. 显示某位置该学生信息";puts"6. 在指定位置插入学生信息";puts"7. 在指定位置删除学生信息";puts"8. 统计学生个数";puts"0. 退出";printf"\n********************************\n\n"; int x;choose=-1;whilechoose=0{puts"请选择:";scanf"%d";&choose;switchchoose{case 1:ifInitListpprintf"成功建立链表\n\n";elseprintf"链表建立失败\n\n";break;case 2:printf"请输入要录入学生信息的人数:";scanf"%d";&x;forint i=1;i<=x;i++{printf"第%d个学生:\n";i;Input&a;ListInsert&L;i;a;}break;case 3:forint i=1;i<=x;i++{GetElem&L;i;b;Output&b;}break;case 4:char s20;printf"请输入要查找的学生姓名:";scanf"%s";s;ifSearchL;s;pOutput&p->data;elseputs"对不起;查无此人";puts"";break;case 5:printf"请输入要查询的位置:";int id1;scanf"%d";&id1;GetElem&L;id1;c;Output&c;break;case 6:printf "请输入要插入的位置:";int id2;scanf"%d";&id2;printf"请输入学生信息:\n";Input&d;ifListInsert&L;id2;d{x++;puts"插入成功";puts"";}else{puts"插入失败";puts"";}break;case 7:printf"请输入要删除的位置:";int id3;scanf"%d";&id3;ifListDelete&L;id3{x--;puts"删除成功";puts"";}else{puts"删除失败";puts"";}break;case 8:printf"已录入的学生个数为:%d\n\n";x;break;}}printf"\n\n谢谢您的使用;请按任意键退出\n\n\n"; system"pause";return 0;}用户界面:(1)根据指定学生个数;逐个输入学生信息:(2)逐个显示学生表中所有学生的相关信息:(3)根据姓名进行查找;返回此学生的学号和成绩:(4)根据指定的位置可返回相应的学生信息学号;姓名;成绩:(5)给定一个学生信息;插入到表中指定的位置:(6)删除指定位置的学生记录:(7)统计表中学生个数:五、实验总结数据结构是一门专业技术基础课..它要求学会分析研究计算机加工的数据结构的特性;以便为应用涉及的数据选择适当的逻辑结构;存储结构及相应的算法;并初步掌握算法的时间分析和空间分析技术..不仅要考虑具体实现哪些功能;同时还要考虑如何布局;这次的实验题目是根据我们的课本学习进程出的;说实话;我并没有真正的读懂书本的知识;所以刚开始的时候;感到很棘手;于是又重新细读课本;这一方面又加强了对书本的理解;在这上面花费了一些心血;觉得它并不简单;是需要花大量时间来编写的....在本次实验中;在程序构思及设计方面有了较大的锻炼;能力得到了一定的提高..。
《数据结构课程设计》指导书•实验目的意义数据结构实验是《数据结构》课程必不可少的一个教学环节。
通过实验,学生不仅能够深化理解教学内容,进一步提高灵活运用数据结构和算法的能力,而且可以在问题分析、总体结构设计、算法设计、程序设计、上机操作及程序调试等基本技能方面受到综合训练。
实验着眼于原理与应用的结合点,使学生学会如何把书本上和课堂上学到的知识用于解决实际问题,从而培养软件工作所需要的动手能力。
•实验基本步骤及要求1.阅读实验指导书每一次实验从阅读实验指导书开始。
对于本次实验的实验目的、实验题目、实现提示以及思考题目、选做题目等应认真了解。
2.算法设计分析实验题目,参考实现提示,进行算法设计。
3.程序设计根据已完成的算法,用C语言或java进行程序设计。
4.调试和测试将所编程序在计算机上调试通过,并选取若干组测试数据对程序进行尽可能全面的测试。
5.整理完成实验报告实验报告一般包括下列内容:(1)实验者姓名、学号、专业和班级,课程名称(数据结构实验),实验日期等;(2)本次实验的实验编号及实验名称(例如:实验一线性表的应用);(3)本次实验的实验目的(可参考《数据结构实验指导》相关内容);(4)本次实验的实验地点、设备编号、硬件及软件环境;(5)程序结构的描述及各模块的规格说明;(6)主要算法及其基本思想;(7)调试过程简述(调试过程是否顺利,遇到些什么问题,如何解决的,以及上机操作所花费的时间等);(8)测试数据和相应输出的客观纪录,对运行结果的分析讨论。
•注意:为了有效地利用上机时间,上述实验步骤1,2,3应在上机之前完成。
1目录实验一顺序表及其在简单排序中的应用实验二线性表的链式存储实验三各种排序算法的比较实验四栈及其应用实验五栈和队列的综合应用实验六二叉树及其应用实验七图论及其应用实验八(1) 表达式求值实验八(2) 停车场管理模拟实验八(3) 哈希表设计(《数据结构题集6.2》)2实验一顺序表及其在简单排序中的应用一.实验目的熟悉线性表的顺序存储结构,熟练掌握顺序表的抽象数据类型及各种基本操作的实现;利用所定义的顺序表抽象数据类型实现各类排序算法,培养灵活运用顺序表解决实际问题的能力。
数据结构实验报告1000实验一顺序表的删除Description实现一个线性表,对一个n不超过1000的线性表进行删除操作。
Input第一行有一个整数n,表示线性表的大小,第二行有n个整数,分别是list1,list2...listn。
第三行有一个整数q,表示q次删除操作,接下来q 行,每行有一个整数k,表示删除线性表中第k个元素。
(输入有多组测试数据,以EOF结束)Output对于每次删除操作输出一行,如果k不合法(k大于n或者k为0),输出-1, 否则输出删除的元素。
Sample Input5 3 2 1 5 4 3 5 5 2Sample Output4 -1 2#include <stdio.h>void sq_delete(int list[],int n,int j,int k[]){int i,t;for(i=0;i<j;i++){if(k[i]>n||k[i]<=0)printf("-1\n");else{printf("%d\n",list[k[i]-1]);for(t=k[i];t<n;t++)list[t-1]=list[t];n--;}}}int main(){int z,n,list[1024],j,k[1024];scanf("%d",&n);for(z=0;z<n;z++)scanf("%d",&list[z]);scanf("%d",&j);for(z=0;z<j;z++) scanf("%d",&k[z]);sq_delete(list,n,j,k);}运行结果:1001实验二链表及其多项式相加Description通过有序对输入多项式的各个项,利用单链表存储该一元多项式,并建立的2个存储一元多项式的单链表,然后完成2个一元多项式的相加,并输出相加后的多项式。
数据结构课程实验报告一、实验目的本次数据结构课程实验的主要目的是通过实践掌握常见数据结构的基本操作,包括线性结构、树形结构和图形结构。
同时,也要求学生能够熟练运用C++语言编写程序,并且能够正确地使用各种算法和数据结构解决具体问题。
二、实验内容本次实验涉及到以下几个方面:1. 线性表:设计一个线性表类,并且实现线性表中元素的插入、删除、查找等基本操作。
2. 栈和队列:设计一个栈类和队列类,并且分别利用这两种数据结构解决具体问题。
3. 二叉树:设计一个二叉树类,并且实现二叉树的遍历(前序遍历、中序遍历和后序遍历)。
4. 图论:设计一个图类,并且利用图论算法解决具体问题(如最短路径问题)。
三、实验过程1. 线性表首先,我们需要设计一个线性表类。
在这个类中,我们需要定义一些成员变量(如线性表大小、元素类型等),并且定义一些成员函数(如插入元素函数、删除元素函数等)。
在编写代码时,我们需要注意一些细节问题,如边界条件、异常处理等。
2. 栈和队列接下来,我们需要设计一个栈类和队列类。
在这两个类中,我们需要定义一些成员变量(如栈顶指针、队头指针等),并且定义一些成员函数(如入栈函数、出栈函数、入队函数、出队函数等)。
在编写代码时,我们需要注意一些细节问题,如空间不足的情况、空栈或空队列的情况等。
3. 二叉树然后,我们需要设计一个二叉树类,并且实现二叉树的遍历。
在这个类中,我们需要定义一个节点结构体,并且定义一些成员变量(如根节点指针、节点数量等),并且定义一些成员函数(如插入节点函数、删除节点函数、遍历函数等)。
在编写代码时,我们需要注意一些细节问题,如递归调用的情况、空节点的情况等。
4. 图论最后,我们需要设计一个图类,并且利用图论算法解决具体问题。
在这个类中,我们需要定义一个邻接矩阵或邻接表来表示图形结构,并且定义一些成员变量(如顶点数量、边的数量等),并且定义一些成员函数(如添加边函数、删除边函数、最短路径算法等)。
数据结构实验报告实验题目:Huffman编码与解码姓名:学号:院系:实验名称:Huffman编码与解码实验问题描述:本实验需要以菜单形式完成以下功能:1.输入电文串2.统计电文串中各个字符及其出现的次数3.构造哈弗曼树4.进行哈弗曼编码5.将电文翻译成比特流并打印出来6.将比特流还原成电文数据结构的描述:逻辑结构:本实验可用二叉树实现,其逻辑结构为一对二的形式,即一个结点对应两个结点。
在实验过程中我们也应用到了栈的概念。
存储结构:使用结构体来对数据进行存储:typedef struct{int weight;int parent,lc,rc;}HTNode,*HuffmanTree;typedef struct LNode{char *elem;int stacksize;int top;}SqStack;在main函数里面定义一个哈弗曼树并实现上述各种功能。
程序结构的描述:本次实验一共构造了10个函数:1.void HuffTree(HuffmanTree &HT,int n[],int mun);此函数根据给定的mun个权值构建哈弗曼树,n[]用于存放num个权值。
2.void Select(HuffmanTree &HT,int n,int i,int &s1,int &s2);此函数用于在HT[1,i-1]中选择parent为0且weight为最小的两个结点,其下标分别为s1,s2.3.void HuffmanCoding(HuffmanTree HT,char **&HC,int n);此函数从哈弗曼树HT上求得n 个叶子结点的哈弗曼编码并存入数组HC中。
4.void Coding(HuffmanTree HT,char **HC,int root,SqStack &S);此函数用于哈弗曼编码,先序遍历哈弗曼树HT,求得每个叶子结点的编码字符串,存入数组HC,S为一个顺序栈,用来记录遍历路径,root是哈弗曼数组HT中根结点的位置下标。
2015年广工数据结构Anyview答案/**********1.06【题目】试写一算法,实现顺序栈的判空操作StackEmpty_Sq(SqStack S)。
顺序栈的类型定义为:typedef struct {ElemType *elem; // 存储空间的基址int top; // 栈顶元素的下一个位置,简称栈顶位标int size; // 当前分配的存储容量int increment; // 扩容时,增加的存储容量} SqStack; // 顺序栈***********/Status StackEmpty_Sq(SqStack S)/* 对顺序栈S判空。
*//* 若S是空栈,则返回TRUE;否则返回FALSE */{if(S.top == 0)return TRUE;elsereturn FALSE;}/**********1.08【题目】试编写算法求一元多项式P(x) = a0 + a1x + a2x^2 + ... + anx^n的值P(x0),并确定算法中每一语句的执行次数和整个算法的时间复杂度。
**********/float Polynomial(int n, int a[], float x)/* 求一元多项式的值P(x)。
*//* 数组a的元素a[i]为i次项的系数,i=0,...,n */{float jieguo=a[n]; //1次for(int i=n-1;i>=0;i--) //n次{jieguo=a[i]+x*jieguo;}return jieguo; //整体时间复杂度T(n)=O(n) }1.11【题目】已知k阶裴波那契序列的定义为f(0)=0, f(1)=0, ..., f(k-2)=0, f(k-1)=1;f(n)=f(n-1)+f(n-2)+...+f(n-k), n=k,k+1,...试编写求k阶裴波那契序列的第m项值的函数算法,k和m均以值调用的形式在函数参数表中出现。
数据结构实验报告-实验⼀顺序表、单链表基本操作的实现实验⼀顺序表、单链表基本操作的实现l 实验⽬的1、顺序表(1)掌握线性表的基本运算。
(2)掌握顺序存储的概念,学会对顺序存储数据结构进⾏操作。
(3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能⼒。
l 实验内容1、顺序表1、编写线性表基本操作函数:(1)InitList(LIST *L,int ms)初始化线性表;(2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插⼊元素;(3)DeleteList1(LIST *L,int item)删除指定元素值的线性表记录;(4)DeleteList2(LIST *L,int rc)删除指定位置的线性表记录;(5)FindList(LIST *L,int item)查找线性表的元素;(6)OutputList(LIST *L)输出线性表元素;2、调⽤上述函数实现下列操作:(1)初始化线性表;(2)调⽤插⼊函数建⽴⼀个线性表;(3)在线性表中寻找指定的元素;(4)在线性表中删除指定值的元素;(5)在线性表中删除指定位置的元素;(6)遍历并输出线性表;l 实验结果1、顺序表(1)流程图(2)程序运⾏主要结果截图(3)程序源代码#include<stdio.h>#include<stdlib.h>#include<malloc.h>struct LinearList/*定义线性表结构*/{int *list; /*存线性表元素*/int size; /*存线性表长度*/int Maxsize; /*存list数组元素的个数*/};typedef struct LinearList LIST;void InitList(LIST *L,int ms)/*初始化线性表*/{if((L->list=(int*)malloc(ms*sizeof(int)))==NULL){printf("内存申请错误");exit(1);}L->size=0;L->Maxsize=ms;}int InsertList(LIST *L,int item,int rc)/*item记录值;rc插⼊位置*/ {int i;if(L->size==L->Maxsize)/*线性表已满*/return -1;if(rc<0)rc=0;if(rc>L->size)rc=L->size;for(i=L->size-1;i>=rc;i--)/*将线性表元素后移*/L->list[i+=1]=L->list[i];L->list[rc]=item;L->size++;return0;}void OutputList(LIST *L)/*输出线性表元素*/{int i;printf("%d",L->list[i]);printf("\n");}int FindList(LIST *L,int item)/*查找线性元素,返回值>=0为元素的位置,返回-1为没找到*/ {int i;for(i=0;i<L->size;i++)if(item==L->list[i])return i;return -1;}int DeleteList1(LIST *L,int item)/*删除指定元素值得线性表记录,返回值为>=0为删除成功*/ {int i,n;for(i=0;i<L->size;i++)if(item==L->list[i])break;if(i<L->size){for(n=i;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return i;}return -1;}int DeleteList2(LIST *L,int rc)/*删除指定位置的线性表记录*/{int i,n;if(rc<0||rc>=L->size)return -1;for(n=rc;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return0;}int main(){LIST LL;int i,r;printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.size,LL.Maxsize);printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.list,LL.Maxsize);while(1){printf("请输⼊元素值,输⼊0结束插⼊操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d",&i);if(i==0)break;printf("请输⼊插⼊位置:");scanf("%d",&r);InsertList(&LL,i,r-1);printf("线性表为:");OutputList(&LL);}while(1){printf("请输⼊查找元素值,输⼊0结束查找操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d ",&i);if(i==0)break;r=FindList(&LL,i);if(r<0)printf("没有找到\n");elseprintf("有符合条件的元素,位置为:%d\n",r+1);}while(1){printf("请输⼊删除元素值,输⼊0结束查找操作:");fflush(stdin);/*清楚标准缓存区*/scanf("%d",&i);if(i==0)break;r=DeleteList1(&LL,i);if(i<0)printf("没有找到\n");else{printf("有符合条件的元素,位置为:%d\n线性表为:",r+1);OutputList(&LL);}while(1){printf("请输⼊删除元素位置,输⼊0结束查找操作:");fflush(stdin);/*清楚标准输⼊缓冲区*/scanf("%d",&r);if(r==0)break;i=DeleteList2(&LL,r-1);if(i<0)printf("位置越界\n");else{printf("线性表为:");OutputList(&LL);}}}链表基本操作l 实验⽬的2、链表(1)掌握链表的概念,学会对链表进⾏操作。
数据结构实验报告一、实验目的1、深入理解和掌握常见的数据结构,如线性表、栈、队列、树、图等。
2、提高运用数据结构解决实际问题的能力。
3、培养编程实践能力和调试程序的技巧。
二、实验环境操作系统:Windows 10编程环境:Visual Studio 2019编程语言:C++三、实验内容(一)线性表的实现与操作1、顺序表的实现定义一个数组来存储线性表的元素。
实现插入、删除、查找等基本操作。
2、链表的实现设计链表节点结构。
完成链表的创建、插入、删除和遍历操作。
(二)栈和队列的应用1、栈的实现与应用用数组或链表实现栈结构。
解决表达式求值问题。
2、队列的实现与应用实现顺序队列和循环队列。
模拟银行排队叫号系统。
(三)树的操作与遍历1、二叉树的创建与遍历采用递归或非递归方法实现先序、中序和后序遍历。
计算二叉树的深度和节点个数。
2、二叉搜索树的操作实现插入、删除和查找操作。
分析其时间复杂度。
(四)图的表示与遍历1、邻接矩阵和邻接表表示图分别用两种方式存储图的结构。
比较它们的优缺点。
2、图的遍历实现深度优先遍历和广度优先遍历。
应用于最短路径问题的求解。
四、实验步骤(一)线性表的实现与操作1、顺序表首先,定义一个足够大的数组来存储元素。
在插入操作中,若数组已满,需要进行扩容操作。
然后,将指定位置后的元素向后移动,插入新元素。
删除操作时,将指定位置后的元素向前移动,覆盖被删除元素。
查找操作通过遍历数组进行。
2、链表设计链表节点包含数据域和指针域。
创建链表时,从空链表开始,逐个插入节点。
插入节点时,根据插入位置找到前一个节点,修改指针链接。
删除节点时,修改相关指针,释放被删除节点的内存。
(二)栈和队列的应用1、栈用数组实现栈时,定义一个数组和一个栈顶指针。
入栈操作将元素放入栈顶指针所指位置,栈顶指针加 1。
出栈操作取出栈顶元素,栈顶指针减 1。
对于表达式求值,将操作数入栈,遇到运算符时弹出操作数进行计算,结果再入栈。
-魏伟-实验报告 ———————————————————————————————— 作者: ———————————————————————————————— 日期:
ﻩ计算机科学与工程学院 《算法与数据结构》实验报告(五) 专业班级 2013级计算机工程专业02班 实验地点 403机房 学生学号 1305120617 指导教师 蔡琼 学生姓名 魏伟 实验时间 2015-05-02
实验项目 稀疏矩阵的应用 实验类别 基础性(√) 设计性() 综合性() 其它( ) 实验目的及要求
(1)掌握掌握稀疏矩阵的表示方法及其运算的实现; (2)实现稀疏矩阵在三元组、十字链表等表示下的各运算并分析
其效率。
成 绩 评 定 表 类 别 评 分 标 准 分值 得分 合 计
上机表现 积极出勤、遵守纪律 按要求完成设计任务 30分
程序与报告 程序代码规范、功能正确 报告详实完整、体现收获 70分 说明:
评阅教师: 蔡琼 日 期: 2015 年 5 月 9 日
实 验 内 容 实验内容 在m×n 的矩阵中,有t个非零元。令δ= t/(m*n),称δ矩阵的稀疏因子,常认为δ≤0.05时称为稀疏矩阵。稀疏矩阵在工程中有着大量的应用,不少工程问题都可以转化为对稀疏矩阵的计算问题。用三元组表实现稀疏矩阵的转置,用(顺序取,直接存)方法。
实验说明: 引入两个数组作为辅助数据结构: num[nu]:表示矩阵A中某列的非零元素的个数; cpot[nu]:初始值表示矩阵A中某列的第一个非零元素在B中的位置。 ﻩnum与cpot递推关系:
ﻩﻩﻩﻩ
三元组表实现稀疏矩阵的转置(顺序取,直接存)算法伪代码如下:
存储一个稀疏矩阵需要定义一个三元组和三元组顺序表,三元组存储稀疏矩阵中非零元素的行坐标,列坐标和元素值(规定行列下标值从0开始),而三元组顺序表里则存储稀疏矩阵的行数,列数和非零元素的个数及其数值。 在实现矩阵转置的函数中,定义一个新的三元组顺序表用于存放转置后的矩阵,用A表示要转置的稀疏矩阵,B表示转置后的矩阵,则B的行数等于A的列数,列数等于A的行数,再从A中定位到每个非零元素,将其行坐标和列坐标对换后存入B中即实现了整个过程,最后输出转置后的矩阵。
《数据结构》实验报告二系别:班级:学号:姓名:日期:指导教师:一、上机实验的问题和要求:单链表的查找、插入与删除。
设计算法,实现线性结构上的单链表的产生以及元素的查找、插入与删除。
具体实现要求:1.从键盘输入10个字符,产生不带表头的单链表,并输入结点值。
2.从键盘输入1个字符,在单链表中查找该结点的位置。
若找到,则显示“找到了”;否则,则显示“找不到”。
3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出单链表所有结点值,观察输出结果。
4.从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。
5.(★)将单链表中值重复的结点删除,使所得的结果表中各结点值均不相同,输出单链表所有结点值,观察输出结果。
6.(★)删除其中所有数据值为偶数的结点,输出单链表所有结点值,观察输出结果。
7.(★)将单链表分解成两个单链表A和B,使A链表中含有原链表中序号为奇数的元素,而B链表中含有原链表中序号为偶数的元素,且保持原来的相对顺序,分别输出单链表A和单链表B的所有结点值,观察输出结果。
二、程序设计的基本思想,原理和算法描述:(包括程序的结构,数据结构,输入/输出设计,符号名说明等)1.程序结构:定义一个主函数和五个子函数(分别用来实现单链表的创建、查找、插入、删除及单链表的打印)。
2.数据结构:定义一个结构体,作为单链表的结点。
typedef struct stu /*DataType可以是任何相应的数据类型如int, float或char*/ {char Name[Max]; /*定义了数据域,这里存放的是一个字符型数组*/struct stu *next; /*定义了指针域*/}student;3.输入输出设计:创建单链表函数:student *create();输入:通过scanf( )函数及for语句为数据域定义,并定义指针域的指针所指的下一个结点。
数据结构实验报告(2015级)及答案 《数据结构》实验报告
专 业 __信息管理学院______ 年 级 __2015级___________ 学 号 ___ _______ 学生姓名 ___ _ _______ 指导老师 ____________
华中师范大学信息管理系编 2
I 实验要求 1.每次实验中有若干习题,每个学生至少应该完成其中的两道习题。 2.上机之前应作好充分的准备工作,预先编好程序,经过人工检查无误后,才能上机,以提高上机效率。 3.独立上机输入和调试自己所编的程序,切忌抄袭、拷贝他人程序。 4.上机结束后,应整理出实验报告。书写实验报告时,重点放在调试过程和小节部分,总结出本次实验中的得与失,以达到巩固课堂学习、提高动手能力的目的。
II 实验内容 实验一 线性表 【实验目的】 1.熟悉VC环境,学习如何使用C语言实现线性表的两种存储结构。 2.通过编程、上机调试,进一步理解线性表的基本概念,熟练运用C语言实现线性表基本操作。 3.熟练掌握线性表的综合应用问题。 【实验内容】 1.一个线性表有n个元素(nMAXSIZE指线性表的最大长度),且递增有。现有一元素x要插入到线性表的适当位置上,并保持线性表原有 3
的顺序不变。设计程序实现。要求:采用顺序存储表示实现;采用链式存储表示方法实现;比较两种方法的优劣。 2. 从单链表中删除指定的元素x,若x在单链表中不存在,给出提示信息。 要求: ①指定的值x由键盘输入; ②程序能处理空链表的情况。 3.设有头结点的单链表,编程对表中的任意值只保留一个结点,删除其余值相同的结点。 要求: ①该算法用函数(非主函数)实现; ②在主函数中调用创建链表的函数创建一个单链表,并调用该函数,验证算法的正确性。 LinkedList Exchange(LinkedList HEAD,p) ∥HEAD是单链表头结点的指针,p是链表中的一个结点。本算法将p所指结点与其后 继结点交换。 {q=head->next; ∥q是工作指针,指向链表中当前待处理结点。 pre=head; ∥pre是前驱结点指针,指向q的前驱。 while(q!=null && q!=p){pre=q;q=q->next;} ∥ 4
未找到p结点,后移指针。 if(p->next==null)printf(“p无后继结点\n”); ∥p是链表中最后一个结点,无后继。 else∥处理p和后继结点交换 {q=p->next; ∥暂存p的后继。 pre->next=q; ∥p前驱结点的后继指向p的后继。 p->next=q->next;∥p的后继指向原p后继的后继。 q->next=p ;∥原p后继的后继指针指向p。 } }∥算法结束。 4.已知非空单链表第一个结点由head指出,请写一算法,交换p所指结点与其下一个结点在链表中的位置。 要求: ①该算法用函数Reverse(head,p)实现,其中head为表头指针,p指向要交换的结点; ②在主函数中调用创建链表的函数创建一个单链表,并调用该函数,验证算法的正确性。 5.设有一个单链表,编写能够完成下列功能的算法: ①找出最小值的结点,且打印该数值; ②若该数值是奇数,则将其与直接后继结点交换; ③若该数值是偶数,则将其直接后继结点删除。 5
要求: 编写主函数验证算法的正确性。 6.在一链表中,已知每个结点含有三个域:data、next和prior,其中prior域为空,设计一个算法,使每个结点的prior指向它的前驱结点,形成双向循环链表。 要求: ①建立一个结点中含有三个域的单链表; ②在主函数中调用此算法,构成双向循环链表; ③在主函数中利用正向和逆向两种方式输出链表中的数据,验证算法的正确性。 7.用链表建立通讯录。通讯录内容有:姓名、通讯地址、电话号码。 要求: ①通讯录是按姓名项的字母顺序排列的; ②能查找通讯录中某人的信息; 提示: 可用链表来存放这个通讯录,一个人的信息作为一个结点。成链的过程可以这样考虑:先把头结点后面的第一个数据元素结点作为链中的首结点,也是末结点。从第二个数据开始逐一作为‘工作结点’,需从链表的首结点开始比较,如果‘工作结点’的数据比链中的‘当前结点’的数据小,就插在其前面。否则,再看后面是 6
否还有结点,若没有结点了就插在其后面成为末结点;若后面还有结点,再与后面的结点逐一比较处理。
【实验报告】 实习时间:2016/10/14 实习地点: 实习机号: 7
具 体 实 验 内 容
作了1,2,3,4,5,6题 1题
采用顺序存储表示实现的算法:
主数: 运行结果: 8
算法代码: bool Insert_Sq(SqList &L,ElemType x) { int i; if(L.length>=L.listsize) { L.elem=(ElemType *)realloc(L.elem,(L.listsize+L.incrementsize)*sizeof(ElemType)); if(!L.elem) return false; L.listsize+=L.incrementsize; } for(i=L.length-1;x=0;i--) L.elem[i+1]=L.elem[i]; L.elem[i+1]=x; L.length++; return true; }
采用链表实现的算法: 9
主函数: 运行结果:
算法代码: void Insert_L(LinkList &L,ElemType x) { LinkList p,q,m; p=L->next; q=L; while(p) 10
{ if(x>p->data&&p->next) {p=p->next;q=q->next;} else if(x>p->data&&!(p->next)) {
m=(LinkList)malloc(sizeof(LNode)); m->data=x; p->next=m; m->next=NULL; return; } else { m=(LinkList)malloc(sizeof(LNode)); m->data=x; m->next=p; q->next=m; return; } } } 比较两种算法的优劣:顺序表和链表都要和x逐项比较,顺序表找到x应放的位置之后插入,后面的元素都要向后移位,但链表只需修改指针即可,链 11
表相对易操作一些 2题算法:
主函数: 代码: 12
void Delete_L(LinkList &L) { ElemType x; cout<<"请输入元素x:"; cin>>x; LinkList p,q; p=L; if(!(p->next)) { cout<<"链表不存在"
q=p->next; p->next=NULL; free(q); return; } p=p->next; } cout<<"x不存在" 3题 算法: 14 主函数: 运行结果: 算法代码: void DeleteRepeat_L(LinkList &L) { LinkList p,q,m; p=L->next; 15 while(p->next!=NULL) { q=p; while(q->next!=NULL) { if(q->next->data==p->data) { m=q->next; q->next=m->next; free(m); } else q=q->next; } p=p->next; } } 4题 算法: