邻接表法创建无向图(C语言)

题目

本题要求建立一个无向图,采用邻接表做为存储结构。 例如:
邻接表法创建无向图(C语言)_第1张图片
输入信息为:第一行给出图的顶点数n和边数e。第二行给出n个字符,表示n个顶点的数据元素的值。后面是e行,给出每一条边的两个顶点编号。

输出每个顶点的值以及各顶点的邻接点。
输入样例

7 9
0123456
0 2
0 3
0 4
1 3
1 5
2 3
2 5
4 5
5 6

输出样例:

0: 4 3 2
1: 5 3
2: 5 3 0
3: 2 1 0
4: 5 0
5: 6 4 2 1
6: 5

无向图还要生成对称节点

#include 
#include 
#define MVNum 100                                 //最大顶点数 
typedef struct ArcNode{                		//表结点 
    int adjvex;                                    //邻接点的位置 
    struct ArcNode * nextarc;      //指向下一个表结点的指针 
}ArcNode; 

typedef struct VNode{ 
    char data;                    	            //顶点信息 
    ArcNode * firstarc;         //指向第一个表结点的指针 
}VNode, AdjList[MVNum];                 //AdjList表示邻接表类型 

typedef struct{ 
    AdjList vertices;              //头结点数组
    int vexnum, arcnum;     //图的当前顶点数和边数 
}ALGraph; 

void CreatMGraph(ALGraph *G);		/* 创建图 */
void printGraph(ALGraph G);			/*输出图 */

int main()
{
	ALGraph G;
	CreatMGraph(&G);
	printGraph(G);
	return 0;
}
void CreatMGraph(ALGraph *G)
{
	int i,j,k;
	ArcNode *s;
	scanf("%d%d",&G->vexnum,&G->arcnum); 	//输入总顶点数,总边数 
	getchar();
	for(i=0;i<G->vexnum;i++){   			//输入各点,构造表头节点表 
		scanf("%c", &G->vertices[i].data);  //输入顶点值 
	} 
	for(i=0;i<G->vexnum;i++){
		G->vertices[i].firstarc = NULL;   	//初始化表头节点的指针域为NULL 
	}
	for(k=0;k<G->arcnum;k++) {   			  //输入各边,构造邻接表  
		scanf("%d%d",&i,&j);    			  //输入一条边的两个节点 
		s=(ArcNode*)malloc(sizeof(ArcNode));  // 生成一个新节点 
		s->adjvex=j;
		s->nextarc=G->vertices[i].firstarc;  //头插法建立新节点 
		G->vertices[i].firstarc = s;
		s=(ArcNode*)malloc(sizeof(ArcNode)); //生成另一个对称的新的边节点 
		s->adjvex=i;
		s->nextarc=G->vertices[j].firstarc;
		G->vertices[j].firstarc = s;
	}
}
void printGraph(ALGraph G)
{
    int i,j;
	ArcNode *p;
	for(i=0;i<G.vexnum;i++){
		printf("%c:",G.vertices[i].data);
		for(p=G.vertices[i].firstarc;p;p=p->nextarc){
		printf(" %d",p->adjvex);
		}
		printf("\n");
	}
}

你可能感兴趣的:(数据结构,数据结构,c语言)