結構
//頂點結構
typedef struct Vnode
{
Vertex data; //頂點信息
ArcNode *firstarc; //指向第一條邊
} VNode;
//邊頭結點結構
typedef struct ANode
{
int adjvex; //該邊的終點編號
struct ANode *nextarc; //指向下一條邊的指針
InfoType info; //該邊的權值等信息
} ArcNode;
//圖結構
typedef struct
{
VNode adjlist[MAXV]; //鄰接表
int n, e; //圖中頂點數n和邊數e
} ALGraph;
int Visited[MAXV] = {0};
深度優先搜索
void DFS(ALGraph *G,int v)
{
printf("%d", v);//訪問該節點
Visited[v] = 1;//標記該節點被訪問
ArcNode* p_EdgeNode = G->adjlist[v].firstarc;//v的第條一相鄰邊的邊頭節點
while (p_EdgeNode != NULL)//v訪問所有的相鄰邊
{
int w = p_EdgeNode->adjvex;//v相鄰邊的定點下標
if (Visited[w] == 0)//w尚未本被訪問,遞歸遍歷以w起始部分
DFS(G,w);
p_EdgeNode = p_EdgeNode->nextarc;//指向頂點v的下一條邊的邊頭節點
}
}
廣度優先搜索
void BFS(ALGraph *G, int v)
{
ArcNode *p; int w, i;
int queue[MAXV], front = 0, rear = 0; //定義循環隊列
int visited[MAXV];
for (int i = 0; i < MAXV; i++)//初始化
visited[i] = 0;
//訪問第一個節點
printf("%d\n",v);
visited[v] = 1;
//v進隊列
rear = (rear + 1) % MAXV;
queue[rear] = v;
while (rear != front)//queue不空
{
//隊頭節點出隊
front = (front + 1) % MAXV;
w = queue[front];
ArcNode* p = G->adjlist[w].firstarc;//w的相鄰節點
while (p != NULL)//層序
{
if (visited[p->adjvex] == 0)//尚未訪問
{
//訪問
printf("%d\n",p->adjvex);
visited[p->adjvex] = 1;
//入隊
rear = (rear + 1) % MAXV;
queue[rear] = p->adjvex;
}
p = p->nextarc; //找下一個鄰接頂點
}
}
}
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。