数据结构(B)上机实验四__图

数据结构上机实验六

实验内容:图的基本操作

实验要求:

1) 图的遍历与基本操作要作为函数被调用.

2) 把自己使用的图结构明确的表达出来.

3) 基本上实现每个实验题目的要求.

分组要求:可单独完成,也可两人一组。

实验目的:

1)熟悉C/C++基本编程,培养动手能力.

2)通过实验,加深对图的理解.

评分标准:

1) 只完成第一和第二题,根据情况得4,5分;

2)完成前3题,根据情况得5,6分;

3)在2)基础上,选做四)中题目,根据情况得7到10分。

题目:

一)建立一个无向图+遍历+插入

(1)以数组表示法作为存储结构,从键盘依次输入顶点数、弧数与各弧信息建立一个无向图;

(2)对(1)中生成的无向图进行广度优先遍历并打印结果;

(3)向(1)中生成的无向图插入一条新弧并打印结果;

二)建立一个有向图+遍历+插入+删除

(1)以邻接表作为图的存储结构,从键盘输入图的顶点与弧的信息建立一个有向图;

(2)对(1)中生成的有向图进行深度优先遍历并打印结果;

(3)在(1)中生成的有向图中,分别插入与删除一条弧并打印其结果;

(4)在(1)中生成的有向图中,分别插入与删除一个顶点并打印结果;

(5) 在(1)中生成的有向图中,各顶点的入度与出度并打印结果;

三)基本应用题

(1)编写算法,判断图中指定的两个顶点是否连通。

(2)编写算法,判断图的连通性。如果不连通,求连通分量的个数

(3)编写算法,判断图中任意两个顶点的连通性

(4)编写算法,判断图中是否存在回路。

(5)实现图的广度优先搜索算法。

四)高级应用题

(1)实现Prim算法

(2)实现Kruskal算法

(3)实现迪杰斯特拉算法

(4)实现拓扑排序算法

(5)实现关键路径算法

一)建立一个无向图+遍历+插入

(1)以数组表示法作为存储结构,从键盘依次输入顶点数、弧数与各弧信息建立一个无向图;

(2)对(1)中生成的无向图进行广度优先遍历并打印结果;

(3)向(1)中生成的无向图插入一条新弧并打印结果;

#include

#include

#include

#include

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define OVERFLOW -2

#define MAX_NAME 5 /* 顶点字符串的最大长度+1 */

#define MAX_INFO 20 /* 相关信息字符串的最大长度+1 */

#define INFINITY INT_MAX /* 用整型最大值代替∞ */

#define MAX_VERTEX_NUM 20 /* 最大顶点个数 */

typedef int Boolean;

Boolean visited[MAX_VERTEX_NUM]; /* 访问标志数组(全局量) */

typedef int Status;

typedef int VRType;

typedef char InfoType;

typedef char VertexType[MAX_NAME];

typedef enum{DG,DN,AG,AN}GraphKind; /* {有向图,有向网,无向图,无向网} */

typedef struct

{

VRType adj; /* 顶点关系类型。对无权图,用1(是)或0(否)表示相邻否; */

/* 对带权图,c则为权值类型 */

InfoType *info; /* 该弧相关信息的指针(可无) */

}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct

{

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

AdjMatrix arcs; /* 邻接矩阵 */

int vexnum,arcnum; /* 图的当前顶点数和弧数 */

GraphKind kind; /* 图的种类标志 */

}MGraph;

int LocateVex(MGraph G,VertexType u)

