图的遍历的认知

 这里面加一个continue的理解,continue是退出这一个循环,break是退出整个循环。
break表示结束整个循环(break所在的最近的那个循环)
continue表示结束本次循环(continue所在的最近的那个循环)

#include <stdio.h>
#include <malloc.h>

#define QUEUE_SIZE 10

int* visitedPtr;

typedef struct GraphNodeQueue{  //图的队列
	int* nodes;
	int front;
	int rear;
}GraphNodeQueue, *QueuePtr;

QueuePtr initQueue(){  //队列的初始化嗷
	QueuePtr resultQueuePtr = (QueuePtr)malloc(sizeof(struct GraphNodeQueue));
	resultQueuePtr->nodes = (int*)malloc(QUEUE_SIZE * sizeof(int));  //申请空间嗷
	resultQueuePtr->front = 0;
	resultQueuePtr->rear = 1;
	return resultQueuePtr;
}

bool isQueueEmpty(QueuePtr paraQueuePtr){  // 判断队列是否为空
	if ((paraQueuePtr->front + 1) % QUEUE_SIZE == paraQueuePtr->rear) {
		return true;
	}

	return false;
}

void enqueue(QueuePtr paraQueuePtr, int paraNode){
	printf("front = %d, rear = %d.\r\n", paraQueuePtr->front, paraQueuePtr->rear);
	if ((paraQueuePtr->rear + 1) % QUEUE_SIZE == paraQueuePtr->front % QUEUE_SIZE) {
		printf("尝试插入%d,但队列已经满了.\r\n", paraNode);
		return;
	}
	paraQueuePtr->nodes[paraQueuePtr->rear] = paraNode;
	paraQueuePtr->rear = (paraQueuePtr->rear + 1) % QUEUE_SIZE;
	printf("插入%d.\r\n", paraNode);
}

int dequeue(QueuePtr paraQueuePtr){
	if (isQueueEmpty(paraQueuePtr)) {
		printf("错啦,队列是空的\r\n");
		return 0;
	}
	paraQueuePtr->front = (paraQueuePtr->front + 1) % QUEUE_SIZE;

	printf("弹出%d并让tempNode接收.\r\n", paraQueuePtr->nodes[paraQueuePtr->front]);
	return paraQueuePtr->nodes[paraQueuePtr->front];
}

typedef struct Graph{ //图的元素嗷
	int** connections;
	int numNodes;
} *GraphPtr;

GraphPtr initGraph(int paraSize, int** paraData) {  //图的初始化嗷
	int i, j;
	GraphPtr resultPtr = (GraphPtr)malloc(sizeof(Graph));
	resultPtr -> numNodes = paraSize;
	resultPtr -> connections = (int**)malloc(paraSize * sizeof(int*));
	for (i = 0; i < paraSize; i ++) {
		resultPtr -> connections[i] = (int*)malloc(paraSize * sizeof(int));
		for (j = 0; j < paraSize; j ++) {
			resultPtr -> connections[i][j] = paraData[i][j];
		}
	}
	
	return resultPtr;
}

void initTranverse(GraphPtr paraGraphPtr) {  //这个就是给这数组申请了个空间而已
	int i;
	visitedPtr = (int*) malloc(paraGraphPtr -> numNodes * sizeof(int));
	
	for (i = 0; i < paraGraphPtr -> numNodes; i ++) {
		visitedPtr[i] = 0; //全部赋值为0证明没用过
	}
}

void depthFirstTranverse(GraphPtr paraGraphPtr, int paraNode) { //深搜公式
	int i;
	
	visitedPtr[paraNode] = 1;
	printf("%d\t", paraNode);
	
	for (i = 0; i < paraGraphPtr -> numNodes; i ++) {
		if (!visitedPtr[i]){ 
			if (paraGraphPtr -> connections[paraNode][i]) {
				depthFirstTranverse(paraGraphPtr, i);
			}
		}
	}
}

