中国石油大学数据结构上机实验7

中国石油大学数据结构上机实验7
中国石油大学数据结构上机实验7

《数据结构》实验报告

学号2015011512 姓名胡明禹专业数学与应用数学时间2018.5.22

一、实验题目: 实验七图的遍历

二、实验目的

1. 掌握图的逻辑结构与基本存储方法;

2. 掌握有关图的操作算法并用高级语言实现;

3. 熟练掌握图的两种搜索路径遍历方法。

三、算法设计分析

实验由8个函数共同组成。其功能描述如下:

(1)主函数:统筹调用各个函数以实现相应功能

void main()

(2)返回顶点下标函数

int LocateVex(MGraph &G,VertexType ch)

{

//返回顶点在G中顶点向量中的下标值

int i;

for ( i = 0; G.vexnum; i++ )

if ( ch == G.vexs[i] )

return i;

return -1;

}

(3)返回第一个未被访问的相邻节点下标函数

int FirstAdjVex( MGraph &G,int v)

{

//得到第一个未被访问的相邻节点下标,若无,则返回-1

int i;

for ( i = 0; i < G.vexnum; i++ )

{

if ( !visited[i] && G.arcs[v][i].adj > 0 && G.arcs[v][i].adj

}

return -1;

}

(4)返回v的(相对于w)下一个邻接顶点函数

int NextAdjVex(MGraph &G,int v,int w)

{

//返回v的(相对于w)下一个邻接顶点,若w是v的最后一个邻接顶点,返回空

int i;

for (i=w; i

{

if (!visited[i] && G.arcs[v][i].adj>0 && G.arcs[v][i].adj < INFINITY) return i;

}

return -1;

}

(5)创建有向图的邻接矩阵函数

Status CreateDG(MGraph &G)

{

//创建有向图的邻接矩阵

int i,j,k,w;

char v1,v2;

printf("请输入顶点数和边数:");

scanf("%d%d",&G.vexnum,&G.arcnum);

visited = (int *)malloc(G.vexnum*sizeof(int));

for (i = 0; i < G.vexnum; i++ )

visited[i] = 0;

printf("\n请按次序输入%d个顶点字母标号(如ABCD等):",G.vexnum);

getchar(); //弹出缓冲区中上次最后出入的换行符,即最后按下的回车键

for (i=0;i

scanf("%c",&G.vexs[i]);

getchar(); //弹出缓冲区中上次最后出入的换行符,即最后按下的回车键

for (i=0;i

for (j=0;j

{

G.arcs[i][j].adj=INFINITY;

G.arcs[i][j].info=NULL;

}

printf("\n输入边的顶点和权值(如A B 1):\n"); //构造邻接矩阵

for (k=0;k

{

scanf("%c %c %d",&v1,&v2,&w); //输入一条有向边的起点终点和权值

i = LocateVex(G,v1); //确定顶点在G中的位置

j = LocateVex(G,v2);

G.arcs[i][j].adj = w;

getchar();//弹出缓冲区中上次最后出入的换行符,即最后按下的回车键

}

return OK;

}

(6)输出邻接矩阵函数

Status PrintArcs( MGraph &G)

{

//输出邻接矩阵

int i;

int j;

printf("邻接矩阵\n"); //按行序依次输出

for ( i = 0; i < G.vexnum; i++ )

{

for ( j = 0; j < G.vexnum; j++ )

{

if ( INFINITY == G.arcs[i][j].adj)

printf("%6s%","INF");

else

printf("%6d",G.arcs[i][j]);

}

printf("\n");

}

return OK;

}

(7)从某点开始进行深度优先遍历函数

Status DFS(MGraph &G,int v)

{

//从某点开始进行深度优先遍历

int w;

printf("\n");

visited[v] = TRUE; //访问第v个顶点

printf("%-4c",G.vexs[v]);

for ( w = FirstAdjVex(G,v); w>=0; w=NextAdjVex(G,v,w) ) if (!visited[w])

DFS(G,w); //对v尚未访问的邻接顶点w调用递归DFS return OK;

}

(8)菜单函数

void mainmenu() //输出菜单,供用户进行操作选择

{

printf("\n 菜单");

printf("\n ********************************************\n\n");

printf(" * 1.创建有向图邻接矩阵 *\n");

printf(" * 2.输出邻接矩阵 *\n");

printf(" * 3.从某点开始的深度优先遍历 *\n");

printf(" * 0.退出 *\n");

printf("\n ********************************************\n");

}

四、实验测试结果及结果分析

(一)测试结果(此处给出程序运行截图)

四、实验程序代码(该部分请加注释)

#include "stdio.h"

#include "stdlib.h"

#include "malloc.h"

#include

#define OK 1

#define TRUE 1

#define INFINITY INT_MAX //最大值无穷#define MAX_VERTEX_NUM 20 //最大顶点个数

typedef int InfoType;

typedef int VRType;

typedef char VertexType;

typedef int Status;

int *visited; //记录顶点是否被访问

typedef struct ArcCell

{

VRType adj;

InfoType *info; //该边相关信息的指针

}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct

{

VertexType vexs[MAX_VERTEX_NUM]; //顶点向量

AdjMatrix arcs; //邻接矩阵

int vexnum,arcnum; //图的顶点数和有向边数

}MGraph;

int LocateVex(MGraph &G,VertexType ch)

{

//返回顶点在G中顶点向量中的下标值

int i;

for ( i = 0; G.vexnum; i++ )

if ( ch == G.vexs[i] )

return i;

return -1;

}

int FirstAdjVex( MGraph &G,int v)

{

//得到第一个未被访问的相邻节点下标,若无,则返回-1

int i;

for ( i = 0; i < G.vexnum; i++ )

{

if ( !visited[i] && G.arcs[v][i].adj > 0 && G.arcs[v][i].adj

return i;

}

return -1;

}

int NextAdjVex(MGraph &G,int v,int w)

{

//返回v的(相对于w)下一个邻接顶点,若w是v的最后一个邻接顶点,返回空

int i;

for (i=w; i

{

if (!visited[i] && G.arcs[v][i].adj>0 && G.arcs[v][i].adj < INFINITY)

return i;

}

return -1;

}

Status CreateDG(MGraph &G)

{

//创建有向图的邻接矩阵

int i,j,k,w;

char v1,v2;

printf("请输入顶点数和边数:");

scanf("%d%d",&G.vexnum,&G.arcnum);

visited = (int *)malloc(G.vexnum*sizeof(int));

for (i = 0; i < G.vexnum; i++ )

visited[i] = 0;

printf("\n请按次序输入%d个顶点字母标号(如ABCD等):",G.vexnum); getchar(); //弹出缓冲区中上次最后出入的换行符,即最后按下的回

车键

for (i=0;i

scanf("%c",&G.vexs[i]);

getchar(); //弹出缓冲区中上次最后出入的换行符,即最后按下的回

车键

for (i=0;i

for (j=0;j

{

G.arcs[i][j].adj=INFINITY;

G.arcs[i][j].info=NULL;

}

printf("\n输入边的顶点和权值(如A B 1):\n"); //构造邻接矩阵

for (k=0;k

{

scanf("%c %c %d",&v1,&v2,&w); //输入一条有向边的起点终点和权

i = LocateVex(G,v1); //确定顶点在G中的位置

j = LocateVex(G,v2);

G.arcs[i][j].adj = w;

getchar();//弹出缓冲区中上次最后出入的换行符,即最后按下的回车

}

return OK;

}

Status PrintArcs( MGraph &G)

{

//输出邻接矩阵

int i;

int j;

printf("邻接矩阵\n"); //按行序依次输出

for ( i = 0; i < G.vexnum; i++ )

{

for ( j = 0; j < G.vexnum; j++ )

{

if ( INFINITY == G.arcs[i][j].adj)

printf("%6s%","INF");

else

printf("%6d",G.arcs[i][j]);

}

printf("\n");

}

return OK;

}

Status DFS(MGraph &G,int v)

{

//从某点开始进行深度优先遍历

int w;

printf("\n");

visited[v] = TRUE; //访问第v个顶点

printf("%-4c",G.vexs[v]);

for ( w = FirstAdjVex(G,v); w>=0; w=NextAdjVex(G,v,w) ) if (!visited[w])

DFS(G,w); //对v尚未访问的邻接顶点w调用递归DFS return OK;

}

void mainmenu() //输出菜单,供用户进行操作选择

{

printf("\n 菜单");

printf("\n ********************************************\n\n");

printf(" * 1.创建有向图邻接矩阵 *\n");

printf(" * 2.输出邻接矩阵 *\n");

printf(" * 3.从某点开始的深度优先遍历 *\n");

printf(" * 0.退出 *\n");

printf("\n ********************************************\n"); }

void main() // 主函数

{

MGraph G;

int choose;

int v;

while(1)

{

mainmenu();

printf("\n请输入你的选择:");

scanf("%d",&choose);

switch(choose)

{

case 1:

//在此插入创建有向图邻接矩阵函数

system("cls");

CreateDG(G);

system("PAUSE");

system("cls");

break;

case 2:

//在此插入输出邻接矩阵函数

system("cls");

PrintArcs(G);

printf("\n");

system("PAUSE");

system("cls");

break;

case 3:

//在此调用从某点开始深度优先遍历函数

system("cls");

printf("请输入开始结点:");

scanf("%d",&v);

DFS(G, v) ;

system("PAUSE");

system("cls");

break;

case 0:

//退出

exit(0);

break;

default:

//输入非法,提示用户重新输入

printf("\n输入错误,重新输入!\n");

}

}

}

数据结构上机实验报告

数据结构上机实验报告 学院:电子工程学院 专业:信息对抗技术 姓名:

学号: 教师:饶鲜日期:

目录 实验一线性表................................................. - 4 - 一、实验目的................................................ - 4 - 二、实验代码................................................ - 4 - 三、实验结果............................................... - 14 - 四、个人思路............................................... - 15 -实验二栈和队列.............................................. - 15 - 一、实验目的............................................... - 15 - 二、实验代码............................................... - 16 - 三、实验结果............................................... - 24 - 四、个人思路............................................... - 25 -实验三数组.................................................. - 26 - 一、实验目的............................................... - 26 - 二、实验代码............................................... - 26 - 三、实验结果............................................... - 28 - 四、个人思路............................................... - 28 -实验四树.................................................... - 29 - 一、实验目的............................................... - 29 - 二、实验代码............................................... - 29 -

数据结构上机实验答案

《数据结构实验指导书》答案 实验一: 1、请编写函数int fun(int *a, int *b),函数的功能是判断两个指针a和b所指存储单 元的值的符号是否相同;若相同函数返回1,否则返回0。这两个存储单元中的值都不为0。在主函数中输入2个整数、调用函数fun、输出结果。 #include int fun(int *a, int *b) { if (*a*(*b)>0) return(1); else return(0); } main() { int x,y; scanf("%d%d",&x,&y); if (fun(&x,&y)) printf("yes\n"); else printf("no"); } 2、计算1+2+3+……+100,要求用指针进行设计。即设计函数int fun(int *n)实现求 1+2+3+……+*n,在主函数中输入、调用、输出结果。 #include int fun(int *n) { int i,sum=0; for (i=1;i<=*n;i++) sum+=i; return(sum); } main() { int x,sum; scanf("%d",&x); printf("the sum is %d\n",fun(&x)); } 3、函数的功能是求数组a中最大数的位置(位序号)。在主函数中输入10个整数、调用函

数fun、输出结果。 #define N 10 #include void input(int *a,int n) { int i; for (i=0;i*max) max=a+i; return(max-a); } main() {int a[N],maxi; input(a,N); maxi=fun(a,N); printf("\n the max position is %d\n",maxi); } 4、请编写函数fun(int *a,int n, int *odd, int *even),函数的功能是分别求出数组a 中所有奇数之和和所有偶数之和。形参n给出数组中数据的个数;利用指针odd和even分别返回奇数之和和偶数之和。在主函数中输入10个整数、调用函数fun、输出结果。 #define N 10 #include void input(int *a,int n) { int i; for (i=0;i

数据结构实验报告七查找、

云南大学软件学院数据结构实验报告 (本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □ C □ 学期:2010秋季学期 任课教师: 实验题目: 查找算法设计与实现 姓名: 王辉 学号: 20091120154 电子邮件: 完成提交时间: 2010 年 12 月 27 日

云南大学软件学院2010学年秋季学期 《数据结构实验》成绩考核表 学号:姓名:本人承担角色: 综合得分:(满分100分) 指导教师:年月日(注:此表在难度为C时使用,每个成员一份。)

(下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四,个人报告按下面每一项的百分比打分。难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%) 1 哈希表查找。根据全年级学生的姓名,构造一个哈希表,选择适当的哈希函数和解决冲突的方法,设计并实现插入、删除和查找算法。 熟悉各种查找算法的思想。 2、掌握查找的实现过程。 3、学会在不同情况下运用不同结构和算法求解问题。 4 把每个学生的信息放在结构体中: typedef struct //记录 { NA name; NA tel; NA add; }Record; 5 void getin(Record* a)函数依次输入学生信息 6 人名折叠处理,先将用户名进行折叠处理折叠处理后的数,用除留余数法构造哈希函数,并返回模值。并采用二次探测再散列法解决冲突。 7姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。完成按姓名查询的操作。将初始班级的通讯录信息存入文件。 二、【实验设计(Design)】(20%) (本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系) 1抽象数据类型的功能规格说明和结构体: #include

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 1.实验目的 (1)掌握使用Visual C++ 6.0上机调试程序的基本方法; (2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)认真阅读和掌握本章相关内容的程序。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 (5)按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>//头文件 #include//库头文件-----动态分配内存空间 typedef int elemtype;//定义数据域的类型 typedef struct linknode//定义结点类型 { elemtype data;//定义数据域 struct linknode *next;//定义结点指针 }nodetype; 2)创建单链表

nodetype *create()//建立单链表,由用户输入各结点data域之值,//以0表示输入结束 { elemtype d;//定义数据元素d nodetype *h=NULL,*s,*t;//定义结点指针 int i=1; cout<<"建立一个单链表"<> d; if(d==0) break;//以0表示输入结束 if(i==1)//建立第一个结点 { h=(nodetype*)malloc(sizeof(nodetype));//表示指针h h->data=d;h->next=NULL;t=h;//h是头指针 } else//建立其余结点 { s=(nodetype*) malloc(sizeof(nodetype)); s->data=d;s->next=NULL;t->next=s; t=s;//t始终指向生成的单链表的最后一个节点

数据结构课程设计题目及要求

实验一~实验四任选一题;实验五~实验九任选一题。 实验一运动会分数统计 一、实验目的: (1)熟练掌握线性表的两种存储方式 (2)掌握链表的操作和应用。 (3)掌握指针、结构体的应用 (4)按照不同的学校,不同项目和不同的名次要求,产生各学校的成绩单、团体总分报表。 二、实验内容: 【问题描述】 参加运动会的n个学校编号为1~n。比赛分成m个男子项目和w个女子项目,项目编号分别为1~m和m+1~m+w。由于各项目参加人数差别较大,有些项目取前五名,得分顺序为7,5,3,2,1;还有些项目只取前三名,得分顺序为5,3,2。写一个统计程序产生各种成绩单和得分报表。 【基本要求】 产生各学校的成绩单,内容包括各校所取得的每项成绩的项目号、名次(成绩)、姓名和得分;产生团体总分报表,内容包括校号、男子团体总分、女子团体总分和团体总分。 【测试数据】 对于n=4,m=3,w=2,编号为奇数的项目取前五名,编号为偶数的项目取前三名,设计一组实例数据。 【实现提示】 可以假设m≤20,m≤30,w≤20,姓名长度不超过20个字符。每个项目结束时,将其编号、类型符(区分取前五名还是前三名)输入,并按名次顺序输入运动员姓名、校名(和成绩)。 【选作内容】 允许用户指定某些项目可采取其他名次取法。

实验二停车场管理 一、实验目的: (1)熟练掌握栈顺存和链存两种存储方式。 (2)掌握栈的基本操作及应用。 (3)以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。 二、实验内容: 【问题描述】 设停车场是一个可停放n辆汽车的长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车信放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场院,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。 【基本要求】 以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。 【测试数据】 设n=2,输入数据为:(A,1,5),(A,1,15),(A,3,20),(A,4,25),(A,5,30),(D,2,35),(D,4,40),(E,0,0)。其中:A表示到达(Arrival);D表示离去(Departure);E表示输入结束(End)。 【实现提示】 需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。 【选作内容】 (1)两个栈共享空间,思考应开辟数组的空间是多少? (2)汽车可有不同种类,则他们的占地面积不同收费标准也不同,如1辆客车和1.5辆小汽车的占地面积相同,1辆十轮卡车占地面积相当于3辆小汽车的占地面积。(3)汽车可以直接从便道开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。 (4)停放在便道上的汽车也收费,收费标准比停放在停车场的车低,请思考如何修改结构以满足这种要求。

数据结构实验七图的创建与遍历

实验七图的创建与遍历 实验目的: 通过上机实验进一步掌握图的存储结构及基本操作的实现。 实验内容与要求: 要求: ⑴能根据输入的顶点、边/弧的信息建立图; ⑵实现图中顶点、边/弧的插入、删除; ⑶实现对该图的深度优先遍历; ⑷实现对该图的广度优先遍历。 备注:单号基于邻接矩阵,双号基于邻接表存储结构实现上述操作。算法设计: #include #include #define INFINITY 32767 #define MAX_VEX 20 //最大顶点个数 #define QUEUE_SIZE (MAX_VEX+1) //队列长度 using namespace std; bool *visited; //访问标志数组 //图的邻接矩阵存储结构 typedef struct{ char *vexs; //顶点向量 int arcs[MAX_VEX][MAX_VEX]; //邻接矩阵 int vexnum,arcnum; //图的当前顶点数和弧数 }Graph; //队列类 class Queue{ public: void InitQueue() { base=(int *)malloc(QUEUE_SIZE*sizeof(int)); front=rear=0;

. } void EnQueue(int e) { base[rear]=e; rear=(rear+1)%QUEUE_SIZE; } void DeQueue(int &e) { e=base[front]; front=(front+1)%QUEUE_SIZE; } public: int *base; int front; int rear; }; //图G中查找元素c的位置 int Locate(Graph G,char c) { for(int i=0;i

数据结构上机实验报告

数据结构实验报告 一.顺序表 要求:实现顺序表的初始化、在指定位置插入和删除元素。 算法思路:线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。顺序表的初始化操作就是为顺序表分配一个预定义大小的空间,并将线性表的当前长度设为“0”。线性表的插入操作是在线性表的第i-1个数据元素和第i个元素之间插入新的数据元素,使得长度为n的线性表变成长度为n+1的线性表,而删除恰好相反长度变为n-1的线性表,而且删除点后面的元素要往前移动一个位。 程序代码: #include #include #define MAXSIZE 50 typedef char elemtype; typedef struct //类型定义 { elemtype v[MAXSIZE]; int last; }SeqList; SeqList *Init_SeqList() //初始化操作 { SeqList *L; L=(SeqList*)malloc(sizeof(SeqList)); L->last=-1; return L; } void Create(SeqList *L) //建立顺序表 { int i=0; elemtype ch; scanf("%c",&ch); while(ch!='\n') { L->v[i++]=ch; scanf("%c",&ch); L->last=i-1; } } void PrintL(SeqList *L) //输出顺序表 { int i; printf("此表为:\n");

for(i=0;ilast;i++) { printf("%c",L->v[i]); } printf("%c\n",L->v[i]); } void Length(SeqList *L) //顺序表长度函数{ printf("此表长度:\n%d",L->last+1); printf("\n"); } void insert(SeqList *L,int i,elemtype x) //插入函数 { int j; if(L->last==0) printf("Error!\n"); if(i<1||i>L->last) printf("Error!"); for(j=L->last;j>=i-1;j--) L->v[j+1]=L->v[j]; L->v[i-1]=x; L->last++; PrintL(L); Length(L); } void Delete(SeqList *L,int i) //删除函数 { int j; if(L->last==-1) printf("Error!"); if(i<1||i>L->last+1) printf("Error!"); for(j=i;j<=L->last;j++) L->v[j-1]=L->v[j]; L->last--; PrintL(L); Length(L); } void main() //程序主函数 { int i,j,k; elemtype a,b;

数据结构(第4版)习题及实验参考答案数据结构复习资料完整版(c语言版)

数据结构基础及深入及考试 复习资料 习题及实验参考答案见附录 结论 1、数据的逻辑结构是指数据元素之间的逻辑关系。即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。 2、数据的物理结构亦称存储结构,是数据的逻辑结构在计算机存储器内的表示(或映像)。它依赖于计算机。存储结构可分为4大类:顺序、链式、索引、散列 3、抽象数据类型:由用户定义,用以表示应用问题的数据模型。它由基本的数据类型构成,并包括一组相关的服务(或称操作)。它与数据类型实质上是一个概念,但其特征是使用与实现分离,实行封装和信息隐蔽(独立于计算机)。 4、算法:是对特定问题求解步骤的一种描述,它是指令的有限序列,是一系列输入转换为输出的计算步骤。 5、在数据结构中,从逻辑上可以把数据结构分成( C ) A、动态结构和表态结构 B、紧凑结构和非紧凑结构 C、线性结构和非线性结构 D、内部结构和外部结构 6、算法的时间复杂度取决于( A ) A、问题的规模 B、待处理数据的初态 C、问题的规模和待处理数据的初态 线性表 1、线性表的存储结构包括顺序存储结构和链式存储结构两种。 2、表长为n的顺序存储的线性表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均次数为( E ),删除一个元素需要移动的元素的个数为( A )。 A、(n-1)/2 B、n C、n+1 D、n-1 E、n/2 F、(n+1)/2 G、(n-2)/2 3、“线性表的逻辑顺序与存储顺序总是一致的。”这个结论是( B ) A、正确的 B、错误的 C、不一定,与具体的结构有关 4、线性表采用链式存储结构时,要求内存中可用存储单元的地址( D ) A、必须是连续的 B、部分地址必须是连续的C一定是不连续的D连续或不连续都可以 5、带头结点的单链表为空的判定条件是( B ) A、head==NULL B、head->next==NULL C、head->next=head D、head!=NULL 6、不带头结点的单链表head为空的判定条件是( A ) A、head==NULL B、head->next==NULL C、head->next=head D、head!=NULL 7、非空的循环单链表head的尾结点P满足( C ) A、p->next==NULL B、p==NULL C、p->next==head D、p==head 8、在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是( B ) A、O(1) B、O(n) C、O(n2) D、O(nlog2n) 9、在一个单链表中,若删除p所指结点的后继结点,则执行( A )

数据结构实验七

(*ht)[i].RChild = 0; } for(i=n+1;i<=m;i++){ (*ht)[i].weight = 0; (*ht)[i].LChild = 0; (*ht)[i].parent = 0; (*ht)[i].RChild = 0; } for(i=n+1;i<=m;i++){ YLX_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 ; } } void YLX_outputHuffman(HuffmanTree HT, int m){ if(m!=0){ YLX_outputHuffman(HT,HT[m].LChild); if(!HT[m].LChild&&!HT[m].RChild)printf("%c \t", HT[m].data); YLX_outputHuffman(HT,HT[m].RChild); } } void YLX_CrtHuffmanCode(HuffmanTree *ht, HuffmanCode *hc, int n){ char *cd; int i; unsigned int c; int start; int p; hc=(HuffmanCode *)malloc((n+1)*sizeof(char *)); cd=(char * )malloc(n * sizeof(char )); cd[n-1]='\0'; for(i=1;i<=n;i++){ start=n-1; for(c=i,p=(*ht)[i].parent; p!=0; c=p,p=(*ht)[p].parent) if( (*ht)[p].LChild == c) cd[--start]='0'; else cd[--start]='1'; hc[i]=(char *)malloc((n-start)*sizeof(char)); strcpy(hc[i],&cd[start]); } free(cd); for(i=1;i<=n;i++) printf("%c编码为%s\n",(*ht)[i].data,hc[i]); } void main() { HuffmanTree HT; HuffmanCode HC; int n; int m; printf("*******袁丽湘*******"); printf("\n"); printf("输入叶子节点的个数:" ); scanf("%d",&n); YLX_CrtHuffmanTree(&HT,n); m=2*n-1;printf("中序输出哈夫曼树叶子节点:\n"); YLX_outputHuffman(HT,m); printf("\n"); YLX_CrtHuffmanCode(&HT,&HC,n); } 六、运行结果截图

数据结构实验四

数据结构实验报告 第四次实验 一、实验目的 1、复习线性表的逻辑结构、存储结构及基本操作; 2、掌握顺序表和(带头结点)单链表; 3、了解有序表。 二、实验内容 1、(必做题)假设有序表中数据元素类型是整型,请采用顺序表或(带头结点)单链表实现: (1)OrderInsert(&L, e, int (*compare)(a, b)) //根据有序判定函数compare,在有序表L 的适当位置插入元素e; (2)OrderInput(&L, int (*compare)(a, b)) //根据有序判定函数compare,并利用有序插入函数OrderInsert,构造有序表L;(3)OrderMerge(&La, &Lb, &Lc, int (*compare)()) //根据有序判定函数compare,将两个有序表La 和Lb 归并为一个有序表Lc。 2、(必做题)请实现: (1)升幂多项式的构造,升幂多项式是指多项式的各项按指数升序有序,约定系数不能等于0,指数不能小于0; (2)两个升幂多项式的相加。 三、算法描述 (采用自然语言描述) 1、创建带头节点的链表,输入两个有序表数据La、Lb,归并两个有序表得有序表Lc,输出三个有序表。输入需插入数据e,将e 插入有序表Lc,输出插入e 后的Lc。 2、创建链表,按指数升序输入多项式得序数和指数,输出多项式。按指数升序输入第二个多项式得序数和指数,两个多项式相加,输出第二个多项式和两个多项式的和。 四、详细设计 (画出程序流程图) 1、

2、

五、程序代码 (给出必要注释) 1、 #include #include typedef struct LNode { int date; struct LNode *next; }LNode,*Link; typedef struct LinkList { Link head; int lenth; }LinkList; int compare (LinkList *L,int e) { int Lc=0; Link p; p=L->head; p=p->next; while(p!=NULL)

《数据结构与算法》上机实验要求

《数据结构与算法》课程实验内容与要求 一、课程简介 本课程着重讲述①线性结构、树型结构、图等典型数据结构的逻辑特点、存储结构及其相应的基本算法。②各种查找算法③典型内部排序算法。 二、实验的作用、地位和目的 数据结构是一门技术基础课,通过实验深刻理解各种逻辑结构、存储结构的特性,培养为实际问题分析其数据对象、基本操作,选择逻辑结构、存储结构灵活应用基本算法,设计出具有专业水准的应用程序的能力。 三、实验方式与要求 ①首先要求学生在课下完成问题分析、算法设计,基本完成程序设计。 ②实验时,每位学生使用一台微机,独立调试,完成程序。 ③程序调试好后,由指导教师检测运行结果,并要求学生回答相关的问题。教师评出检查成绩。 ④学生记录程序的输入数据,运行结果及源程序。 ⑤在一周内完成实验报告。 四、考核方式与实验报告要求 实验成绩由指导教师根据学生的实验完成情况、源程序质量、回答问题情况、实验报告质量、实验纪律等方面给分。 学生在实验后的一周内提交实验报告。实验报告按照首页附件中实验报告模版书写。实验报告中应包括如下内容: ?实验内容按任课教师下达的实验任务填写(具体实验题目和要求); ?实验过程与实验结果应包括如下主要内容: 算法设计思路简介 算法描述:可以用自然语言、伪代码或流程图等方式 算法的实现和测试结果:包括算法运行时的输入、输出,实验中出现的问题及解决办法等 ?源程序清单与实验结果或其它说明可打印,并装订在实验报告首页之后。 ?实验报告雷同者,本次实验成绩为0分或雷同实验报告平分得分

五、实验的软硬件环境 硬件环境:PⅡ以上微型计算机 软件环境:Windows98/2000, VC++6.0或turbo C 六、实验内容安排 实验一线性表应用 实验时间:2016年3月14日1-4节(地点:7-215) 实验目的:理解线性表的逻辑特点;掌握顺序表、链表存储结构,以及线性表的基本操作,如插入、删除、查找,以及线性表合并等操作在顺序存储结构和链式存储结构上的实现算法,并能够在实际问题背景下的灵活运用线性表来解决问题,实现相应算法。 具体实验题目与要求:(任课教师根据实验大纲自己指定) 每位同学可从下面题目中选择1-2题实现: 1.一元稀疏多项式简单的计算器 1)问题描述:用线性表表示一元稀疏多项式,设计一个一元多项式运算器 2)要求: (1)采用单链表存储结构一元稀疏多项式 (2)输入并建立多项式 (3)输出多项式 (4)实现多项式加、减运算 2.单链表基本操作练习 1)问题描述:在主程序中提供下列菜单: 1…建立链表 2…连接链表 3…输出链表 0…结束 2)实验要求:算法中包含下列过程,分别完成相应的功能: CreateLinklist(): 从键盘输入数据,创建单链表 ContLinklist():将前面建立的两个单链表首尾相连 OutputLinklist():输出显示单链表 3.约瑟夫环问题 1)问题描述:有编号为1, 2…n 的n 个人按顺时针方向围坐一圈,每人持有一个正整数密码。开始给定一个正整数m,从第一个人按顺时针方向自1开始报数,报到m者出列,不再参加报数,这时将出列者的密码作为m,从出列者顺时针方向的下一人开始重新自1开始报数。如此下去,直到所有人都出列。试设计算法,输出出列者的序列。 2)要求: 采用顺序和链式两种存储结构实现 实验报告格式及要求:按附件中实验报告模版书写。(具体要求见四)

数据结构上机实验指导

《数据结构》课程上机实验指导书 实验一 【实验名称】顺序表的基本算法 【实验目的】 创建一个顺序表,掌握线性表顺序存储的特点。设计和验证顺序表的查找、插入、删除算法。 【实验要求】 (1)从键盘读入一组整数,按输入顺序形成顺序表。并将创建好的顺序表元素依次打印在屏幕上。 设计一个带选择菜单的主函数,菜单中具备任意选择删除、插入、查找数据元素(2)的功能。 当选择删除功能时,从键盘读入欲删除的元素位置或元素值,按指定方式删除;3()当选择插入功能时,从键盘读入新元素值和被插入位置,在指定位置插入;当选择查找功能时,从键盘读入欲查找的元素值,返回其位置序号。 (4)每种操作结束后,都能在屏幕上打印出此时顺序表元素的遍历结果。 【实验步骤】、实验前先写好算法。1 上机编写程序。2、编译。3、调试。4、 综合实例!,2-62-8!带菜单的主函数参考书上2.5,,,书上参考算法例程:2-12-42-5注意:顺序表的结构体!typedef struct { datatype items[listsize]; int length; }SpList; 实验二 【实验名称】单链表的基本算法 【实验目的】 创建一个单链表,掌握线性表链式存储的特点。设计和验证链表的查找、插入、删除、求表长的算法。【实验要求】 (1)从键盘读入一组整数,按输入顺序形成单链表。并将创建好的单链表元素依次打印在屏幕上。(注意:选择头插法或者尾插法!) 设计一个带选择功能菜单的主函数,菜单中至少具备任意选择删除、插入、查找(2)数据元素,和求单链表表长等几项功能。 当选择删除功能时,从键盘读入欲删除的元素位置,按指定位置删除;当选择插)(3入功能时,从键盘读入新元素值和被插入位置,在指定位置插入;当选择查找功能时,从键盘读入欲查找的元素值,返回其位置序号;当选择求表长功能时,返回该单链表表长的数值。 (4)每种操作结束后,都能在屏幕上打印出此时单链表元素的遍历结果。 【实验步骤】、实验前先写好算法。1 、上机编写程序。2 编译。3、调试。4、 综合实例!!带菜单的主函数参考书上,2-132-15,2-172.5,,书上参考算法例程:2-102-12 另外,注意,指针的初始化!指针的操作必须谨慎!链表的结构体如下:typedef struct Node { Datatype ch; struct Node *next; }LNode, *Pnode, *Linklist; 实验三

数据结构实验题参考答案

【实验题】 1.狐狸逮兔子 围绕着山顶有10个圆形排列的洞,狐狸要吃兔子,兔子说:“可以,但必须找到我,我就藏身于这十个洞中,你先到1号洞找,第二次隔1个洞(即3号洞)找,第三次隔2个洞(即6号洞)找,以后如此类推,次数不限。”但狐狸从早到晚进进出出了1000次,仍没有找到兔子。问兔子究竟藏在哪个洞里? (提示:这实际上是一个反复查找线性表的过程。) 【数据描述】 定义一个顺序表,用具有10个元素顺序表来表示这10个洞。每个元素分别表示围着山顶的一个洞,下标为洞的编号。 #define LIST_INIT_SIZE 10 //线性表存储空间的初始分配量 typedef struct { ElemType *elem; //存储空间基址 int length; //当前长度 int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位) }SqList; 【算法描述】 status InitList_Sq(SqList &L) { //构造一个线性表L L.elem=(ElemType )malloc(LIST_INIT_SIZE*sizeof(ElemType)); If(!L.elem) return OVERFLOW; //存储分配失败 L.length=0; //空表长度为0 L.listsize=LIST_INIT_SIZE; //初始存储容量 return OK; } //InitList_Sq status Rabbit(SqList &L) { //构造狐狸逮兔子函数 int current=0; //定义一个当前洞口号的记数器,初始位置为第一个洞口 for(i=0;i #include #define OK 1 #define OVERFLOW -2 typedef int status; typedef int ElemType; #define LIST_INIT_SIZE 10 /*线性表存储空间的初始分配量*/

数据结构实验报告图实验

邻接矩阵的实现 1. 实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现2. 实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历3.设计与编码MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; }

int vertexNum, arcNum; }; #endif MGraph.cpp #include using namespace std; #include "MGraph.h" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e) { int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0; for(k = 0; k < arcNum; k++) { cout << "Please enter two vertexs number of edge: " cin >> i >> j; arc[i][j] = 1; arc[j][i] = 1; } }

