数据结构上机报告(四)

合集下载

数据结构上机实验报告

数据结构上机实验报告
{if(i%2==0) insert(lb,i/2,la.list[i]); //奇数位次元诩插入lb
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--图

数据结构上机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

数据结构上机实践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的数据元素个数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档