数据结构C语言版 无向图的邻接多重表存储表示和实现

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

数据结构C语言版无向图的邻接多重表存储表示和实现.txt只要你要,只要我有,你还外边转什么阿老实在我身边待着就行了。听我的就是,问那么多干嘛,我在你身边,你还走错路!跟着我!不能给你幸福是我的错,但谁让你不幸福,我TMD去砍了他/* 数据结构C语言版无向图的邻接多重表存储表示和实现

P166

编译环境:Dev-C++ 4.9.9.2

日期:2011年2月15日

*/

#include

#include

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

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

typedef char InfoType;

typedef char VertexType[MAX_NAME]; // 字符串类型

// AMLGraph.h 无向图的邻接多重表存储表示

#define MAX_VERTEX_NUM 20

typedef enum{unvisited,visited}VisitIf;

typedef struct EBox

{

VisitIf mark; // 访问标记

int ivex,jvex; // 该边依附的两个顶点的位置

struct EBox *ilink,*jlink; // 分别指向依附这两个顶点的下一条边

InfoType *info; // 该边信息指针

}EBox;

typedef struct

{

VertexType data;

EBox *firstedge; // 指向第一条依附该顶点的边

}VexBox;

typedef struct

{

VexBox adjmulist[MAX_VERTEX_NUM];

int vexnum,edgenum; // 无向图的当前顶点数和边数

}AMLGraph;

typedef int QElemType;

// 单链队列--队列的链式存储结构

typedef struct QNode

{

QElemType data; //数据域

struct QNode *next; //指针域

}QNode,*QueuePtr;

typedef struct

{

QueuePtr front,//队头指针,指针域指向队头元素

rear; //队尾指针,指向队尾元素

}LinkQueue;

// 若G中存在顶点u,则返回该顶点在无向图中位置;否则返回-1

int LocateVex(AMLGraph G,VertexType u)

{

int i;

for(i=0;i

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

return i;

return -1;

}

// 采用邻接多重表存储结构,构造无向图G

int CreateGraph(AMLGraph *G)

{

int i,j,k,l,IncInfo;

char s[MAX_INFO];

VertexType va,vb;

EBox *p;

printf("请输入无向图G的顶点数,边数,边是否含其它信息(是:1,否:0): ");

scanf("%d,%d,%d",&(*G).vexnum,&(*G).edgenum,&IncInfo);

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

for(i=0;i<(*G).vexnum;++i) // 构造顶点向量

{

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

(*G).adjmulist[i].firstedge=NULL;

}

printf("请顺序输入每条边的两个端点(以空格作为间隔):\n");

for(k=0;k<(*G).edgenum;++k) // 构造表结点链表

{

scanf("%s%s%*c",va,vb); // %*c吃掉回车符

i=LocateVex(*G,va); // 一端

j=LocateVex(*G,vb); // 另一端

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

p->mark=unvisited; // 设初值

p->ivex=i;

p->jvex=j;

p->info=NULL;

p->ilink=(*G).adjmulist[i].firstedge; // 插在表头

(*G).adjmulist[i].firstedge=p;

p->jlink=(*G).adjmulist[j].firstedge; // 插在表头

(*G).adjmulist[j].firstedge=p;

if(IncInfo) // 边有相关信息

{

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

gets(s);

l=strlen(s);

if(l)

{

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

strcpy(p->info,s);

}

}

}

return 1;

}

// 返回v的值

VertexType* GetVex(AMLGraph G,int v)

{

if(v>=G.vexnum||v<0)

exit(0);

return &G.adjmulist[v].data;

}

// 对v赋新值value

int PutVex(AMLGraph *G,VertexType v,VertexType value)

{

int i;

i=LocateVex(*G,v);

if(i<0) // v不是G的顶点

return 0;

相关文档
最新文档