数据结构实验———图实验报告

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

数据结构

目的要求

1.掌握图的存储思想及其存储实现。

2.掌握图的深度、广度优先遍历算法思想及其程序实现。

3.掌握图的常见应用算法的思想及其程序实现。

实验容

1.键盘输入数据,建立一个有向图的邻接表。

2.输出该邻接表。

3.在有向图的邻接表的基础上计算各顶点的度,并输出。

4.以有向图的邻接表为基础实现输出它的拓扑排序序列。

5.采用邻接表存储实现无向图的深度优先递归遍历。

6.采用邻接表存储实现无向图的广度优先遍历。

7.在主函数中设计一个简单的菜单,分别调试上述算法。源程序:

主程序的头文件:队列

#include

#include

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef int QElemT ype;

typedef struct QNode{ //队的操作

QElemT ype data;

struct QNode *next;

}QNode,*QueuePtr;

typedef struct {

QueuePtr front;

QueuePtr rear;

}LinkQueue;

void InitQueue(LinkQueue &Q){ //初始化队列

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

if(!Q.front) exit(OVERFLOW); //存储分配失败

Q.front ->next =NULL;

}

int EnQueue(LinkQueue &Q,QElemT ype e) //插入元素e为Q的新的队尾元素

{

QueuePtr p;

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

if(!p) exit(OVERFLOW);

p->data=e;

p->next=NULL;

Q.rear->next=p;

Q.rear =p;

return OK;

}

int DeQueue(LinkQueue &Q,QElemT ype &e) //删除Q的队头元素,用e返回其值

{ if(Q.front ==Q.rear ) return ERROR;

QueuePtr p;

p=Q.front ->next;

e=p->data;

Q.front->next=p->next ;

if(Q.rear==p) Q.rear =Q.front ;

free(p);

return OK;

}

主程序:

#include

#include

#include"duilie.h"

#define TRUE 1

#define FALSE 0

#define Status int

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

#define VertexType char /*顶点元素类型*/

enum BOOlean {False,True};

BOOlean visited[MAX_VERTEX_NUM]; //全局变量——访问标志数组typedef struct ArcNode

{int adjvex;

struct ArcNode *nextarc;

int weight; /*边的权*/

}ArcNode; /*表结点*/

typedef struct VNode

{ int degree,indegree;/*顶点的度,入度*/

VertexType data;

ArcNode *firstarc;

}VNode/*头结点*/,AdjList[MAX_VERTEX_NUM];

typedef struct

{ AdjList vertices;

int vexnum,arcnum;/*顶点的实际数,边的实际数*/

}ALGraph;

//建立图的邻接表

void creat_link(ALGraph *G)

{ int i,j;

ArcNode *s;

printf("请依次输入顶点数、边数:");

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

for (i=0;ivexnum;i++)

{ G->vertices[i].data='A'+i;

G->vertices[i].firstarc=NULL;

}

for (i=0;ivexnum;)

{ printf("请输入顶点的数组坐标(若退出,请输入-1):");

scanf("%d",&i);

if(i==-1) break;

printf("请输入顶点所指向下一个顶点的数组坐标:");

scanf("%d",&j);

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

s->adjvex=j;

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

G->vertices[i].firstarc=s;

}

相关文档
最新文档