数据结构与算法上机实验报告

数据结构与算法B上机实验报告 第1次2011-10-02 顺序表的实现和基本操作 第2次2011-10-29 二叉树的实现和递归遍历 第3次2011-11-23 内部排序 第4次2011-12-dd 实现图从邻接矩阵到邻接表存储转化

第一次线性表数据结构 一、上机实习题目 线性链表操作——插入、删除、合并、排序、查找二数据结构设计(算法设计)源程序( #include #define MaxSize 100 using namespace std; typedef int ElemType; class SeqList { ElemType list[MaxSize]; int length; public: SeqList() {length=0;} void SeqListSort(int i,ElemType x); void SeqListCreat(int n); void SeqListInset(int i,ElemType x); void SeqListDelete(int i); void SeqListMerge(); int GetLength(){return length;} int SeqListFind(ElemType x); int SeqListIsEmpty(); void SeqListPrint(); }Mylist1,Mylist2;

//创建顺序表 void SeqList::SeqListCreat(int n) { ElemType x; cout<<"请输入数据元素:"; for (int i=0;i>x; list[i]=x; length++; } } //对顺序表进行排序 void SeqList::SeqListSort(int i,ElemType x) { for(int k=0;klist[i]) { x=list[k]; list[k]=list[i]; list[i]=x; } } } }

数据结构 上机实验题及题解

2013-03-08 上机实验题 1.构建两个顺序表示的非空线性表LA和LB (数据元素为整型,其值自行确定); 2.从线性表LA中删除第i 个元素; 3.将元素e插入到线性表LB中的第i个元素之后; 4.假设LA中不含重复的元素 (LB同),将线性表LA和LB合并,并输出结果,要求结 果中不含重复的元素。 //构建两个顺序表(定义、初始化) //在一个顺序表中删除指定位置的元素 //在一个顺序表中指定位置插入一个新元素 //将两个线性表LA和LB进行合并 //遍历LB, 如果其中的数据元素不在LA中,则将其插入LA,否则不予处理 //打印线性表LA #define List_Init_Size 100 #define LISTINCREMENT 10 typedef int Status; typedef struct { int * elem; int length; // 当前长度 int ListSize; // 当前分配的存储容量 }SqList; Status Initialize_table (SqList &L) {// 初始化线性表 int i, m, data; L.elem=(int *)malloc(List_Init_Size *sizeof(int)); if (!L.elem) { // 为线性表分配空间 printf("Overflow"); return FAILURE; } L.ListSize=List_Init_Size; L.length=0; printf ("Please input the size of linear table (<=%d): "+ List_Init_Size); scanf_s("%d",&m); for (i=0;iL.length)) //检查i值是否合法

相关文档
最新文档