{ /* 初始条件:图G存在,u和G中顶点有相同特征 */

/* 操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 */ int i;

for(i=0;i

if(strcmp(u,G.vexs[i])==0)

return i;

return -1;

}

Status CreateAG(MGraph &G)

{ /* 采用数组(邻接矩阵)表示法,构造无向图G */

int i,j,k,l,IncInfo;

char ch,s[MAX_INFO],*info;

VertexType va,vb;

printf("请输入无向图G的顶点数,边数,边是否含其它信息(是:1,否:0): "); scanf("%d %d %d",&G.vexnum,&G.arcnum,&IncInfo);

printf("请输入%d个顶点的值(<%d个字符):\n",G.vexnum,MAX_NAME);

for(i=0;i

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

for(i=0;i

for(j=0;j

{

G.arcs[i][j].adj=0; /* 图 */

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

}

printf("请输入%d条边的顶点1 顶点2(以空格作为间隔): \n",G.arcnum); for(k=0;k

{

scanf("%s",va);

scanf("%s",vb);

ch=getchar();

i=LocateVex(G,va);

j=LocateVex(G,vb);

G.arcs[i][j].adj=G.arcs[j][i].adj=1; /* 无向图 */

if(IncInfo)

{

printf("请输入该边的相关信息(<%d个字符): ",MAX_INFO);

scanf("%s",s);

l=strlen(s);

if(l)

{

info=(char*)malloc((l+1)*sizeof(char));

strcpy(info,s);

G.arcs[i][j].info=G.arcs[j][i].info=info; /* 无向 */

}

}

if(k

printf("请输入下一条边的顶点1 顶点2:\n");

}

G.kind=AG;

return OK;

}

typedef VRType QElemType; /* 队列类型 */

typedef struct QNode

{

QElemType data;

struct QNode *next;

}QNode,*QueuePtr;

typedef struct

{

QueuePtr front,rear; /* 队头、队尾指针 */

}LinkQueue;

Status InitQueue(LinkQueue *Q)

{ /* 构造一个空队列Q */

(*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode));

if(!(*Q).front)

exit(OVERFLOW);

(*Q).front->next=NULL;

return OK;

}

Status QueueEmpty(LinkQueue Q)

{ /* 若Q为空队列,则返回TRUE,否则返回FALSE */

if(Q.front==Q.rear)

return TRUE;

else

return FALSE;

}

Status EnQueue(LinkQueue *Q,QElemType e)

{ /* 插入元素e为Q的新的队尾元素 */

QueuePtr p=(QueuePtr)malloc(sizeof(QNode));

if(!p) /* 存储分配失败 */

exit(OVERFLOW);

p->data=e;

p->next=NULL;

(*Q).rear->next=p;

(*Q).rear=p;

return OK;

}

Status DeQueue(LinkQueue *Q,QElemType *e)

{ /* 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR */ QueuePtr p;

if((*Q).front==(*Q).rear)

return ERROR;

p=(*Q).front->next;

*e=p->data;

(*Q).front->next=p->next;

if((*Q).rear==p)

(*Q).rear=(*Q).front;

free(p);

return OK;

}

void Visit(VertexType V)

{

printf("%s ",V);

}

int FirstAdjVex(MGraph G,VertexType v)

{ /* 初始条件: 图G存在,v是G中某个顶点 */

/* 操作结果: 返回v的第一个邻接顶点的序号。若顶点在G中没有邻接顶点,则返回-1 */ int i,j=0,k;

k=LocateVex(G,v); /* k为顶点v在图G中的序号 */

for(i=0;i

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

return i;

return -1;

}

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

{ /* 初始条件: 图G存在,v是G中某个顶点,w是v的邻接顶点 */

/* 操作结果: 返回v的(相对于w的)下一个邻接顶点的序号, */

/* 若w是v的最后一个邻接顶点,则返回-1 */

int i,j=0,k1,k2;

k1=LocateVex(G,v); /* k1为顶点v在图G中的序号 */

k2=LocateVex(G,w); /* k2为顶点w在图G中的序号 */

for(i=k2+1;i

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

return i;

return -1;

}

VertexType* GetVex(MGraph G,int v)

{ /* 初始条件: 图G存在,v是G中某个顶点的序号。操作结果: 返回v的值 */ if(v>=G.vexnum||v<0)

exit(ERROR);

return &G.vexs[v];

}

void BFSTraverse(MGraph G)

{ /* 初始条件: 图G存在,Visit是顶点的应用函数。算法7.6 */

/* 操作结果: 从第1个顶点起,按广度优先非递归遍历图G,并对每个顶点调用函数 */

/* Visit一次且仅一次。一旦Visit()失败,则操作失败。 */

/* 使用辅助队列Q和访问标志数组visited */

int v,u,w;

VertexType w1,u1;

LinkQueue Q;

for(v=0;v

visited[v]=FALSE; /* 置初值 */

InitQueue(&Q); /* 置空的辅助队列Q */

printf("按广度优先遍历图:\n");

for(v=0;v

if(!visited[v]) /* v尚未访问 */

{

visited[v]=TRUE; /* 设置访问标志为TRUE(已访问) */

Visit(G.vexs[v]);

EnQueue(&Q,v); /* v入队列 */

while(!QueueEmpty(Q)) /* 队列不空 */

{

DeQueue(&Q,&u); /* 队头元素出队并置为u */

strcpy(u1,*GetVex(G,u));

for(w=FirstAdjVex(G,u1);w>=0;w=NextAdjVex(G,u1,strcpy(w1,*GetVex(G,w))))

if(!visited[w]) /* w为u的尚未访问的邻接顶点的序号 */

{

visited[w]=TRUE;

Visit(G.vexs[w]);

EnQueue(&Q,w);

}

}

}

printf("\n");

}

Status InsertArc(MGraph &G,VertexType v,VertexType w)

{ /* 初始条件: 图G存在,v和W是G中两个顶点 */

/* 操作结果: 在G中增添弧,若G是无向的,则还增添对称弧 */ int i,l,v1,w1;

char *info,s[MAX_INFO];

v1=LocateVex(G,v); /* 尾 */

w1=LocateVex(G,w); /* 头 */

if(v1<0||w1<0)

return ERROR;

G.arcnum++; /* 弧或边数加1 */

G.arcs[v1][w1].adj=1;

printf("是否有该弧或边的相关信息(0:无 1:有): ");

scanf("%d%*c",&i);

if(i)

{

printf("请输入该弧或边的相关信息(<%d个字符):",MAX_INFO);

gets(s);

l=strlen(s);

if(l)

{

info=(char*)malloc((l+1)*sizeof(char));

strcpy(info,s);

G.arcs[v1][w1].info=info;

}

}

G.arcs[w1][v1].adj=G.arcs[v1][w1].adj;

G.arcs[w1][v1].info=G.arcs[v1][w1].info; /* 指向同一个相关信息 */

return OK;

}

void Display(MGraph G)

{ /* 输出邻接矩阵G */

int i,j;

char s[7],s1[3];

switch(G.kind)

{

case DG: strcpy(s,"有向图\0");

strcpy(s1,"弧\0");

break;

case DN: strcpy(s,"有向网\0");

strcpy(s1,"弧\0");

break;

case AG: strcpy(s,"无向图\0");

strcpy(s1,"边\0");

break;

case AN: strcpy(s,"无向网\0");

strcpy(s1,"边\0");

}

printf("%d个顶点%d条%s的%s\n",G.vexnum,G.arcnum,s1,s);

for(i=0;i

printf("G.vexs[%d]=%s\n",i,G.vexs[i]);

printf("G.arcs.adj:\n"); /* 输出G.arcs.adj */

for(i=0;i

{

for(j=0;j

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

printf("\n");

}

printf("https://www.360docs.net/doc/d216231745.html,:\n"); /* 输出https://www.360docs.net/doc/d216231745.html, */

printf("顶点1(弧尾) 顶点2(弧头) 该%s信息:\n",s1);

for(i=0;i

for(j=i+1;j

if(G.arcs[i][j].info)

printf("%5s %11s %s\n",G.vexs[i],G.vexs[j],G.arcs[i][j].info); }

void main()

{

char ch;

VertexType va,vb;

MGraph G;

CreateAG(G);

Display(G);

printf("\n");

BFSTraverse(G);

printf("\n");

printf("请输入要插入的弧所连接的顶点:");

scanf("%s",va);

scanf("%s",vb);

//ch=getchar();

InsertArc(G,va,vb);

Display(G);

printf("\n");

BFSTraverse(G);

}

二)建立一个有向图+遍历+插入+删除

(1)以邻接表作为图的存储结构,从键盘输入图的顶点与弧的信息建立一个有向图;

(2)对(1)中生成的有向图进行深度优先遍历并打印结果;

(3)在(1)中生成的有向图中,分别插入与删除一条弧并打印其结果;

(4)在(1)中生成的有向图中,分别插入与删除一个顶点并打印结果;

(5) 在(1)中生成的有向图中,各顶点的入度与出度并打印结果;

#include

#include

#include

#include

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define OVERFLOW -2

#define MAX_VERTEX_NUM 20

#define MAX_NAME 5 /* 顶点字符串的最大长度+1 */

typedef int Boolean;

Boolean visited[MAX_VERTEX_NUM]; /* 访问标志数组(全局量) */

typedef int Status;

typedef int VRType;

typedef char InfoType;

typedef char VertexType[MAX_NAME];

typedef enum{DG,DN,AG,AN}GraphKind; /* {有向图,有向网,无向图,无向网} */ typedef struct ArcNode

{

int adjvex; /* 该弧所指向的顶点的位置 */

struct ArcNode *nextarc; /* 指向下一条弧的指针 */

InfoType *info; /* 网的权值指针) */

}ArcNode;

typedef struct

{

VertexType data; /* 顶点信息 */

ArcNode *firstarc; /* 第一个表结点的地址,指向第一条依附该顶点的弧的指针 */ }VNode,AdjList[MAX_VERTEX_NUM]; /* 头结点 */

typedef struct

{

AdjList vertices;

int vexnum,arcnum; /* 图的当前顶点数和弧数 */

int kind; /* 图的种类标志 */

}ALGraph;

int LocateVex(ALGraph G,VertexType u)

{ /* 初始条件: 图G存在,u和G中顶点有相同特征 */

/* 操作结果: 若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 */ int i;

for(i=0;i

if(strcmp(u,G.vertices[i].data)==0)

return i;

return -1;

}

Status CreateGraph(ALGraph &G)

{ /* 采用邻接表存储结构,构造没有相关信息的有向图G*/

int i,j,k;

VertexType va,vb;

ArcNode *p;

G.kind=0;

printf("请输入图的顶点数,边数: ");

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

printf("请输入%d个顶点的值(<%d个字符):\n",G.vexnum,MAX_NAME);

for(i=0;i

{

scanf("%s",G.vertices[i].data);

G.vertices[i].firstarc=NULL;

}

printf("请顺序输入每条弧(边)的弧尾和弧头(以空格作为间隔):\n");

for(k=0;k

{

scanf("%s%s",va,vb);

i=LocateVex(G,va); /* 弧尾 */

j=LocateVex(G,vb); /* 弧头 */

p=(ArcNode*)malloc(sizeof(ArcNode));

p->adjvex=j;

p->info=NULL;

if(G.vertices[i].firstarc==NULL)

{

p->nextarc=G.vertices[i].firstarc; /* 插在表头 */

G.vertices[i].firstarc=p;

}

else

{

p->nextarc=G.vertices[i].firstarc->nextarc;

G.vertices[i].firstarc->nextarc=p;

}

if(k

printf("请输入下一条弧的弧尾和弧头(以空格作为间隔):\n");

}

return OK;

}

VertexType* GetVex(ALGraph G,int v)

{ /* 初始条件: 图G存在,v是G中某个顶点的序号。操作结果: 返回v的值 */ if(v>=G.vexnum||v<0)

exit(ERROR);

return &G.vertices[v].data;

}

int FirstAdjVex(ALGraph G,VertexType v)

{ /* 初始条件: 图G存在,v是G中某个顶点 */

/* 操作结果: 返回v的第一个邻接顶点的序号。若顶点在G中没有邻接顶点,则返回-1 */ ArcNode *p;

int v1;

v1=LocateVex(G,v); /* v1为顶点v在图G中的序号 */

p=G.vertices[v1].firstarc;

if(p)

return p->adjvex;

else

return -1;

}

int NextAdjVex(ALGraph G,VertexType v,VertexType w)

{ /* 初始条件: 图G存在,v是G中某个顶点,w是v的邻接顶点 */

/* 操作结果: 返回v的(相对于w的)下一个邻接顶点的序号。 */

/* 若w是v的最后一个邻接点,则返回-1 */

ArcNode *p;

int v1,w1;

v1=LocateVex(G,v); /* v1为顶点v在图G中的序号 */

w1=LocateVex(G,w); /* w1为顶点w在图G中的序号 */

p=G.vertices[v1].firstarc;

while(p&&p->adjvex!=w1) /* 指针p不空且所指表结点不是w */

p=p->nextarc;

if(!p||!p->nextarc) /* 没找到w或w是最后一个邻接点 */

return -1;

else /* p->adjvex==w */

return p->nextarc->adjvex; /* 返回v的(相对于w的)下一个邻接顶点的序号 */ }

void VisitFunc(VertexType v)

{

printf("%s ",v);

}

void DFS(ALGraph G,int v)

{ /* 从第v个顶点出发递归地深度优先遍历图G */

int w;

VertexType v1,w1;

strcpy(v1,*GetVex(G,v));

visited[v]=TRUE; /* 设置访问标志为TRUE(已访问) */

VisitFunc(G.vertices[v].data); /* 访问第v个顶点 */

for(w=FirstAdjVex(G,v1);w>=0;w=NextAdjVex(G,v1,strcpy(w1,*GetVex(G,w)))) if(!visited[w])

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

}

void DFSTraverse(ALGraph G)

{ /* 对图G作深度优先遍历。算法7.4 */

printf("深度优先遍历图:\n");

int v;

for(v=0;v

visited[v]=FALSE; /* 访问标志数组初始化 */

for(v=0;v

if(!visited[v])

DFS(G,v); /* 对尚未访问的顶点调用DFS */

printf("\n");

}

Status InsertArc(ALGraph &G,VertexType v,VertexType w)

{ /* 初始条件: 图G存在,v和w是G中两个顶点 */

/* 操作结果: 在G中增添弧,若G是无向的,则还增添对称弧 */ ArcNode *p;

int i,j;

i=LocateVex(G,v); /* 弧尾或边的序号 */

j=LocateVex(G,w); /* 弧头或边的序号 */

if(i<0||j<0)

return ERROR;

G.arcnum++; /* 图G的弧或边的数目加1 */

p=(ArcNode*)malloc(sizeof(ArcNode));

p->adjvex=j;

p->info=NULL;

if(G.vertices[i].firstarc==NULL)

{

p->nextarc=G.vertices[i].firstarc; /* 插在表头 */

G.vertices[i].firstarc=p;

}

else

{

p->nextarc=G.vertices[i].firstarc->nextarc;

G.vertices[i].firstarc->nextarc=p;

}

return OK;

}

Status DeleteArc(ALGraph &G,VertexType v,VertexType w)

{ /* 初始条件: 图G存在,v和w是G中两个顶点 */

/* 操作结果: 在G中删除弧,若G是无向的,则还删除对称弧 */ ArcNode *p,*q;

int i,j;

i=LocateVex(G,v); /* i是顶点v(弧尾)的序号 */

j=LocateVex(G,w); /* j是顶点w(弧头)的序号 */

if(i<0||j<0||i==j)

return ERROR;

p=G.vertices[i].firstarc; /* p指向顶点v的第一条出弧 */

while(p&&p->adjvex!=j) /* p不空且所指之弧不是待删除弧 */

{ /* p指向下一条弧 */

q=p;

p=p->nextarc;

}

if(p&&p->adjvex==j) /* 找到弧 */

{

if(p==G.vertices[i].firstarc) /* p所指是第1条弧 */

G.vertices[i].firstarc=p->nextarc; /* 指向下一条弧 */

else

q->nextarc=p->nextarc; /* 指向下一条弧 */

free(p); /* 释放此结点 */

G.arcnum--; /* 弧或边数减1 */

}

return OK;

}

void InsertVex(ALGraph &G,VertexType v)

{ /* 初始条件: 图G存在,v和图中顶点有相同特征 */

/* 操作结果: 在图G中增添新顶点v(不增添与顶点相关的弧,留待InsertArc()去做) */ strcpy(G.vertices[G.vexnum].data,v); /* 构造新顶点向量 */

G.vertices[G.vexnum].firstarc=NULL;

G.vexnum++; /* 图G的顶点数加1 */

}

Status DeleteVex(ALGraph &G,VertexType v)

{ /* 初始条件: 图G存在,v是G中某个顶点 */

/* 操作结果: 删除G中顶点v及其相关的弧 */

int i,j;

ArcNode *p,*q;

j=LocateVex(G,v); /* j是顶点v的序号 */

if(j<0) /* v不是图G的顶点 */

return ERROR;

p=G.vertices[j].firstarc; /* 删除以v为出度的弧或边 */

while(p)

{

q=p;

p=p->nextarc;

free(q);

G.arcnum--; /* 弧或边数减1 */

}

G.vexnum--; /* 顶点数减1 */

for(i=j;i

G.vertices[i]=G.vertices[i+1];

for(i=0;i

{

p=G.vertices[i].firstarc; /* 指向第1条弧或边 */

while(p) /* 有弧 */

{

if(p->adjvex==j)

{

if(p==G.vertices[i].firstarc) /* 待删结点是第1个结点 */

{

G.vertices[i].firstarc=p->nextarc;

free(p);

p=G.vertices[i].firstarc;

G.arcnum--; /* 弧或边数减1 */

}

else

{

q->nextarc=p->nextarc;

free(p);

p=q->nextarc;

G.arcnum--; /* 弧或边数减1 */

}

}

else

{

if(p->adjvex>j)

p->adjvex--; /* 修改表结点的顶点位置值(序号) */

q=p;

p=p->nextarc;

}

}

}

return OK;

}

Status CountDegree(ALGraph &G)

{ /*计算各顶点的入度和出度*/

int i,j,in[20],out[20];

ArcNode *p;

for(i=0;i

in[i]=out[i]=0;

i=0;

while(i

{

if(G.vertices[i].firstarc!=NULL)

{

out[i]++;

j=G.vertices[i].firstarc->adjvex;

in[j]++;

p=G.vertices[i].firstarc->nextarc;

while(p!=NULL)

{

out[i]++;

j=p->adjvex;

p=p->nextarc;

in[j]++;

}

}

i++;

}

printf("各个结点的入度为:\n");

for(i=0;i

printf("%d ",in[i]);

printf("\n");

printf("各个结点的出度为:\n");

for(i=0;i

printf("%d ",out[i]);

return OK;

}

void main()

{

VertexType v,w;

ALGraph G;

CreateGraph(G);

DFSTraverse(G);

printf("请输入要插入的弧所要连接的两个结点:\n");

scanf("%s%s",&v,&w);

InsertArc(G,v,w);

DFSTraverse(G);

printf("请输入要删除的弧所要连接的两个结点:\n");

scanf("%s%s",&v,&w);

DeleteArc(G,v,w);

DFSTraverse(G);

printf("请输入要插入的结点:");

scanf("%s",&v);

InsertVex(G,v);

printf("请输入该结点要连接的结点:");

scanf("%s",&w);

InsertArc(G,w,v);

DFSTraverse(G);

printf("请输入要删除的结点:");

scanf("%s",&v);

DeleteVex(G,v);

DFSTraverse(G);

CountDegree(G);

printf("\n");

}

数据结构上机实验报告

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

学号: 教师:饶鲜日期:

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

数据结构实验报告

数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include #include #include #include "Stack.h"//栈的头文件,没有用上 typedefintElemType; //数据类型 typedefint Status; //返回值类型 //定义二叉树结构 typedefstructBiTNode{ ElemType data; //数据域 structBiTNode *lChild, *rChild;//左右子树域 }BiTNode, *BiTree; intInsertBST(BiTree&T,int key){//插入二叉树函数 if(T==NULL) { T = (BiTree)malloc(sizeof(BiTNode)); T->data=key; T->lChild=T->rChild=NULL; return 1; } else if(keydata){ InsertBST(T->lChild,key); } else if(key>T->data){ InsertBST(T->rChild,key); } else return 0; } BiTreeCreateBST(int a[],int n){//创建二叉树函数 BiTreebst=NULL; inti=0; while(i

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 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.1顺序线性表的基本操作 #include #include #define OK 1 #define ERROR 0 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define ElemType int typedef struct { int *elem,length,listsize; }SqList; int InitList_Sq(SqList &L) { L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); L.length=0; L.listsize=LIST_INIT_SIZE; return OK; } int Load_Sq(SqList &L) { int i; if(L.length==0) printf("The List is empty!"); else { printf("The List is:"); for(i=0;iL.length+1) return ERROR; ElemType *newbase,*q,*p; if(L.length>=L.listsize)

{ newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*size of(ElemType)); L.elem=newbase; L.listsize+=LISTINCREMENT; } q=&(L.elem[i-1]); for(p=&(L.elem[L.length-1]);p>=q;--p) *(p+1)=*p; *q=e; ++L.length; return OK; } int ListDelete_Sq(SqList &L,int i,int &e) { ElemType *q,*p; if(i<1||i>L.length) return ERROR; p=&(L.elem[i-1]); e=*p; q=L.elem+L.length-1; for(++p;p<=q;p++) *(p-1)=*p; L.length--; return OK; } int main() { SqList T; int a,i; ElemType e,x; if(InitList_Sq(T)) { printf("A Sequence List Has Created.\n"); } while(1) { printf("1:Insert element\n2:Delete element\n3:Load all elements\n0:Exit\nPlease choose:\n"); scanf("%d",&a); switch(a)

数据结构实验十一:图实验

一,实验题目 实验十一:图实验 采用邻接表存储有向图,设计算法判断任意两个顶点间手否存在路径。 二,问题分析 本程序要求采用邻接表存储有向图,设计算法判断任意两个顶点间手否存在路径,完成这些操作需要解决的关键问题是:用邻接表的形式存储有向图并输出该邻接表。用一个函数实现判断任意两点间是否存在路径。 1,数据的输入形式和输入值的范围:输入的图的结点均为整型。 2,结果的输出形式:输出的是两结点间是否存在路径的情况。 3,测试数据:输入的图的结点个数为:4 输入的图的边得个数为:3 边的信息为:1 2,2 3,3 1 三,概要设计 (1)为了实现上述程序的功能,需要: A,用邻接表的方式构建图 B,深度优先遍历该图的结点 C,判断任意两结点间是否存在路径 (2)本程序包含6个函数: a,主函数main() b,用邻接表建立图函数create_adjlistgraph() c,深度优先搜索遍历函数dfs() d,初始化遍历数组并判断有无通路函数dfs_trave() e,输出邻接表函数print() f,释放邻接表结点空间函数freealgraph() 各函数间关系如右图所示: 四,详细设计 (1)邻接表中的结点类型定义:

typedef struct arcnode{ int adjvex; arcnode *nextarc; }arcnode; (2)邻接表中头结点的类型定义: typedef struct{ char vexdata; arcnode *firstarc; }adjlist; (3)邻接表类型定义: typedef struct{ adjlist vextices[max]; int vexnum,arcnum; }algraph; (4)深度优先搜索遍历函数伪代码: int dfs(algraph *alg,int i,int n){ arcnode *p; visited[i]=1; p=alg->vextices[i].firstarc; while(p!=NULL) { if(visited[p->adjvex]==0){ if(p->adjvex==n) {flag=1; } dfs(alg,p->adjvex,n); if(flag==1) return 1; } p=p->nextarc; } return 0; } (5)初始化遍历数组并判断有无通路函数伪代码: void dfs_trave(algraph *alg,int x,int y){ int i; for(i=0;i<=alg->vexnum;i++) visited[i]=0; dfs(alg,x,y); } 五,源代码 #include "stdio.h" #include "stdlib.h" #include "malloc.h" #define max 100 typedef struct arcnode{ //定义邻接表中的结点类型 int adjvex; //定点信息 arcnode *nextarc; //指向下一个结点的指针nextarc }arcnode; typedef struct{ //定义邻接表中头结点的类型 char vexdata; //头结点的序号 arcnode *firstarc; //定义一个arcnode型指针指向头结点所对应的下一个结点}adjlist; typedef struct{ //定义邻接表类型 adjlist vextices[max]; //定义表头结点数组

数据结构上机实验报告

数据结构实验报告 一.顺序表 要求:实现顺序表的初始化、在指定位置插入和删除元素。 算法思路:线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。顺序表的初始化操作就是为顺序表分配一个预定义大小的空间,并将线性表的当前长度设为“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;

数据结构实验---图的储存与遍历

数据结构实验---图的储存与遍历

学号: 姓名: 实验日期: 2016.1.7 实验名称: 图的存贮与遍历 一、实验目的 掌握图这种复杂的非线性结构的邻接矩阵和邻接表的存储表示,以及在此两种常用存储方式下深度优先遍历(DFS)和广度优先遍历(BFS)操作的实现。 二、实验内容与实验步骤 题目1:对以邻接矩阵为存储结构的图进行DFS 和BFS 遍历 问题描述:以邻接矩阵为图的存储结构,实现图的DFS 和BFS 遍历。 基本要求:建立一个图的邻接矩阵表示,输出顶点的一种DFS 和BFS 序列。 测试数据:如图所示 题目2:对以邻接表为存储结构的图进行DFS 和BFS 遍历 问题描述:以邻接表为图的存储结构,实现图的DFS 和BFS 遍历。 基本要求:建立一个图的邻接表存贮,输出顶点的一种DFS 和BFS 序列。 测试数据:如图所示 V0 V1 V2 V3 V4 三、附录: 在此贴上调试好的程序。 #include #include #include V0 V1 V4 V3 V2 ??? ? ??? ? ????????=010000000101010 1000100010A 1 0 1 0 3 3 4

#define M 100 typedef struct node { char vex[M][2]; int edge[M ][ M ]; int n,e; }Graph; int visited[M]; Graph *Create_Graph() { Graph *GA; int i,j,k,w; GA=(Graph*)malloc(sizeof(Graph)); printf ("请输入矩阵的顶点数和边数(用逗号隔开):\n"); scanf("%d,%d",&GA->n,&GA->e); printf ("请输入矩阵顶点信息:\n"); for(i = 0;in;i++) scanf("%s",&(GA->vex[i][0]),&(GA->vex[i][1])); for (i = 0;in;i++) for (j = 0;jn;j++) GA->edge[i][j] = 0; for (k = 0;ke;k++) { printf ("请输入第%d条边的顶点位置(i,j)和权值(用逗号隔开):",k+1); scanf ("%d,%d,%d",&i,&j,&w); GA->edge[i][j] = w; } return(GA); } void dfs(Graph *GA, int v) { int i; printf("%c%c\n",GA->vex[v][0],GA->vex[v][1]); visited[v]=1;

数据结构实验四

数据结构实验报告 第四次实验 一、实验目的 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)

数据结构实验一 实验报告

班级::学号: 实验一线性表的基本操作 一、实验目的 1、掌握线性表的定义; 2、掌握线性表的基本操作,如建立、查找、插入和删除等。 二、实验容 定义一个包含学生信息(学号,,成绩)的顺序表和链表(二选一),使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息; (2) 逐个显示学生表中所有学生的相关信息; (3) 根据进行查找,返回此学生的学号和成绩; (4) 根据指定的位置可返回相应的学生信息(学号,,成绩); (5) 给定一个学生信息,插入到表中指定的位置; (6) 删除指定位置的学生记录; (7) 统计表中学生个数。 三、实验环境 Visual C++ 四、程序分析与实验结果 #include #include #include #include #define OK 1 #define ERROR 0 #define OVERFLOW -2

typedef int Status; // 定义函数返回值类型 typedef struct { char num[10]; // 学号 char name[20]; // double grade; // 成绩 }student; typedef student ElemType; typedef struct LNode { ElemType data; // 数据域 struct LNode *next; //指针域 }LNode,*LinkList; Status InitList(LinkList &L) // 构造空链表L { L=(struct LNode*)malloc(sizeof(struct LNode)); L->next=NULL; return OK;

数据结构实验报告图实验

邻接矩阵的实现 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; } }

经典数据结构上机题_答案解析

数据结构上机实验题目 实验一线性表的顺序存储结构 实验学时 2学时 背景知识:顺序表的插入、删除及应用。 目的要求: 1.掌握顺序存储结构的特点。 2.掌握顺序存储结构的常见算法。 实验容 1.输入一组整型元素序列,建立顺序表。 2.实现该顺序表的遍历。 3.在该顺序表中进行顺序查找某一元素,查找成功返回1,否则返回0。4.判断该顺序表中元素是否对称,对称返回1,否则返回0。 5.实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。 6.输入整型元素序列利用有序表插入算法建立一个有序表。 7.利用算法6建立两个非递减有序表并把它们合并成一个非递减有序表。 8. 利用该顺序结构实现循环队列的入队、出队操作。 8.编写一个主函数,调试上述算法。 #include #include

#define OVERFLOW 0 #define MAXSIZE 100 typedef int ElemType; typedef struct list {ElemType elem[MAXSIZE]; int length; }Sqlist; void Creatlist(Sqlist &L) {int i; printf("请输入顺序表的长度:"); //输入一组整型元素序列,建立一个顺序表。 scanf("%d",&L.length); for(i=0;i

数据结构上机实验指导

《数据结构》课程上机实验指导书 实验一 【实验名称】顺序表的基本算法 【实验目的】 创建一个顺序表,掌握线性表顺序存储的特点。设计和验证顺序表的查找、插入、删除算法。 【实验要求】 (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 (C语言补充实验) 有顺序表A和B,其元素值均按从小到大的升序排列,要求将它们合并成一 个顺序表C,且C的元素也是从小到大的升序排列。 #include main() { intn,m,i=0,j=0,k=0,a[5],b[5],c[10];/* 必须设个m做为数组的输入的计数器,不能用i ,不然进行到while 时i 直接为5*/ for(m=0;m<=4;m++)scanf("%d",&a[m]);// 输入数组a for(m=0;m<=4;m++)scanf("%d",&b[m]);// 输入数组b while(i<5&&j<5) {if(a[i]b[j]){c[k]=b[j];k++;j++;} else{c[k]=a[i];k++;i++;j++;}// 使输入的两组数组中相同的数只输出一 个 } if(i<5) for(n=i;n<5;n++) {c[k]=a[n];k++;} elseif(j<5) for(n=j;n<5;n++) {c[k]=b[n];k++;} for(i=0;i

求A QB #include main() { inti,j,k=0,a[5],b[5],c[5];//A=a[5],B=b[5],A n B=c[5] for(i=0;i<5;i++)scanf("%d",&a[i]);// 输入a 数组 for(i=0;i<5;i++)scanf("%d",&b[i]);〃输入b 数组 for(i=0;i<5;i++) {for(j=0;j<5;j++) if(a[i]==b[j]){c[k]=a[i];k++;}// 当有元素重复时,只取一个放入 c 中} for(i=0;i #defineN4 main() { inti,j,m,k,a[N+1];//k 为最后输出数组的长度变量

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

数据结构与算法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; } } } }

数据结构上机实验答案

《数据结构实验指导书》答案 实验一: 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

大数据结构实验四题目一排序实验报告材料

数据结构实验报告 实验名称:实验四——排序 学生姓名:XX 班级: 班内序号: 学号: 日期: 1.实验要求 实验目的: 通过选择实验内容中的两个题目之一,学习、实现、对比、各种排序的算法,掌握各种排序算法的优劣,以及各种算法使用的情况。 题目1: 使用简单数组实现下面各种排序算法,并进行比较。 排序算法如下: 1、插入排序; 2、希尔排序; 3、冒泡排序; 4、快速排序; 5、简单选择排序; 6、堆排序; 7、归并排序; 8、基数排序(选作); 9、其他。 具体要求如下: 1、测试数据分成三类:正序、逆序、随机数据。 2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关 键字交换记为3次移动)。 3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微妙。 4、对2和3的结果进行分析,验证上述各种算法的时间复杂度。 5、编写main()函数测试各种排序算法的正确性。 2. 程序分析 2.1 存储结构

存储结构:数组 2.2 关键算法分析 一、关键算法: 1、插入排序 a、取排序的第二个数据与前一个比较 b、若比前一个小,则赋值给哨兵 c、从后向前比较,将其插入在比其小的元素后 d、循环排序 2、希尔排序 a、将数组分成两份 b、将第一份数组的元素与哨兵比较 c、若其大与哨兵,其值赋给哨兵 d、哨兵与第二份数组元素比较,将较大的值赋给第二份数组 e、循环进行数组拆分 3、对数据进行编码 a、取数组元素与下一个元素比较 b、若比下一个元素大,则与其交换 c、后移,重复 d、改变总元素值,并重复上述代码 4、快速排序 a、选取标准值 b、比较高低指针指向元素,若指针保持前后顺序,且后指针元素大于标准值,后 指针前移,重新比较 c、否则后面元素赋给前面元素 d、若后指针元素小于标准值,前指针后移,重新比较 e、否则前面元素赋给后面元素 5、简单选择排序 a、从数组中选择出最小元素 b、若不为当前元素,则交换 c、后移将当前元素设为下一个元素 6、堆排序 a、生成小顶堆 b、将堆的根节点移至数组的最后 c、去掉已做过根节点的元素继续生成小顶堆

数据结构(第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 )

相关文档
最新文档