数据结构上机报告(四)
数据结构上机实验报告
else insert(lc,i/2,la.list[i]); //偶数位次元素插入lc
}
printf("\n您输入的线性表元素为:\n\n");
print(la);
printf("线性表的奇数位次的元素为:\n\n");
print(lb);
printf("线性表的偶数位次的元素为:\n\n");
print(lc);
}
void initial(sqlist &v)
{printf(" ****本程序可以实现线性表奇偶位序的元素分别输出****\n\n\n");
int i,a;
printf("请输入一个偶数作为线性表的长度:\n\n");
void initlist(sqlist &);
void print(sqlist); //输出线性表
void main()
{printf(" *****************本程序可以实现线性表的复制******************\n");
sqlist la,lb; //声明线性表
initial(la);
【程序设计细想】:
建立三个线性表la,lb,lc,对线性表la进行输入,然后利用循环结构对la中奇数位序的元素对lb进行插入操作,对偶数位序的元素对lc进行插入操作,从而得到线性表lb和lc。
【程序代码】:
#include<stdio.h>
#include<malloc.h>
数据结构上机实验四
数据结构实验报告实验四实验目的:熟悉二叉树结点的结构和对二叉树的基本操作;掌握对二叉树每一种操作的具体实现;学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。
实验内容:1、定义二叉树的类型#define Maxsize 100#define Maxwidth 40typedef char elemtype;typedef struct node{ elemtype data;struct node *left,*right;}BTree;2、中序遍历的(非)递归算法void InOrderTraverse(BiTree T){InitStack(S);p=T;q=new BiTree;while(p||StackEmpty(S){If(p){Push(S,p);P=p->lchild;}Else{Pop(S,q);cout<<q->data;p=q->rchild;}}}3、求二叉树的深度int Depth(BiTree T){If(T==NULL)Return 0;Else{M=Depth(T->lchild);N= Depth(T->rchild);If(M>N)Return(M+1);elsereturn (N+1);}}4、哈夫曼树和哈夫曼编码:从终端输入若干个字符,统计字符出现的频率,将字符出现的频率作为节点的权值,建立哈夫曼树,然后对各字符进行哈夫曼编码,最后打印哈夫曼树和对应的哈夫曼编码。
#include<iostream.h>#include<iomanip.h>#include<stdlib.h>#include<string.h>#include<stdio.h>#define maxsize 100struct frequence{char a;int n;};typedef struct{unsigned int weight;unsigned int parent,lchild,rchild;}HTNode,*HuffmanTree;typedef char **HuffmanCode;void Frequent(){frequence ch[27];int i=0;for(;i<=26;i++){ch[i].n=0;}cout<<"请输入各个字符(输入#键结束输入):";char c;cin>>c;bool flag;while(c!='#'){i=1;flag=false;for(;i<=ch[0].n;i++){if(c==ch[i].a){flag=true;break;}}if(flag){ch[i].n++;}else{ch[0].n++;ch[ch[0].n].n++;ch[ch[0].n].a=c;}cin>>c;}for(int j=1;j<=ch[0].n;j++){cout<<ch[j].a<<" "<<ch[j].n<<endl;}}void Select(HuffmanTree HT,int i,int &s1,int &s2){int j,k=1;while(HT[k].parent!=0)k++;s1=k;for(j=1;j<=i;++j)if(HT[j].parent==0&&HT[j].weight<HT[s1].weight) s1=j;k=1;while((HT[k].parent!=0||k==s1))k++;s2=k;for(j=1;j<=i;++j)if(HT[j].parent==0&&HT[j].weight<HT[s2].weight&&j!=s1)s2=j;}void HuffmanCoding(HuffmanTree &HT,HuffmanCode&HC,int *w,int n){int m,i,s1,s2,start,c,f;HuffmanTree p;if(n<=1)return;m=2*n-1;HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));for(p=HT+1,i=1;i<=n;++i,++p,++w){p->weight=*w;cout<<"输出各个元素的权值"<<endl;cout<<"HT["<<i<<"].weight="<<p->weight<<" ";p->parent=0;p->lchild=0;p->rchild=0;}for(;i<=m;++i,++p){p->weight=0;p->parent=0;p->lchild=0;p->rchild=0;}cout<<endl<<endl<<"建立的哈夫曼树如下列次序:";for(i=n+1;i<=m;++i){Select(HT,i-1,s1,s2);HT[s1].parent=i;HT[s2].parent=i;HT[i].lchild=s1;HT[i].rchild=s2;HT[i].weight=HT[s1].weight+HT[s2].weight;cout<<endl<<"HT["<<s1<<"] and HT["<<s2<<"] create";cout<<" HT["<<i<<"], weight="<<HT[i].weight;}cout<<"\n哈弗曼树表"<<endl;cout<<" i weight parent lchild rchild"<<endl;for(p=HT+1,i=1;i<=m;i++,p++)cout<<setw(2)<<i<<setw(7)<<p->weight<<setw(6)<<p->parent<<setw(7)<<p->lchild<<s etw(8)<<p->rchild<<endl;HC=(HuffmanCode)malloc((n+1)*sizeof(char *));char *cd;cd=(char *)malloc(n*sizeof(char));cd[n-1]='\0';cout<<"哈夫曼编码如下:"<<endl;for(i=1;i<=n;++i){start=n-1;for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)if(HT[f].lchild==c)cd[--start]='0';elsecd[--start]='1';HC[i]=(char*)malloc((n-start)*sizeof(char));strcpy(HC[i],&cd[start]);printf("\nHT[%d] 节点的哈夫曼编码是: %s",i,HC[i]);}cout<<endl;free(cd);}void main(){HuffmanTree HT;HuffmanCode HC;Frequent();int m,n;int *w,W[maxsize];cout<<"请输入哈夫曼树的元素个数: ";cin>>m;for(n=0;n<m;++n){cout<<"请输入第"<<n+1<<"元素:";cin>>W[n];}w=W;HuffmanCoding(HT,HC,w,m);}程序结果:实验心得:通过此次上机实验操作,我对数据结构中树的概念有了更深的了解和进一步的认识。
数据结构上机报告4--图
数据结构上机4实现最短路径(单源、每对顶点)和最小生成树(Prim)算法。
2015、5、23一、需求分析构造一个图,实现单源最短路径和每对顶点之间的最短路径,并且实现最小生成树,将结果显示在屏幕上输出。
输入数据类型:构造图的数据是整型数字。
程序功能:输入或者从文件读取构造图的参数,进行构图,并计算出单源最短路径和每个顶点最短路径,实现最小生成树。
测试数据:正确输入:错误输入:二、概要设计图ADT的定义:class Graph{public:int numVertex;int numEdge;int *Mark;int *Indegree;Graph(int numVert){ //有参构造函数,动态创建标记和度的数组,初始化边数、度数和访问numVertex=numVert;numEdge=0;Indegree=new int[numVertex];Mark=new int[numVertex];for(int i=0;i<numVertex;i++){Mark[i]=UNVISITED;Indegree[i]=0;}}~Graph(){ //析构函数,删除数组delete[]Mark;delete[]Indegree;}int VerticesNum(){ //返回顶点个数return numVertex;}bool IsEdge(Edge ed){ //判断是否是图的边if(ed.weight>0&&ed.weight<INFINITY&&ed.to>=0)return true;return false;}virtual Edge FirstEdge(int oneVertex)=0; //返回与顶点oneVertex相关联的第一条边virtual Edge NextEdge(Edge preEdge)=0; //返回与边PreEdge有相同关联顶点oneVertex的下一条边int EdgesNum() //返回图的边数{return numEdge;}int FromVertex(Edge oneEdge) //返回边oneEdge的始点{return oneEdge.from;}int ToVertex(Edge oneEdge) //返回边oneEdge的终点{return oneEdge.to;}int Weight(Edge oneEdge) //返回边oneEdge的权{return oneEdge.weight;}virtual void setEdge(int from,int to,int weight)=0; //虚函数,设置边的起点终点以及权值,在子类实例化virtual void delEdge(int from,int to)=0;};三、详细设计1、实现ADT的数据类型:整型数字;2、算法描述:单源最短:初始集合S只包含源点s,即S={s}。
数据结构上机实践4
数据结构上机实践4实践目的在进一步理解队列的特性、存储结构、基本操作的基础上,使用队列解决现实问题;掌握树的结构的非线性特点、递归性特点和动态数据结构等特点;掌握二叉树的存储结构、各种遍历算法以及基于遍历算法的其他操作的实现。
预备知识1.存储结构typedef struct btnode{ELEMTP data; /* 数据域*/struct btnode *lchild, *rchild; /* 左、右孩子指针域*/}BTNode;2.基本算法(1)建立二叉链表算法#define MAXNUM 20 /*最大结点数*/BtNode *p[MAXUNM+1]; /* 辅助向量*/BtNode * Creat_Bt( void ){/* 建立二叉链表 */printf("\n enter i,ch:"); scanf("%d%c",&i,&ch);while( i!=0 && ch!='#'){s=(BTNode *)malloc(sizsof(BTNode));s->data=ch; s->lchild=s->rchild=NULL;p[i]=s;if(i==1) t=s;else {j=i/2;if(i%2==0) p[j]->lchild=s;else p[j]->rchild=s;}printf("\n enter i,ch:"); scanf("%d,%c",&i,&ch);}return t;} /* Creat_Bt */(2)遍历算法void Preorder(BTNode *bt ){/* 先根遍历以bt为根的二叉树 */if (bt){printf(bt->data); /*访问根结点*/Preorder(bt->lchild); /*先根遍历左子树*/Preorder(bt->rchild); /*先根遍历右子树*/}}/* Preorder */void Inorder(BTNode *bt ){/* 中序遍历算法以bt为根的二叉树 */if (bt){Inorder(bt->lchild); /*中根遍历左子树*/printf(bt->data); /* 访问根结点 */Inorder(bt->rchild); /* 中根遍历右子树*/}}/*Inorder*/void Postorder(BTNode *bt ){/* 后序遍历二叉树bt的递归算法 */if (bt){Postorder(bt->lchild);Postorder(bt->rchild);printf(bt->data);}}/*Postorder*/应用范例--统计二叉树中叶子结点个数和求二叉树的树深 #include "stdio.h"#include "stdlib.h"typedef struct BTnode{ char data;struct BTnode *lchild,*rchild;}BTNode;#define NodeLen sizeof(BTNode)BTNode *Creat_Bt(void);void Preorder(BTNode *bt);void Inorder(BTNode *bt);void Leafs_Deep(BTNode *bt,int j);int count,deep;main(){ BTNode *t; char s[10];for (;;){printf("1--------建立二叉树 2--------先根遍历二叉树\n"); printf("3--------求叶子数和树深 4--------退出\n");gets(s);switch(*s){case '1' : t=Creat_Bt(); break;case '2': Preorder(t); printf("\n");break;case '3': count=deep=0;Leafs_Deep(t,0); printf("\n叶子结点数:%d\n",count);printf("树深:%d\n",deep); break;case '4': exit(0);}}}/* main *//* 生成二叉树*/#define MAXNUM 20 /*对二叉树结点按满二叉树编号时结点的最大编号*/BTNode *Creat_Bt(void ){int i=1,j;char ch;BTNode *p[MAXNUM+1],*t,*s;t=NULL;printf("\n enter i,ch:"); scanf("%d,%c",&i,&ch);while( i!=0 && ch!='#'){s=(BTNode *)malloc(NodeLen);s->data=ch; s->lchild=s->rchild=NULL;p[i]=s;if(i==1) t=s;else {j=i/2;if(i%2==0) p[j]->lchild=s;else p[j]->rchild=s;}printf("\n enter i,ch:"); scanf("%d,%c",&i,&ch);}return t;} /* Creat_Bt */void Preorder(BTNode *bt ){if (bt){printf("%5c",bt->data);Preorder(bt->lchild);Preorder(bt->rchild);}}/* preorder */void Leafs_Deep(BTNode *bt,int j){if (bt){if(bt->lchild==NULL && bt->rchild==NULL){ /*输出叶子结点并计数*/printf(“%c”,bt->data); count++;}j++;if(deep<j) deep=j;Leafs_Deep(bt->lchild,j);Leafs_Deep(bt->rchild,j);}}/*Leafs_Deep */实践内容编写一个C语言程序,对二叉树实现以下操作:(1)按先根、中根和后根次序遍历二叉树;(2)按二叉树的层次输出各结点;(3)利用遍历算法,将二叉树中所有结点的左右子树交换。
《数据结构》课程设计上机实习报告课设报告模板
《数据结构》课程设计上机实习报告课设题目系部班级学生姓名学号序号指导教师时间信息系 计算机 61101xxxx 2013.12.23~2013.1.4自己的题目一、设计目的1.进一步熟悉 VC++开发环境,熟悉用 C 语言完成一个应用程序的设计过程, 掌握有关编辑、调试和整合程序的方法和技巧。
2.通过此设计,了解《数据结构》课程中图的逻辑结构和物理结构;掌握有 关图的相关实际应用以及对应算法的原理与具体实现;体会数据结构在解决现实 问题中的作用和重要性。
3.通过此设计,学会分析算法时间复杂度和空间复杂度的方法,针对求解相 同问题的不同算法,掌握对其性能的比较策略。
可结合实际进行补充二、设计内容1. 2. 3. 请将自己的需求描述清楚。
先对本设计的问题进行描述(做这个设计能实现什么 功能、达到什么目的),再分条描述基本要求,需要给出总体框图。
可参考下面内容。
设计内容 1.设计题目:简易城市交通咨询系统的设计 2.问题描述: 出于不同目的的旅客对交通工具有不同的要求,例如,因出公差的旅客希望在旅途中的时间尽可能短,出门旅游的旅客则期望旅费尽可能省,而老年旅客则 要求中转次数最少。
要求编制一个简易城市交通咨询系统,为旅客提供两种或者 三种最优决策的交通咨询。
按图 1 所示城市交通网(图中边上的权值表示城市之 间的距离),实现系统各个功能。
第 1 页(共 6 页)图 1 城市交通信息网3. 基本要求 用图的邻接矩阵或邻接表的表示方法存储图 1 所示的城市交通信息网。
在主 函数中设计功能菜单,利用菜单调用各个函数,分别完成图 2 所示各功能:图 2 系统功能模块图1) 设计在相应存储结构(邻接矩阵或邻接表)下的图的类型声明。
2)根据图 1 所示交通网,创建交通信息。
A、新建交通信息:通过用户输入, 新建城市交通信息,并能够将所创建的交通网的顶点和边的信息存储于文件中; B、读取交通信息:从指定位置文件中读取顶点和边的信息,生成交通信息网。
数据结构上机实验报告
数据结构上机实验报告学院:电子工程学院专业:信息对抗技术姓名:学号:教师:饶鲜日期:目录实验一线性表 ........................................................................................................ - 4 -一、实验目的.................................................................................................... - 4 -二、实验代码.................................................................................................... - 4 -三、实验结果.................................................................................................. - 14 -四、个人思路.................................................................................................. - 15 - 实验二栈和队列 .................................................................................................. - 15 -一、实验目的.................................................................................................. - 15 -二、实验代码.................................................................................................. - 16 -三、实验结果.................................................................................................. - 24 -四、个人思路.................................................................................................. - 25 - 实验三数组 .......................................................................................................... - 26 -一、实验目的.................................................................................................. - 26 -二、实验代码.................................................................................................. - 26 -三、实验结果.................................................................................................. - 28 -四、个人思路.................................................................................................. - 28 - 实验四树 .............................................................................................................. - 29 -一、实验目的.................................................................................................. - 29 -二、实验代码.................................................................................................. - 29 -三、实验结果.................................................................................................. - 39 -四、个人思路.................................................................................................. - 39 -实验一线性表一、实验目的1.熟悉线性表的顺序和链式存储结构2.掌握线性表的基本运算3.能够利用线性表的基本运算完成线性表应用的运算二、实验代码1.设有一个线性表E={e1, e2, … , e n-1, e n},设计一个算法,将线性表逆置,即使元素排列次序颠倒过来,成为逆线性表E’={ e n, e n-1 , … , e2 , e1 },要求逆线性表占用原线性表空间,并且用顺序表和单链表两种方法表示,分别用两个程序来完成。
数据结构上机实验报告
数据结构上机实验报告数据结构上机实验报告1. 实验目的数据结构是计算机科学中非常重要的一门课程,通过本次上机实验,旨在帮助学生巩固和应用所学的数据结构知识,培养学生分析和解决实际问题的能力。
2. 实验背景本次实验涉及到两个常用的数据结构:栈和队列。
栈是一种后进先出(Last In First Out,LIFO)的数据结构,而队列是一种先进先出(First In First Out,FIFO)的数据结构。
通过实验,我们将学习如何使用这两种数据结构来解决实际问题。
3. 实验内容本次实验分为两个部分:栈的应用和队列的应用。
3.1 栈的应用在栈的应用部分,我们将实现一个简单的括号匹配算法。
该算法可以判断一个字符串中的括号是否匹配。
具体实现步骤如下:3.1.1 创建一个栈来存储括号字符;3.1.2 遍历字符串中的每个字符;3.1.3 如果遇到左括号,则将其入栈;3.1.4 如果遇到右括号,则判断栈顶元素是否是对应的左括号;3.1.5 如果栈为空或栈顶元素不是对应的左括号,则括号不匹配;3.1.6 如果栈顶元素是对应的左括号,则将其出栈;3.1.7 遍历完字符串后,如果栈为空,则括号匹配,否则括号不匹配。
通过实现这个算法,我们可以学习到如何使用栈来解决实际问题,并且理解栈的后进先出的特性。
3.2 队列的应用在队列的应用部分,我们将实现一个简单的任务调度算法。
该算法可以模拟多个任务按照一定的优先级进行调度的过程。
具体实现步骤如下:3.2.1 创建一个队列来存储任务;3.2.2 每个任务包含两个属性:任务名称和优先级;3.2.3 向队列中添加任务,并按照优先级进行排序;3.2.4 从队列中取出优先级最高的任务,并执行;3.2.5 执行完任务后,继续从队列中取出下一个优先级最高的任务,并执行,直到队列为空。
通过实现这个算法,我们可以学习到如何使用队列来实现任务调度,并且理解队列的先进先出的特性。
4. 实验结果与分析通过实验,我们成功实现了括号匹配算法和任务调度算法,并得到了正确的结果。
数据结构上机实验报告
数据结构实验报告课程数据结构 _ 院系专业班级实验地点姓名学号实验时间指导老师数据结构上机实验报告1一﹑实验名称:实验一——链表二﹑实验目的:1.了解线性表的逻辑结构特性;2.熟悉链表的基本运算在顺序存储结构上的实现,熟练掌握链式存储结构的描述方法;3.掌握链表的基本操作(建表、插入、删除等)4. 掌握循环链表的概念,加深对链表的本质的理解。
5.掌握运用上机调试链表的基本方法三﹑实验内容:(1)创建一个链表(2)在链表中插入元素(3)在链表中删除一个元素(4)销毁链表四﹑实验步骤与程序#include <iostream.h>#include <malloc.h>typedef struct LNode{int data;struct LNode *next;}Lnode, *LinkList;//假设下面的链表均为带头结点。
void CreatLinkList(LinkList &L,int j){//建立一个链表L,数据为整数,数据由键盘随机输入。
LinkList p,q;L=(LinkList )malloc(sizeof(Lnode));L->next=NULL;q=L;cout<<"请输入一个链表:"<<endl;for(int i=0;i<j;i++){ p=(LinkList)malloc(sizeof(Lnode));cin>>p->data;p->next=q->next;q->next=p;q=p;}}int PrintLinkList(LinkList &L){//输出链表L的数据元素LinkList p;p=L->next;if(L->next==NULL){cout<<"链表没有元素!"<<endl;return 0;}cout<<"链表的数据元素为:";while(p){cout<<p->data<<" ";p=p->next;}cout<<endl;return 1;}void LinkListLengh(LinkList &L){//计算链表L的数据元素个数。
数据结构上机实验报告
实验名称:数据结构实验实验时间:2021年X月X日实验地点:计算机实验室实验目的:1. 理解并掌握基本数据结构(线性表、栈、队列、链表、树、图)的概念和操作。
2. 能够运用C语言实现基本数据结构的各种操作。
3. 培养编程能力和问题解决能力。
实验内容:1. 线性表2. 栈3. 队列4. 链表5. 树6. 图实验环境:1. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 2019实验步骤:一、线性表1. 实现线性表的创建、插入、删除、查找和遍历等基本操作。
2. 编写代码,实现以下功能:- 创建一个线性表,包含10个元素。
- 在第3个位置插入一个新元素。
- 删除第5个位置的元素。
- 查找线性表中的第7个元素。
- 遍历线性表,并打印所有元素。
二、栈1. 实现栈的创建、入栈、出栈、判空和求栈顶元素等基本操作。
2. 编写代码,实现以下功能:- 创建一个栈。
- 向栈中依次入栈元素1、2、3、4、5。
- 判断栈是否为空。
- 求栈顶元素。
- 出栈元素,并打印出栈的元素。
三、队列1. 实现队列的创建、入队、出队、判空和求队头元素等基本操作。
2. 编写代码,实现以下功能:- 创建一个队列。
- 向队列中依次入队元素1、2、3、4、5。
- 判断队列是否为空。
- 求队头元素。
- 出队元素,并打印出队的元素。
四、链表1. 实现单链表、双向链表和循环链表的创建、插入、删除、查找和遍历等基本操作。
2. 编写代码,实现以下功能:- 创建一个单链表,包含元素1、2、3、4、5。
- 在第2个位置插入一个新元素。
- 删除第3个位置的元素。
- 查找链表中的第4个元素。
- 遍历链表,并打印所有元素。
五、树1. 实现二叉树的创建、插入、删除、查找和遍历等基本操作。
2. 编写代码,实现以下功能:- 创建一个二叉树,包含元素1、2、3、4、5。
- 在第2个位置插入一个新元素。
- 删除第3个位置的元素。
数据结构上机实验报告
数据结构上机实验报告一、实验目的本次数据结构上机实验的主要目的是通过实际编程操作,深入理解和掌握常见的数据结构及其基本操作,提高解决实际问题的能力和编程技能。
具体目标包括:1、熟练掌握线性表、栈、队列、树、图等数据结构的基本概念和存储方式。
2、学会运用数据结构的相关算法进行数据的插入、删除、查找、排序等操作。
3、培养分析问题、设计算法、编写代码和调试程序的综合能力。
4、增强对数据结构在实际应用中的认识,提高解决复杂问题的思维能力。
二、实验环境1、操作系统:Windows 102、编程环境:Visual Studio 20193、编程语言:C++三、实验内容本次实验共包括以下几个部分:1、线性表的操作实现顺序表和链表的创建、插入、删除、查找和遍历操作。
比较顺序表和链表在不同操作下的性能差异。
2、栈和队列的应用利用栈实现表达式求值。
用队列模拟银行排队系统。
3、树的遍历实现二叉树的先序、中序和后序遍历算法,并输出遍历结果。
构建哈夫曼树,并进行编码和解码操作。
4、图的基本操作用邻接矩阵和邻接表存储图,并实现图的深度优先搜索和广度优先搜索算法。
四、实验步骤及结果1、线性表的操作顺序表的实现:```cppinclude <iostream>using namespace std;define MAXSIZE 100 //顺序表的最大长度class SeqList {private:int dataMAXSIZE; //存储顺序表元素的数组int length; //顺序表的当前长度public:SeqList(){//构造函数,初始化顺序表length = 0;}//插入元素bool insert(int pos, int element) {if (pos < 0 || pos > length || length == MAXSIZE) {return false;}for (int i = length; i > pos; i) {datai = datai 1;}datapos = element;length++;return true;}//删除元素bool remove(int pos) {if (pos < 0 || pos >= length) {return false;}for (int i = pos; i < length 1; i++){datai = datai + 1;}length;return true;}//查找元素int search(int element) {for (int i = 0; i < length; i++){if (datai == element) {return i;}}return -1;}//遍历输出顺序表void traverse(){for (int i = 0; i < length; i++){cout << datai <<"";}cout << endl;}};int main(){SeqList list;listinsert(0, 10);listinsert(1, 20);listinsert(2, 30);listtraverse();listremove(1);listtraverse();int position = listsearch(30);if (position!=-1) {cout <<"元素 30 在位置"<< position << endl;} else {cout <<"未找到元素 30" << endl;}return 0;}```链表的实现:```cppinclude <iostream>using namespace std;class Node {public:int data;Node next;Node(int element) {data = element;next = NULL;}};class LinkedList {private:Node head;public:LinkedList(){head = NULL;}//插入元素void insert(int element) {Node newNode = new Node(element);if (head == NULL) {head = newNode;} else {Node current = head;while (current>next!= NULL) {current = current>next;}current>next = newNode;}}//删除元素void remove(int element) {if (head == NULL) {return;}if (head>data == element) {Node temp = head;head = head>next;delete temp;return;}Node current = head;Node prev = NULL;while (current!= NULL && current>data!= element) {prev = current;current = current>next;}if (current!= NULL) {prev>next = current>next;delete current;}}//查找元素bool search(int element) {Node current = head;while (current!= NULL) {if (current>data == element) {return true;}current = current>next;}return false;}//遍历输出链表void traverse(){Node current = head;while (current!= NULL) {cout << current>data <<"";current = current>next;}cout << endl;}};int main(){LinkedList list;listinsert(10);listinsert(20);listinsert(30);listtraverse();listremove(20);listtraverse();if (listsearch(30)){cout <<"找到元素 30" << endl;} else {cout <<"未找到元素 30" << endl;}return 0;}```性能比较:在插入和删除操作中,顺序表在表头或中间位置操作时需要移动大量元素,时间复杂度较高;而链表只需要修改指针,时间复杂度较低。
数据结构上机实验报告(看
数据结构上机实验报告(看病问题)数据结构上机实验报告题目:一个病人看病模拟程序学生姓名:周瑞楠学生学号:3013216085学院名称:计算机学院专业:计算机科学与技术时间:2014.10.28目录第一章,需求分析 (3)1.1 原题描述 (3)1.2 详细问题的解决方案 (3)1.2.1 解决方案要求 (3)1.2.2 各个环节功能要求 (4)第二章,概要设计 (5)2.1 抽象数据类型 (5)2.2 主要算法描述 (5)2.3 算法分析 (6)第三章,详细设计 (7)3.1 程序代码 (7)第四章,调试分析 (9)第五章,测试分析 (10)第六章,未来展望与思考 (11)第一章需求分析1.1 原题描述请按照如下要求编写一个病人看病模拟程序编写一个程序,反映病人到医院看病,排队看医生的情况。
在病人排队过程中,主要重复两件事:(1)病人到达诊室,将病历本交给护士,拍到等待队列中候诊。
(2)护士从等待队列中取出下一位病人的病例,该病人进入诊室就诊。
1.2详细问题的解决方案1.2.1问题分析要求模拟病人等待就诊这一过程,程序采用菜单方式,其选项及功能说明如下:(1)排队————输入排队病人的病历号,加入到病人排队队列中。
(2)就诊————病人排队队列中最前面的病人就诊,并将其从队列中删除。
(3)查看排队————从队首到队尾列出所有的排队病人的病历号。
(4)不再排队,余下依次就诊————从队首到队尾列出所有的排队病人的病历号,并退出运行。
(5)下班————退出运行。
1.2.2 解决方案要求测试数据及输出如下:1:排队 2:就诊 3:查看排队 4:不再排队,余下依次就诊 5:下班请选择:1 >>输入病历号:11:排队 2:就诊 3:查看排队 4:不再排队,余下依次就诊 5:下班请选择:1 >>输入病历号:21:排队 2:就诊 3:查看排队 4:不再排队,余下依次就诊 5:下班请选择:1 >>输入病历号:31:排队 2:就诊 3:查看排队 4:不再排队,余下依次就诊 5:下班请选择:2 >>病人1就诊1:排队 2:就诊 3:查看排队 4:不再排队,余下依次就诊 5:下班请选择:3 >>排队病人:2 31:排队 2:就诊 3:查看排队 4:不再排队,余下依次就诊 5:下班请选择:1>>输入病历号:41:排队 2:就诊 3:查看排队 4:不再排队,余下依次就诊 5:下班请选择:4>>病人按以下顺序就诊:2 3 41.2.3 各个环节功能要求表1-2.1 环节功能函数功能注意条件及限制规则initQueue()建立空队列头指针尾指针建立后判断是否为NULL EnQueue() 在队尾插入元素判断节点储存分配是否失败DeQueue () 删除对头元素并返回其值释放被删除的节点删除队尾元素注意改变指针位置ShowQueu输出队列元素e()补充正文:主函数里用switch来表明各种情况下应当调用的函数第二章概要设计2.1 抽象数据类型ADT deletenode{数据对象:D={ai|ai∈ElemSet,i=1,2,…,m, m≥0TermSet 中的每个元素包含一个整数}数据关系:R1={<ai ,ai-1>| ai,ai-1∈D,且ai中的整数有序,i=2,3…,n}约定其中a1端为队列投,an 端为队列尾基本操作:InitQueue(&Q);操作结果:建立空队列。
数据结构上机实验报告
{ while (i<S.size() && j<P.size())//当找到或者找到头时循环结束 { if (S[i] == P[j]) { i++; j++;} else{ i = i - j + 1; j = 0; }//失配时从下一位继续找 } if (j == P.size()){//找到就输出这一行 cout << "第" << linenumb << "行" << S << endl; }
}
3. 主程序的伪码 :
void main(){ cout << "请输入文件名" << endl; cin >> filename;
ifstream infile(filename.c_str()); cout << "请输入待查找的字符串" << endl; cin >> P; while (getline(infile, S))//读完所有行结束 {
linenumb++; Find(S, P, linenumb); } infile.close(); } int Find(string S, string P, int linenumb) { int i = 0, j = 0; while (i<S.size() && j<P.size())//当找到或者找到头时循环结束 { if (S[i] == P[j]) {
武汉纺织大学《数据结构》实验报告4
武汉纺织大学《数据结构》实验报告班级:级管工类专业班姓名:序号: 1实验时间: 2014 年 5 月 30 日指导教师:实验四:查找基本操作与应用一、实验目的:1、掌握顺序查找、折半查找、哈希查找的基本方法和操作过程2、掌握查找效率的分析方法二、实验内容:1、编写程序,实现顺序查找操作,可参考书本P260示例程序。
实验步骤:①、在Java语言编辑环境中新建程序,建立一个顺序表(表长10),依次输入10个数据元素(对元素存放的先后顺序没有要求),并按照存储顺序输出所有元素;②、输入带查找关键字,在顺序表中进行顺序查找;③、输出查找结果。
2、编写程序,实现有序表折半查找操作,可参考书本P263示例程序。
实验步骤:①、在Java语言编辑环境中新建程序,建立一个顺序表(表长10),依次输入10个数据元素(要求所有元素按照递增顺序排列),并按照存储顺序输出所有元素;②、输入带查找关键字,在有序表中进行折半查找;③、输出查找结果。
3、编写程序,实现哈希表查找操作。
实验步骤:①、在Java语言编辑环境中新建程序,建立一个顺序表(表长12),依次输入10个数据元素,并按照存储顺序输出所有元素;②、输入带查找关键字,在哈希表中进行查找;③、输出查找结果。
已知:哈希函数为H(key)=key MOD 11,采用开放地址法、线性探测再散列解决冲突,输入元素为{ 55,19,31,23,68,20,27,9,10,79}。
三、操作步骤:Test1代码:T1.Javapackage First;import java.util.Scanner;public class T1 {public static void main(String[] args) {int i;int n;Scanner sc=new Scanner(System.in);SeqList<Integer> sl=new SeqList<Integer>(10);sl.insert(0, 3);sl.insert(6, 1);sl.insert(6, 0);sl.insert(8, 6);sl.insert(7, 2);sl.insert(2,9);sl.insert(4, 1);sl.insert(5, 4);sl.insert(6,8);sl.insert(1, 7);System.out.print("顺序表中各元素:");System.out.println(sl.toString());System.out.println("<查找元素>");System.out.print("输入元素:");i=sc.nextInt();n=sl.indexOf(i);if(n!=-1)System.out.println("元素" +i+"位于第"+n+"位");}}LList.javapackage First;public interface LList<T> {boolean isEmpty();int length();T get(int i);void set(int i, T x);void insert(int i, T x);T remove(int i);void removeAll();}SeqList .javapackage First;public class SeqList<T> implements LList<T> { private Object[] element;private int len;public SeqList(int size) {this.element = new Object[size];this.len = 0;}public SeqList() {this(64);}public boolean isEmpty() {return this.len == 0;}public int length() {return this.len;}public T get(int i) {if (i >= 0 && i < this.len)return (T) this.element[i];return null;}public void set(int i, T x) {if (x == null)return;if (i >= 0 && i < this.len)this.element[i] = x;elsethrow new IndexOutOfBoundsException(i + "");}public String toString() {String str = "(";if (this.len > 0)str += this.element[0].toString();for (int i = 1; i < this.len; i++)str += "," + this.element[i].toString();return str + ")";}public void insert(int i, T x){if(x==null)return;if(this.len==element.length){Object[]temp = this.element;this.element = new Object[temp.length*2];for(int j=0;j<temp.length;j++)this.element[j]=temp[j];}if(i<0)i=0;if(i>this.len)i=this.len;for(int j=this.len-1;j>=i;j--)this.element[j+1]=this.element[j];this.element[i]=x;this.len++;}public void append(T x){ insert(this.len,x); } public T remove(int i){if(this.len==0||i<0||i>=this.len)return null;T old = (T)this.element[i];for(int j=i;j<this.len-1;j++)this.element[j]=this.element[j+1];this.element[this.len-1]=null;this.len--;return old;}public void removeAll(){ this.len=0; } public int indexOf(T key){if(key!=null)for(int i=0;i<this.len;i++)if(this.element[i].equals(key))return i;return -1;}public T search(T key){int find=this.indexOf(key);return find==-1?null:(T)this.element[find]; }public boolean contain(T key){return this.indexOf(key)>=0;}}运行结果:Test2代码:T2.javapackage Second;public class T2 {public static void main(String[] args) {int a[]={5,11,23,15,17,38,90,121,132,164}; int search=38;int lower=0;int temp=a.length-1 ;int index=-1;while(lower<=temp){index = (lower+temp)/2;int currentValue=a[index];if(currentValue==search){break;}else if(currentValue<search){lower=index+1;}else{temp = index-1;}}for(int i = 0;i < 10; i++){System.out.print(a[i]);System.out.println(" ");}if(lower<=temp){System.out.println("查找元数"+search);System.out.println("位于数组中第"+(index+1)+"位");}else{System.out.println("里面没有这个元素"); }}}运行结果:Test3代码:T3.javapackage Three;import java.util.Scanner;public class T3 {static HashTable T=null;public static void createHashtable() throws Exception { T=new HashTable(20);Scanner sc=new Scanner(System.in);System.out.print("请输入待查找的关键字的个数:");int n=sc.nextInt();System.out.print("请输入查找表中的关键字序列:");for (int i = 0; i < n; i++) {T.hashInsert(sc.nextInt());}}public static void main(String[]args)throws Exception{System.out.println("<创建哈希表>");createHashtable();System.out.println("创建的哈希表为:");T.Hashdisplay();System.out.print("输入待查找的关键字:");Scanner sc=new Scanner(System.in);int key=sc.nextInt();RecordNode p=T.hashSearch(key);if ((p.getKey()).compareTo(key)==0)System.out.println(" 查找成功!");elseSystem.out.println(" 查找失败!");}}KeyType.javapackage Three;public class KeyType implements Comparable<KeyType> {private int key;public KeyType() {}public KeyType(int key) {this.key = key;}public int getKey() {return key;}public void setKey(int key) {this.key = key;}public String toString() {return key + "";}public int compareTo(KeyType another) {int thisVal = this.key;int anotherVal = another.key;return (thisVal < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1));}}class HashTable {private RecordNode[] table;public HashTable(int size) {this.table = new RecordNode[size];for (int i = 0; i < table.length; i++) {table[i] = new RecordNode(0);}}public int hash(int key) {return key % 11;}public RecordNode hashSearch(int key) {int i = hash(key);int j = 0;while ((table[i].getKey().compareTo(0) != 0)&& (table[i].getKey().compareTo(key) != 0)&& (j < table.length)) {j++;i = (i + j) % 11;}if (j >= table.length) {System.out.println("哈希表已满");return null;} elsereturn table[i];}public void hashInsert(int key) {RecordNode p = hashSearch(key);if (p.getKey().compareTo(0) == 0)p.setKey(key);elseSystem.out.println(" 此关键字记录已存在或哈希表已满");}void Hashdisplay() {for (int i = 0; i < table.length; i++)System.out.print(table[i].getKey().toString() + " ");System.out.println();}}RecordNode.javapackage Three;public class RecordNode {private Comparable key;private Object element;public Object getElement() {return element;}public void setElement(Object element) {this.element = element;}public Comparable getKey() {return key;}public void setKey(Comparable key) {this.key = key;}public RecordNode() {this.key = null;}public RecordNode(Comparable key) {this.key = key;}}运行结果:四、实验收获和建议这次实验我掌握了顺序查找、折半查找、哈希查找的基本方法和操作过程,掌握查找效率的分析方法,对查找方法有了更进一步的认识。
数据结构上机实验四
数据结构上机实验四
实验内容:广义表的基本操作
实验要求:
1) 广义表的创建与显示要作为函数被调用.
2) 把自己使用的广义表结构明确的表达出来.
3) 基本上实现每个实验题目的要求.
分组要求:可单独完成,也可两人一组。
实验目的:
1)熟悉C/C++基本编程,培养动手能力.
2)通过实验,加深对广义表的理解.
评分标准:
1) 只完成第一和第二题,根据情况得3,4,5分;
2)在1)基础上,选做三)中题目,根据情况得5,6,7分。
题目:
一)创建一个广义表+判空+显示+长度
(1)由广义表的书写形式,从键盘输入一个字符串建立广义表a;
(2)对建立的广义表a进行判空;
(3)对(1)中生成的广义表a进行显示;
(4)求(1)中生成的广义表a的长度并显示;
二) 广义表的复制+插入+深度+删除+销毁
(1)将(一)中生成的广义表复制到一个新的广义表b并显示;
(2)在广义表b中插入元素e作为其的第一元素并显示;
(3)求广义表b的深度并显示;
(4)删除广义表b的第一元素,将此元素返回并显示;
(5)销毁广义表b
三)应用题
(1)编制一个算法,从头尾链表结构生成对应的字符串。
(2)编制一个算法,打印广义表中指定层次的原子。
(3)编制一个算法,按层序打印广义表的原子。
数据结构上机实验报告
数据结构上机实验报告1. 实验目的本次实验旨在通过编写程序,掌握和理解常见的数据结构及其应用。
2. 实验环境与工具- 操作系统:Windows 10- 开发语言:C++- 集成开发环境(IDE):Visual Studio Code3. 实验内容及步骤3.1 线性表操作演示程序设计与分析步骤:a) 设计一个线性表类,并包含以下基本功能:i) 初始化线性表;ii) 插入元素到指定位置;iii) 删除指定位置的元素;iv) 获取指定位置处的元素值。
b)使用该线性表类进行一系列测试,验证各个功能是否正常运行。
记录并分析每个函数调用所消耗时间以评估算法效率。
3.2 栈和队列综合应用设计与模拟步骤:a)根据给出问题需求,在已有栈、队列等相关代码基础上完成如下任务:i)利用两个堆栈来模拟浏览器前进后退功能;ii)使用循环链式存储结构表示双向链队, 并对其进行初始化、入队、出队等操作。
b). 运行以上代码片段,并输出相应结果。
同时分析算法的时间复杂度和空间复杂度。
4. 实验结果与讨论a) 线性表操作演示程序设计与分析实验结果:- 初始化线性表所需时间为X秒;- 插入元素到指定位置平均耗时Y毫秒;- 删除指定位置的元素平均耗时Z毫秒。
b)栈和队列综合应用设计与模拟实验结果:i) 浏览器前进后退功能测试:共浏览N个网页,前进M 次、后退K次。
运行总体消耗时间T1;ii) 双向链队初始化、入队、出对等操作测试: 共进行P 组数据处理, 运行总体消耗时间T2.5. 结论通过本次上机实验,我们掌握了线性表及其相关基本操作,并且成功完成了栈和队列在特定场景下的应用。
同时,在代码编写过程中也深刻理解并评估了各种算法效率。
6. 致谢感谢老师们给予我宝贵意见以及同学们之间相互交流合作提供支持。
7. 附件8. 法律名词及注释在此处添加涉及到的法律名词或术语,并提供简要注释。
数据结构第4次实验报告
中国矿业大学计算机学院实验报告课程名称数据结构实验名称搜索班级计科11-3 姓名冯剑飞学号08113405 仪器组号_21-22机房_____ 实验日期2012年12月28号实验报告要求:1.实验目的 2.实验内容 3.实验步骤4.运行结果5.流程图6.实验体会一、实验目的1 熟练掌握顺序搜索、折半搜索和索引搜索等基本搜索算法,熟悉这些算法适合在何种存储结构下实现2 熟练掌握二叉排序树的特性、建立方法以及动态搜索算法3 熟练掌握散列表的特点及构造方法二、实验要求1 实验之前认真准备,编写好源程序。
2 实验中认真调试程序,对运行结果进行分析,注意程序的正确性和健壮性的验证。
3 不断积累程序的调试方法。
三、实验步骤1、阅读教材相关章节,了解程序架构。
2、根据伪代码编写实现可执行程序。
3、调试程序,提高程序健壮性。
4、输入多组数据,测试程序,寻找漏洞。
5、在关键部位写下注释,提高程序可读性。
四、实验内容基本题1、实现基于有序顺序表的折半搜索。
#include <iostream>using namespace std;struct nodeList{int number;char name[15];int CETgrade;};int main (){int search(nodeList nodeList[], int n, int v);nodeList nodeList[10]={{0,"zhangwei",545},\{1,"zengxiaoxian",456},\{2,"guangu",525},\{3,"lvziqiao",421},\{4,"zhangfei",343},\{5,"liubei",555},\{6,"caocao",546},\{7,"lvbu",400},\{8,"sunquan",567},\{9,"zhugeliang",654}};cout<<"-----编号---"<<"姓名--------"<<"成绩------"<<endl;for(int i=0;i<10;i++){cout<<" "<<nodeList[i].number<<" "<<nodeList[i].name<<" "<<nodeList[i].CETgrade<<endl;}cout<<"请输入要查找的编号(0到9)"<<endl;int v;cin>>v;int find=search(nodeList,10,v);cout<<"该编号学生的情况为"<<nodeList[find].number<<" "<<nodeList[find].name<<" "<<nodeList[find].CETgrade<<endl;return 0;}int search(nodeList nodeList[], int n, int v){int left, right, middle;left = 0, right = n - 1;while (left <= right){middle = (left + right) / 2;if (nodeList[middle].number > v){right = middle - 1;}else if (nodeList[middle].number < v){left = middle + 1;}else{return middle;}}return -1;}2、设单链表的结点是按关键字的值从小到大排列的,试写出对此表的搜索程序并调试。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构上机报告(四)静态数组下标链接
小组成员
一.问题提出:
元素用数组来存放,那么一维顺序就可以用下表来连接。
通过此方法来完成获取元素的操作。
二.问题分析及算法设计:
我们想通过数组下标链接得到元素,那么我们需要建立下标与元素的一一对应关系,从而在输入下标时才会返回相应的元素。
三.程序设计:
(1)建立顺序表的数组定义Data、List;
(2)定义获取函数Get()函数,从而通过下标链接得到相应的元素。
(3)建立主函数main函数,输入数组的相关数据信息,并调用Get函数,实行操作。
四.用户手册:
(1)执行程序;
(2)根据提示,输入你想查看元素的下标值;
(3)按enter键即可出现元素的信息;
(4)关闭窗口,结束程序。
(5)运行结果示意图:
五.调试报告:
(1)写while循环体时,忘记写j++,导致无法运行得到正常结果。
检查后得到改正。
(2)开始忽略了head_free=4的编写,程序运行出错,之后得到改正。
六.附录:程序代码
#include<iostream>
using namespace std;
const int MAX_N = 10;
struct Data
{
int ID;
char Name[20];
float score;
int next;
};
struct List
{
Data L[MAX_N];
int n;
};
void Get(List &M,int a)
{
int i;
cout << "请输入要获取元素的位置" << endl;
cin >> i;
int c = a,j=1;
while (c!=-1&&j!=i)
{
c = M.L[c].next;
j++;
}
if (c == -1)
cout << "此记录为空" << endl;
else
{
cout << "ID:" <<M.L[c].ID<<endl;
cout << "Name:" << M.L[c].Name << endl;
cout << "Score:" << M.L[c].score << endl;
}
}
void main()
{
List M;
M.L[0] = { 001, "张三", 69, 3 };
M.L[1] = { NULL,"",NULL,5 };
M.L[2] = { 005, "朱七", 94, -1 };
M.L[3] = { 002, "李四", 71, 9 };
M.L[4] = { NULL, "", NULL, 8 };
M.L[5] = { NULL, "", NULL, -1 };
M.L[6] = { 004, "赵六", 34, 2 };
M.L[7] = { NULL, "", NULL, 1 };
M.L[8] = { NULL, "", NULL, 7 };
M.L[9] = { 003, "王五", 88, 6 };
int head = 0;
int head_free = 4;
Get(M, head);
}
2015.3。