无向图建立 邻接表(2)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
#define isLetter(a) ((((a)>='a') && ((a)<='z')) || (((a)>='A')&&((a)<='Z')))
#define LENGTH(a) (sizeof(a)/sizeof(a[0]))
#define TRUE 1
#define FALSE 0
#define bool int
bool visited[MAX];
typedef struct _ENode {
	int ivex; // 索引
	struct _ENode* next_edge;
}ENode,*PENode;
typedef struct _VNode {
	char data;  //顶点信息
	ENode *first_edge;//指向第一条依附于该顶点的弧
}VNode;
typedef struct _LGraph {
	VNode vex[MAX];
	int vexnum;
	int edgnum;
}LGraph;

static int get_position(LGraph g, char ch)
{
	int i;
	for (i = 0; i < g.vexnum; i++) {
		if (g.vex[i].data == ch) {
			return i;
		}
	}
	return -1;
}
static char read_char()
{
	char ch;
	do {
		ch = getchar();
	} while (!isLetter(ch));
	return ch;
}
static void link_last(ENode * list, ENode * node)
{
	while (list->next_edge != NULL) {
		list = list->next_edge;
	}
	list->next_edge = node;
}
LGraph* create_lgraph()
{
	char c1, c2;
	int v, e;
	int i, p1, p2;
	ENode* node1, *node2;
	LGraph* PG;
	//输入顶点数 边数
	printf("输入顶点数:\n");
	scanf("%d", &v);
	printf("输入边数:\n");
	scanf("%d", &e);
	if (v < 1 || e < 1 || e >(v*(v - 1))) {
		printf("error");
		return NULL;
	}
	if ((PG = (LGraph*)malloc(sizeof(LGraph))) == NULL)
		return NULL;
	memset(PG, 0, sizeof(LGraph));

	PG->vexnum = v;
	PG->edgnum = e;
	//初始化 邻接表 的顶点
	printf("输入顶点信息(输入后回车):\n\n");
	for (i = 0; i < PG->vexnum; i++) {
		printf("vertex(%d) :",i);
		PG->vex[i].first_edge = NULL;
		PG->vex[i].data = read_char();
	}
	//初始化 邻接表边
	printf("\n输入边信息:\n\n");
	for (i = 0; i < PG->edgnum; i++) {
		printf("edge (%d) ", i);
		c1 = read_char();
		c2 = read_char();
		if(c1 != c2){
		p1 = get_position(*PG, c1);
		p2 = get_position(*PG, c2);
			//初始化 node1;
		node1 = (ENode*)malloc(sizeof(ENode));
		node1->next_edge = NULL;
		node1->ivex = p2;
		if (PG->vex[p1].first_edge == NULL) {
			PG->vex[p1].first_edge = node1;
		}
		else
			link_last(PG->vex[p1].first_edge, node1);
			node2 = (ENode*)malloc(sizeof(ENode));
			node2->ivex = p1;
			node2->next_edge = NULL;
		if (PG->vex[p2].first_edge == NULL) {
			PG->vex[p2].first_edge = node2;
		}
		else
			link_last(PG->vex[p2].first_edge, node2);
		}
	}
	return PG;
}
void Print(LGraph pG)
{
	int i;
	ENode *P;
	for (i = 0; i < pG.vexnum; i++) {
		printf("Vertex %c:\n", pG.vex[i].data);
		P = pG.vex[i].first_edge;
		while (P != NULL) {
			printf("\t(%c,%c)", pG.vex[i].data, pG.vex[P->ivex].data);
			P = P->next_edge;
		}
		printf("\n");
	}
}
void DFS(LGraph g, int i)
{
	visited[i] = TRUE;
	printf("%c ", g.vex[i].data);
	ENode* p;
	p = g.vex[i].first_edge;
	while (p != NULL) {
		if (!visited[p->ivex])
			DFS(g, p->ivex);
		p = p->next_edge;
	}
}
void DFSTrv(LGraph g)
{
	int i;
	for (i = 0; i < g.vexnum; i++) {
		visited[i] = FALSE;
	}
	for (i = 0; i < g.vexnum; i++) {
		if (!visited[i]) {
			DFS(g, i);
		}
	}
}
int main()
{
	LGraph* pG;
	pG = create_lgraph();
	Print(*pG);
	printf("遍历各顶点:\n");
	DFSTrv(*pG);
	getchar();
	getchar();
	
	return 0;
}






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值