关于图的存储结构,可以参考:http://blog.csdn.net/gongda2014306/article/details/51891637
下面是邻接表的实现方式:
//图的邻接表存储C语言实现
//2016.7.12
//author:xukeyi
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#define MAXV 10
//边节点结构
typedef struct _EdgeNode{
int adjvex;
int weight;
struct EdgeNode *next;
}EdgeNode;
//表头节点结构(顶点表)
typedef struct _VertexNode{
char data; //顶点对应的名称或其他信息
EdgeNode *firstEdgeNode; // 对应顶点的链表中第一个边节点
}VertexNode;
typedef VertexNode AdjList[MAXV]; //AdjList是邻接表类型,AdjList类型就代表VertexNode[MAXV]
//完整的图-邻接表类型
typedef struct _Graph{
AdjList adjList;
int vertex_num;
int edge_num;
}Graph;
//取某一顶点的坐标
int GetLocationGraph(Graph *graph,char ver){
int i;
for(i=0;i<graph->vertex_num;i++){
if(graph->adjList[i].data==ver){
return i;
}
}
}
//创建图(不带权值),无向
void CreateGraph(Graph *graph){
int i,j,v1,v2;
char ch1,ch2;
EdgeNode *nodeList1,*nodeList2;
printf("请输入图的顶点数与边数:\n");
scanf("%d%d",&graph->vertex_num,&graph->edge_num);
printf("The vertex_num and edge_num are : %d %d\n",graph->vertex_num,graph->edge_num);
printf("请输入顶点编号:\n");
while((ch1=getchar())=='\n'){
continue;
}
//初始化顶点
for(i=0;i<graph->vertex_num;i++){
if(ch1!='\n'){
graph->adjList[i].data=ch1;
graph->adjList[i].firstEdgeNode=NULL;
ch1=getchar();
}
}
//输入图中边的信息(以下代码不含权值),格式:abae,代表ab边和ae边
printf("请输入边信息:\n");
for(j=0;j<graph->edge_num;j++){
ch1=getchar();
ch2=getchar();
v1=GetLocationGraph(graph,ch1);
v2=GetLocationGraph(graph,ch2);
if(v1==v2){
return;
}
//使用单链表的头插法
nodeList1=(EdgeNode*)malloc(sizeof(EdgeNode));
if(nodeList1==NULL){
return;
}
nodeList1->adjvex=v2;
nodeList1->next=graph->adjList[v1].firstEdgeNode;
graph->adjList[v1].firstEdgeNode=nodeList1;
//如果构建有向图,则下面代码需要注释掉
nodeList2=(EdgeNode*)malloc(sizeof(EdgeNode));
if(nodeList2==NULL){
return;
}
nodeList2->adjvex=v1;
nodeList2->next=graph->adjList[v2].firstEdgeNode;
graph->adjList[v2].firstEdgeNode=nodeList2;
}
}
//打印图的顶点信息,以及每个顶点的边节点
void PrintfGraph(Graph *graph){
Graph *pnew;
int k;
pnew=graph;
int i;
//打印图的顶点编号
for(i=0;i<pnew->vertex_num;i++){
printf(" %c ",pnew->adjList[i].data);
}
printf("\n");
//打印图中每个顶点本身及其边节点
for(i=0;i<pnew->vertex_num;i++){
printf(" %c ",pnew->adjList[i].data);
while(pnew->adjList[i].firstEdgeNode!=NULL){
k=pnew->adjList[i].firstEdgeNode->adjvex;
printf(" %c ",pnew->adjList[k].data);
pnew->adjList[i].firstEdgeNode=pnew->adjList[i].firstEdgeNode->next;
}
printf("\n");
}
}
int main(int argc, char *argv[]) {
Graph *graph;
graph=(Graph*)malloc(sizeof(Graph));
CreateGraph(graph);
PrintfGraph(graph);
return 0;
}