臨接矩陣實現圖的遍歷

#include<stdio.h>node

#include<stdlib.h>數組

#define Max 10指針

typedef int elementType;//注意這個,我爲了和隊列的保持一致,因此用了intcode

//定義圖頂點相關的內容blog

typedef struct Graph_g {隊列

//peek[]數組的類型能夠是字符,根據本身的喜歡定義內存

elementType peek[Max];

int number_vertex;//定義頂點個數

int nubmer_edge;//定義邊的個數

int G[Max][Max];//定義臨接矩陣

//定義是否被訪問的數組
bool c[Max];

}Graph,*Graph_matrax;element

//對圖進行初始化it

Graph_matrax init() {io

Graph_matrax  graph= (Graph_matrax)malloc(sizeof(Graph));

int vertex;

printf("請輸入頂點的個數:");

scanf("%d", &vertex);

graph->number_vertex = vertex;

graph->nubmer_edge = 0;

int i;

//對頂點的信息進行賦值

for (i = 0; i < vertex; i++)

{
	printf("請輸入%d個頂點的信息:",i+1);
	
	scanf("%d", &graph->peek[i]);

}


//臨接矩陣的對腳線賦值爲0,其餘的初始化爲最大值,假設全都不連通

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

	for (int j = 0; j < graph->number_vertex; j++)
	{
		if (i == j)
		
			graph->G[i][j] = 0;
			
		else
			graph->G[i][j] = 8888;
			
	}
}

int edge=0;

int v1, v2, w;

printf("請輸入邊的數目:");

scanf("%d", &edge);

for (i = 0; i < edge; i++) {

	printf("請輸入i,j,w,有關頂點的到頂點的邊的相關信息:");
	
	scanf("%d%d%d", &v1, &v2, &w);
	
	graph->G[v1 - 1][v2 - 1] = w;
	
	graph->G[v2 - 1][v1 - 1] = w;
}


return graph;

}

void display(Graph_matrax g) {

printf("輸出臨接矩陣:\n");

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

	for (int j = 0; j < g->number_vertex; j++)

	{
	
		printf("%8d", g->G[i][j]);

	}
	printf("\n");


}

}

//定義隊列的目的主要爲了在廣度優先遍歷過程當中使用隊列

//定義隊列的相關實現

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;

printf("初始化成功\n");

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;

}

void DFS(Graph_matrax g, int x) {

g->c[x-1] = true;

printf("%2d", g->peek[x - 1]);

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

	if (x - 1 != i)
	
		if (g->G[x - 1][i] == 1)
		
			if (g->c[i] != true)
			
				DFS(g, i+1);			
		
}

}

//使用隊列實現廣度優先遍歷

void BFS(Graph_matrax g, L_node *queue, int x) {

//原本想用 g->c[]這個的,但是不行,我在這把值置爲false沒起做用 //故新建了d[Max]

bool d[Max];

for (int i = 0; i < g->nubmer_edge; i++)

	d[i] = false;
	
//把該訪問過的頂點放置爲true

int j;

d[x - 1] = true;

printf("%2d", g->peek[x - 1]);

//把剛訪問的點壓入到棧中

push_queue(queue, g->peek[x - 1]);

//判斷隊列是否爲空,若是爲空,則說明廣度優先遍歷完成

while (queue->front!=NULL)

{
	j = pop_queue(queue);
	
	for (int i = 0; i < g->number_vertex; i++) {
	
		if(i!=j-1)
		
			if(g->G[j-1][i]==1)
			
			  if (d[i]!= true)
			  
			{
				d[i] = true;
				
				printf("%2d", g->peek[i]);
				
				push_queue(queue, g->peek[i]);
				
			}
	}

}

} int main() {

Graph *g = init();

printf("%d\n", g->number_vertex);

L_node *p = init1();

display(g);

DFS(g, 1);

printf("\n");

BFS(g, p, 1);

printf("\n");

system("pause");
return 0;

}

相關文章
相關標籤/搜索