void widthFirstTranverse(GraphPtr paraGraphPtr, int paraStart){ //宽搜公式
	int i, j, tempNode;
	i = 0;
	QueuePtr tempQueuePtr = initQueue();
	printf("从%d开始\t", paraStart); //从这个数开始
	visitedPtr[paraStart] = 1; //赋值1证明走过了
	enqueue(tempQueuePtr, paraStart);  //可以压进去
	while (!isQueueEmpty(tempQueuePtr)) { //只要队列不空,就继续
		tempNode = dequeue(tempQueuePtr);
		visitedPtr[tempNode] = 1;
		
		i ++;

		for (j = 0; j < paraGraphPtr->numNodes; j ++) {
			if (visitedPtr[j]) //从0开始判断是否用过,用过就结束本次循环
				continue;

			if (paraGraphPtr->connections[tempNode][j] == 0) //没有关系也结束本次循环
				continue;
			
			printf("%d\t", j);
			visitedPtr[j] = 1;
			enqueue(tempQueuePtr, j);//可以压进去
		}
	}
}


void testGraphTranverse() {
	int i, j;
	int myGraph[5][5] = { //自己先造一个图嗷
		{0, 1, 0, 1, 0},
		{1, 0, 1, 0, 1}, 
		{0, 1, 0, 1, 1}, 
		{1, 0, 1, 0, 0}, 
		{0, 1, 1, 0, 0}};
	int** tempPtr;
	printf("准备数据嗷\r\n");
		
	tempPtr = (int**)malloc(5 * sizeof(int*));
	for (i = 0; i < 5; i ++) {
		tempPtr[i] = (int*)malloc(5 * sizeof(int));
	}
	 
	for (i = 0; i < 5; i ++) {
		for (j = 0; j < 5; j ++) {
			tempPtr[i][j] = myGraph[i][j];
			printf("展现数据 i = %d, j = %d, %d\r\n", i, j, tempPtr[i][j]); //(前俩是元素,后面的是联系)
		}
	}
 
	printf("数据都准备好的嗷\r\n");
	
	GraphPtr tempGraphPtr = initGraph(5, tempPtr);
	printf("num nodes = %d \r\n", tempGraphPtr -> numNodes);
	printf("Graph initialized\r\n");

	printf("-----深搜-----:\r\n");
	initTranverse(tempGraphPtr);
	depthFirstTranverse(tempGraphPtr, 4);

	printf("\r\n-----广搜-----:\r\n");
	initTranverse(tempGraphPtr);
	widthFirstTranverse(tempGraphPtr, 4);
}

int main(){
	testGraphTranverse();
	return 1;
}

 

 

 

运算结果

准备数据嗷
展现数据 i = 0, j = 0, 0
展现数据 i = 0, j = 1, 1
展现数据 i = 0, j = 2, 0
展现数据 i = 0, j = 3, 1
展现数据 i = 0, j = 4, 0
展现数据 i = 1, j = 0, 1
展现数据 i = 1, j = 1, 0
展现数据 i = 1, j = 2, 1
展现数据 i = 1, j = 3, 0
展现数据 i = 1, j = 4, 1
展现数据 i = 2, j = 0, 0
展现数据 i = 2, j = 1, 1
展现数据 i = 2, j = 2, 0
展现数据 i = 2, j = 3, 1
展现数据 i = 2, j = 4, 1
展现数据 i = 3, j = 0, 1
展现数据 i = 3, j = 1, 0
展现数据 i = 3, j = 2, 1
展现数据 i = 3, j = 3, 0
展现数据 i = 3, j = 4, 0
展现数据 i = 4, j = 0, 0
展现数据 i = 4, j = 1, 1
展现数据 i = 4, j = 2, 1
展现数据 i = 4, j = 3, 0
展现数据 i = 4, j = 4, 0
数据都准备好的嗷
num nodes = 5
Graph initialized
-----深搜-----:
4       1       0       3       2
-----广搜-----:
从4开始 front = 0, rear = 1.
插入4.
弹出4并让tempNode接收.
1       front = 1, rear = 2.
插入1.
2       front = 1, rear = 3.
插入2.
弹出1并让tempNode接收.
0       front = 2, rear = 4.
插入0.
弹出2并让tempNode接收.
3       front = 3, rear = 5.
插入3.
弹出0并让tempNode接收.
弹出3并让tempNode接收.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值