数据结构实验报告(2015级)及答案

合集下载

数据结构课程实验报告(回文篇)

数据结构课程实验报告(回文篇)

数据结构课程实验报告要求实验题目:回文判断算法班级通信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篇

数据结构实验报告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)统计表中学生个数:五、实验总结数据结构是一门专业技术基础课..它要求学会分析研究计算机加工的数据结构的特性;以便为应用涉及的数据选择适当的逻辑结构;存储结构及相应的算法;并初步掌握算法的时间分析和空间分析技术..不仅要考虑具体实现哪些功能;同时还要考虑如何布局;这次的实验题目是根据我们的课本学习进程出的;说实话;我并没有真正的读懂书本的知识;所以刚开始的时候;感到很棘手;于是又重新细读课本;这一方面又加强了对书本的理解;在这上面花费了一些心血;觉得它并不简单;是需要花大量时间来编写的....在本次实验中;在程序构思及设计方面有了较大的锻炼;能力得到了一定的提高..。

数据结构实验指导书(2015计科)

数据结构实验指导书(2015计科)

《数据结构课程设计》指导书•实验目的意义数据结构实验是《数据结构》课程必不可少的一个教学环节。

通过实验,学生不仅能够深化理解教学内容,进一步提高灵活运用数据结构和算法的能力,而且可以在问题分析、总体结构设计、算法设计、程序设计、上机操作及程序调试等基本技能方面受到综合训练。

实验着眼于原理与应用的结合点,使学生学会如何把书本上和课堂上学到的知识用于解决实际问题,从而培养软件工作所需要的动手能力。

•实验基本步骤及要求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个一元多项式的相加,并输出相加后的多项式。

数据结构综合实验报告最新(1)

①实验步骤:
②设计思路:
5.实验数据处理方法:
①数据输入
②结果输出
6.程序代码:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define MaxSize 100
typedef struct {
char data[MaxSize]; //定义可容纳MaxSize个字符的空间
3、对实验现象、数据及观察结果的分析与讨论:
(对实验结果进行分析,说明设计的特点和方向性。)
优化后,减少了很多时间
4、结论:
(包括:使用的设计方法是否正确,是否也可以用其他方法解决,问题考虑的是否完备?是否考虑的项目的功能,效率等多方面的需求,是否遵循了需求分析的内容)
利用匹配的错误信息,进行优化,方便快捷
printf("串t:");DispStr(t);
printf("简单匹配P算法:\n");
printf(
GetNext(t,next); //由模式串t求出next值
GetNextval(t,nextval); //由模式串t求出nextval值
else
v=-1; //返回不匹配标志
return v;
}
int KMPIndex1(SqString s,SqString t){ //改进的KMP算法
int nextval[MaxSize],next[MaxSize],i=0,j=0,v;
GetNextval(t,next);
GetNextval(t,nextval);
else
k=-1; //模式匹配不成功

数据结构课程实验报告

数据结构课程实验报告一、实验目的本次数据结构课程实验的主要目的是通过实践掌握常见数据结构的基本操作,包括线性结构、树形结构和图形结构。

同时,也要求学生能够熟练运用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中根结点的位置下标。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构实验报告(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<<"链表不存在"next) { if(x==p->next->data&&p->next->next) { q=p->next; p->next=q->next; free(q); return ; } else if(x==p->next->data&&!(p->next->next)) { 13

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题

算法:

相关文档
最新文档