![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
// ---------------------------------------------------------------- // 图的深度优先搜索法 // ---------------------------------------------------------------- #include " iostream " #include " stdlib.h " using namespace std; struct node // 图顶点结构声明 { int vertex; // 顶点数据 struct node * nextnode; // 指下一顶点的指针 };typedef struct node * graph; // 图的结构新类型 struct node head[ 9 ]; // 图的顶点结构数组 int visited[ 9 ]; // 顶点记录数组 // ----------------------------------------------------------------- // 创建图 // ----------------------------------------------------------------- void creategraph( int * node, int num){ graph newnode; // 新顶点指针 graph ptr; int from; // 边的起点 int to; // 边的终点 int i; for (i = 0 ;i < num;i ++ ) // 读取边的循环 { from = node[i * 2 ]; // 边的起点 to = node[i * 2 + 1 ]; // 边的终点 // -----------------创建新顶点内存------------------------------ newnode = (graph) malloc( sizeof ( struct node)); newnode -> vertex = to; // 创建顶点内容 newnode -> nextnode = NULL; // 设置指针初值 ptr =& (head[from]); // 顶点位置 while (ptr -> nextnode != NULL) // 遍历至链表尾 ptr = ptr -> nextnode; // 下一个顶点 ptr -> nextnode = newnode; // 插入结尾 }} // ------------------------------------------------------------------------ // 图的深度优先搜索 // ------------------------------------------------------------------------ void dfs( int current){ graph ptr; visited[current] = 1 ; // 记录已遍历过 printf( " 顶点[%d] " ,current); // 输出遍历顶点值 ptr = head[current].nextnode; // 顶点位置 while (ptr != NULL) // 遍历至链表尾 { if (visited[ptr -> vertex] == 0 ) // 如果没遍历过 dfs(ptr -> vertex); // 递归遍历调用 ptr = ptr -> nextnode; // 下一个顶点 }} // ----------------将遍历内容输出------------------------ int main(){ graph ptr; int node[ 20 ][ 2 ] = { // 边数组 { 1 , 2 },{ 2 , 1 }, { 1 , 3 },{ 3 , 1 }, { 2 , 4 },{ 4 , 2 }, { 2 , 5 },{ 5 , 2 }, { 3 , 6 },{ 6 , 3 }, { 3 , 7 },{ 7 , 3 }, { 4 , 8 },{ 8 , 4 }, { 5 , 8 },{ 8 , 5 }, { 6 , 8 },{ 8 , 6 }, { 7 , 8 },{ 8 , 7 } }; int i; for (i = 1 ;i <= 8 ;i ++ ) { head[i].vertex = i; // 设置顶点值 head[i].nextnode = NULL; // 清除图指针 visited[i] = 0 ; // 设置遍历初值 } creategraph( * node, 20 ); // 创建图 printf( " 图的邻接表内容:\n " ); for (i = 1 ;i <= 8 ;i ++ ) { printf( " 顶点%d=> " ,head[i].vertex); // 顶点值 ptr = head[i].nextnode; // 顶点位置 while (ptr != NULL) // 遍历至链表尾 { printf( " %d " ,ptr -> vertex); // 输出顶点内容 ptr = ptr -> nextnode; // 下一个顶点 } printf( " \n " ); } printf( " 图的深度优先遍历内容: \n " ); dfs( 1 ); printf( " \n " );}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
// ----------------------图的广度优先搜索------------------------ #include " iostream " #include " stdlib.h " #define MAXQUEUE 10 // 队列的最大容量 using namespace std; struct node // 图顶点结构声明 { int vertex; // 顶点数据 struct node * nextnode; // 指向下一顶点的指针 };typedef struct node * graph; // 图的结构新类型 struct node head[ 9 ]; // 图的顶点结构数组 int visited[ 9 ]; // 遍历记录数组 int queue[MAXQUEUE]; // 队列数组声明 int front =- 1 ; // 队列的对头 int rear =- 1 ; // 队列的队尾 // ---------------------创建图----------------------- void creategraph( int * node, int num){ graph newnode; // 新顶点指针 graph ptr; int from; // 边的起点 int to; // 边的终点 int i; for (i = 0 ;i < num;i ++ ) // 读取边的循环 { from = node[i * 2 ]; // 边的起点 to = node[i * 2 + 1 ]; // 边的终点 // -----------创建新顶点内存--------------------- newnode = ( graph ) malloc( sizeof ( struct node)); newnode -> vertex = to; // 创建顶点内容 newnode -> nextnode = NULL; // 设置指针初值 ptr =& (head[from]); // 顶点位置 while (ptr -> nextnode != NULL) // 遍历至链表尾 ptr = ptr -> nextnode; // 下一个顶点 ptr -> nextnode = newnode; // 插入结尾 }} // -----------------------队列的数据存入------------------------- int enqueue( int value){ if (rear >= MAXQUEUE) // 检查队列是否全满 return - 1 ; // 无法存入 rear ++ ; // 队尾指针往前移 queue[rear] = value; // 存入队列 } // -----------------------队列数据的取出----------------------- int dequeue(){ if (front == rear) // 检查队列是否为空 return - 1 ; // 无法取出 front ++ ; // 对头指针往前移 return queue[front]; // 队列取出 } // -------------------------图的广度优先搜索法-------------------------------- void bfs( int current){ graph ptr; // 处理第一个顶点 enqueue(current); // 将顶点存入队列 visited[current] = 1 ; // 记录已遍历过 printf( " 顶点[%d] " ,current); // 输出遍历顶点值 while (front != rear ) // 队列是否为空 { current = dequeue(); // 将顶点从队列中取出 ptr = head[current].nextnode; // 顶点位置 while (ptr != NULL) // 遍历至链表尾 { if (visited[ptr -> vertex] == 0 ) // 如果没有遍历过 { enqueue(ptr -> vertex); // 递归遍历调用 visited[ptr -> vertex] = 1 ; // 记录已遍历过 printf( " 顶点[%d] " ,ptr -> vertex); } ptr = ptr -> nextnode; // 下一个顶点 } }} // -----------------将遍历内容输出----------------------- int main(){ graph ptr; int node[ 20 ][ 2 ] = { // 边数组 { 1 , 2 },{ 2 , 1 }, { 1 , 3 },{ 3 , 1 }, { 2 , 4 },{ 4 , 2 }, { 2 , 5 },{ 5 , 2 }, { 3 , 6 },{ 6 , 3 }, { 3 , 7 },{ 7 , 3 }, { 4 , 8 },{ 8 , 4 }, { 5 , 8 },{ 8 , 5 }, { 6 , 8 },{ 8 , 6 }, { 7 , 8 },{ 8 , 7 } }; int i; for (i = 1 ;i <= 8 ;i ++ ) { head[i].vertex = i; // 设置顶点值 head[i].nextnode = NULL; // 清除图指针 visited[i] = 0 ; // 设置遍历初值 } creategraph( * node, 20 ); // 创建图 printf( " 图的邻接表内容:\n " ); for (i = 1 ;i <= 8 ;i ++ ) { printf( " 顶点%d => " ,head[i].vertex); // 顶点值 ptr = head[i].nextnode; // 顶点位置 while (ptr != NULL) // 遍历至链表尾 { printf( " %d " ,ptr -> vertex); // 输出顶点内容 ptr = ptr -> nextnode; // 下一个顶点 } printf( " \n " ); } printf( " 图的广度优先遍历内容: \n " ); bfs( 1 ); printf( " \n " );}