这里面加一个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接收.