用邻接表实现图的遍历

#include<stdio.h>node

#include<stdlib.h>数组

#define Max 20 //设定图的最大顶点数指针

typedef char vertexType; //定义顶点的类型code

//typedef int edgeType;//定义边上的权重类型索引

#define edgeType int队列

//定义边的结构体内存

typedef struct EdgeNode_g {element

int adjVex;//存储邻接点的顶点下标,指的是数组的下标

edgeType weight;//存储边上的权值

struct EdgeNode_g *next; //指向下一个邻接点

}EdgeNode;get

//定义顶点的结构体it

typedef struct VerTex_g {

vertexType data;//存储顶点的信息

EdgeNode *firstNode;

}HeadList;

//定义图的相关结构体

typedef struct Graph_g {

HeadList headList[Max];//定义头结点数组变量

int number_vertex;//定义顶点的个数

int number_edge;//定义边的个数

}Graph;

//建立图

void createGraph(Graph *p) {

int i;

int vertex;

printf("请输入顶点数:");

 scanf("%d", &vertex);
 
p->number_vertex = vertex;

printf("接下来进行输入顶点的相关信息\n");

char c;

for (i = 0; i < p->number_vertex; i++) {

	printf("请输入第%d个顶点的信息:", i);
	
	getchar();
	
	c=getchar();//过滤掉回车符
	
	p->headList[i].data = c;
	
	p->headList[i].firstNode = NULL;

}

int edge;

//edge1表示边1,edge2表示边2,w表示边上的权重

int edge1, edge2, w;

printf("接下来进行边的相关信息填充\n");

printf("请输入边的个数:");

scanf("%d", &edge);

p->number_edge = edge;

EdgeNode *e;

//注意我这里输入的顶点1,顶点2的值-1,表明顶点的索引

for (i = 0; i < p->number_edge; i++) {

	printf("输入顶点1,顶点2,权重w:");
	
	scanf("%d%d%d", &edge1, &edge2, &w);

	e = (EdgeNode *)malloc(sizeof(EdgeNode));
	
	e->adjVex = edge2 - 1;
	
	e->weight = w;
	
	e->next = p->headList[edge1-1].firstNode;
	
	p->headList[edge1-1].firstNode = e;

	e = (EdgeNode *)malloc(sizeof(EdgeNode));
	
	e->adjVex = edge1 - 1;
	
	e->weight = w;
	
	e->next = p->headList[edge2-1].firstNode;
	
	p->headList[edge2-1].firstNode = e;

}

}

void display(Graph *head) {

EdgeNode *temp;

for (int i = 0; i < head->number_vertex; i++) {

	temp = head->headList[i].firstNode;
	
	printf("%c", head->headList[i].data);
	
	//注意判断条件哈
	
	while (temp!= NULL) {
	
		printf("->%d",temp->adjVex);
		
		temp = temp->next;
	}
	
	printf("\n");
}

} //DFS遍历(用邻接表表示图)

//x表明顶点点所在的下标

bool visited[Max];

//若是图连通能够用这个就够啦

void DFS(Graph *head,int x) {

if (visited[x] != true) {

	printf("%3c", head->headList[x].data);
	
}

visited[x] = true;

int i;

EdgeNode *e = head->headList[x].firstNode;

while (e!=NULL)
{
	i = e->adjVex;
	
	if (visited[i] == false) {
		DFS(head, i);
	}
	e = e->next;
}

}

//若是图不连通,就须要再加上下面的

void DFS_extend(Graph *head) {

for (int i = 0; i < head->number_vertex; i++)

	DFS(head, i);

}

//定义队列的目的主要为了在广度优先遍历过程当中使用队列

//定义队列的相关实现

typedef int elementType;

typedef struct q_node {

elementType data;

q_node *next;

}Node;

typedef struct Link_Node {

struct q_node *rear;

struct q_node *front;

} L_node;

L_node* init1() {

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

if (p == NULL) {

	printf("内存满了\n");

	return NULL;
}

p->rear = p->front = NULL;


return p;

}

void push_queue(L_node *p, elementType x) {

//新建个节点存储数据 

Node *temp = (Node *)malloc(sizeof(Node));

if (temp == NULL)
{
	printf("内存满了\n");
	return;
}
temp->data = x;
temp->next = NULL;

//判断下队列是否无元素 

if (p->rear == NULL) {

	p->rear = temp;

	p->front = temp;

}

//若是非空,就把元素插入到队尾指针的后面 

p->rear->next = temp;

//要把队尾指针指向新建立的节点 

p->rear = temp;

} elementType pop_queue(L_node * p) {

Node * temp = p->front;

elementType value;

if (p->front == NULL) {

	printf("队列已经空了\n");

	return -1;
}
//判断下若是队列只有一个元素 

if (p->front == p->rear) {


	value = p->front->data;

		p->front = NULL;

	p->rear = NULL;

	free(temp);

	return value;
}
value = p->front->data;

p->front = temp->next;

free(temp);

return value;

} bool visited1[Max]; int reter[Max];

//若是图是连通的,这样就够了

void BFS(Graph *head,int x,L_node *queue) {

if (visited1[x] == false) {

	push_queue(queue, x);
	
	visited1[x] = true;
}

int t;

EdgeNode *e;

int j;

while (queue->front!=NULL)
{

	t = pop_queue(queue);
	
	printf("%3c", head->headList[t].data);
	
	e = head->headList[t].firstNode;
	
	while (e!= NULL) {
	
		j = e->adjVex;
		
		if (visited1[j] == false) {
		
			push_queue(queue, j);
			
			visited1[j] = true;
		}
		e = e->next;
	}
	

}

} //若是图不连通,就用下面的

void BFS_extend(Graph *g) { L_node * queue=init1(); for (int i = 0; i < g->number_vertex; i++) {

BFS(g, i,queue);
}

} int main() {

Graph head;

createGraph(&head);

display(&head);

DFS_extend(&head);

printf("\n");

BFS_extend(&head);

printf("\n");

system("pause");
return 0;

}

相关文章
相关标签/搜索