圖的深度優先遍歷(堆疊實現和非堆疊實現)
// Chart.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdlib.h"
//如:FROMHEAD = 1,則用頭插法;否則:則用尾插法
#define FROMHEAD 1
/*
如:HASHEAD 被定義,則各頂點的鄰接點鏈中<帶起始頂點>;
否則:各頂點的鄰接點鏈中<不帶起始頂點>;
*/
#define HASHEAD
#define MAX 50
#define SIZE 5
//鄰接點結構
struct tnode
{
int order;
int data;
int right;
struct tnode *next;
};
//頭接點結構
struct hnode
{
int vertex;
int data;
struct tnode *ptnode;
};
#ifdef HASHEAD
//<帶起始頂點>
int ChartNode[5][3] = {{1,'A',4},{2,'B',4},{3,'C',5},{4,'D',5},{5,'E',3}};
int ConnectTable[] = {0,1,2,3,1,0,2,3,2,0,1,3,4,3,0,1,2,4,4,2,3};
#else
//<不帶起始頂點>
int ChartNode[5][3] = {{1,'A',3},{2,'B',3},{3,'C',4},{4,'D',4},{5,'E',2}};
int ConnectTable[] = {1,2,3,0,2,3,0,1,3,4,0,1,2,4,2,3};
#endif
/*
function CreateChart()功能:依次訪問圖中的各個節點
引數描述:
int max:圖的頂點個數
int fromhead:插入鄰接佔點的方式
fromhead=1 頭插入方式
fromhead=0 尾插入方式
*/
void CreateChart(hnode HeadNode[],int max,int fromhead)
{
int i,j,k;
tnode *p,*tail;
for(i=0;i {
HeadNode[i].vertex = ChartNode[i][2];
HeadNode[i].data = 65+i;
HeadNode[i].ptnode = NULL;
//printf("頂點[%c]有[%d]個鄰接點!/n",HeadNode[i].data,HeadNode[i].vertex);
}
for(i=0,k=0;i {
for(j=0;j {
p = (tnode *)malloc(sizeof(tnode));
if(p==NULL)
{
exit(1);
}
else
{
p->order = ChartNode[ConnectTable[k+j]][0];
p->data = ChartNode[ConnectTable[k+j]][1];
p->next = NULL;
if(fromhead)
{
//新節點放在前面<緊接頭節點的後面>頭插法
p->next = HeadNode[i].ptnode;
HeadNode[i].ptnode = p;
}
else
{
//新節點放在後面<緊接最後一個表節點的後面>尾插法
if(HeadNode[i].ptnode==NULL)
{
HeadNode[i].ptnode = p;
tail = p;
}
else
tail->next = p;
tail = p;
//printf("頂點[%c]的第[%d]個鄰接點是[%c]!/n",HeadNode[i].data,j,p->data);
}
}
}
k = k+HeadNode[i].vertex;
}
}
/*
function AccessChartNode()功能:依次訪問圖中的各個節點
*/
void AccessChartNode(hnode HeadNode[],int max)
{
int i;
tnode *p;
for(i=0;i {
p = HeadNode[i].ptnode;
printf("/n頂點[%c]的[%d]個鄰接點:/n",HeadNode[i].data,HeadNode[i].vertex);
while(p!=NULL)
{
printf("頂點[%d][%c]/t",p->order,p->data);
p = p->next;
}
printf("/n");
}
}
/*
function FirstDeepAccess1()功能:圖的[深度優先遍歷]演算法<非堆疊實現演算法>
*/
void FirstDeepAccess1(hnode HeadNode[],int max)
{
int i;
tnode *p;
int visited[SIZE+1];
for(i=0;i<=max;i++)
visited[i] = 0;
for(i=0;i {
//printf("/n迴圈[%d]次/n",i);
p = HeadNode[i].ptnode;
while(p!=NULL)
{
if(!visited[p->order])
{
printf("頂點[%d][%c]/t",p->order,p->data);
visited[p->order] = 1;
}
p = p->next;
}
}
}
/*
function FirstDeepAccess2()功能:圖的[深度優先遍歷]演算法<堆疊實現演算法>
*/
void FirstDeepAccess2(hnode HeadNode[],int max)
{
int i,top;
tnode *p;
tnode *stack[SIZE+1];
int visited[SIZE+1];
for(i=0;i<=max;i++)
visited[i] = 0;
for(i=0;i {
//printf("/n迴圈[%d]次/n",i);
top = 1;
stack[top] = HeadNode[i].ptnode;//將本次訪問的起始節點進棧,以便將來正確返回
while(top!=0)
{
p = stack[top];
while((p!=NULL)&&(visited[p->order]))//節點非空,且已訪問
p = p->next;
if(p==NULL)//當前節點沒有鄰接點,或有但都已經訪問
top--;
else
{
printf("頂點[%d][%c]/t",p->order,p->data);
visited[p->order] = 1;
stack[++top] = p;
}
}
}
}
int main(int argc, char* argv[])
{
hnode HeadNodeArray[SIZE];
if(FROMHEAD)
printf("[表節點以頭插入方式]");
else
printf("[表節點以尾插入方式]");
CreateChart(HeadNodeArray,SIZE,FROMHEAD);
//AccessChartNode(SIZE);
printf("/n此圖的[深度優先遍歷1]結果:/n");
FirstDeepAccess1(HeadNodeArray,SIZE);
printf("/n此圖的[深度優先遍歷2]結果:/n");
FirstDeepAccess2(HeadNodeArray,SIZE);
printf("/n執行完畢!/n");
return 0;
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=935611
相關文章
- 圖的深度優先遍歷[非堆疊、堆疊實現]
- js實現深度優先遍歷和廣度優先遍歷JS
- 堆疊圖
- Python實現堆疊和佇列詳解Python佇列
- Python實現堆疊與佇列Python佇列
- 堆疊的實現(1)--靜態陣列陣列
- 深度優先遍歷,廣度優先遍歷實現物件的深拷貝物件
- 【matplotlib 實戰】--堆疊面積圖
- 非遞迴實現先序遍歷和中序遍歷遞迴
- Photopile JS – 幫助你實現精緻的照片堆疊效果JS
- JS 堆疊JS
- java堆疊Java
- 平衡堆疊
- java使用PriorityQueue即優先佇列實現大根堆和小根堆Java佇列
- C#中堆和堆疊的區別C#
- Java經典例項:實現一個簡單堆疊Java
- 優先佇列的一種實現方式—堆佇列
- 二叉堆實現優先佇列佇列
- 堆疊的工作原理
- python實現圖(基於圖的不同儲存方式)的深度優先(DFS)和廣度(BFS)優先遍歷Python
- 堆和索引堆的python實現索引Python
- 測試平臺-flask_admin+mongodb+pyechart 實現堆疊和翻頁FlaskMongoDB
- echarts 堆疊面積階梯圖Echarts
- Thrift的網路堆疊
- 利用Decorator和SourceMap優化JavaScript錯誤堆疊優化JavaScript
- 記憶體堆疊記憶體
- C#堆疊(Stack)C#
- 堆的實現
- python 實現二叉樹的深度&&廣度優先遍歷Python二叉樹
- c語言的一結構資料的堆疊實現問題薦C語言
- 二叉樹的深度優先遍歷和廣度優先遍歷二叉樹
- 資料結構-樹以及深度、廣度優先遍歷(遞迴和非遞迴,python實現)資料結構遞迴Python
- JS 資料型別和堆疊JS資料型別
- CSS之定位和堆疊屬性CSS
- 【資料結構】堆疊(順序棧、鏈棧)的JAVA程式碼實現資料結構Java
- [golang]如何看懂呼叫堆疊Golang
- 華為裝置堆疊原理
- C++堆疊詳解C++