用鄰接表實現圖的遍歷

#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;

}

相關文章
相關標籤/搜索