#define MAX 20
typedef struct Node {
int num; // 頂點編號
struct Node *next; // 下一鄰接節點
} Node;
Node G[MAX]; // 圖的鄰接串列陣列
int visited[MAX]; // 造訪標記
Creategraph()G[i].num = i, next = NULL。i,讀取鄰接頂點編號 e(輸入 0 結束)。e,malloc 新節點掛到 G[i] 串列尾部。int First(Node G[], int v) {
return G[v].next ? G[v].next->num : -1;
}
int Next(Node G[], int v) {
Node *p = G[v].next;
while (p) {
if (!visited[p->num]) return p->num;
p = p->next;
}
return -1;
}
void DFS(Node G[], int v) {
int w;
printf("%d ", v+1);
visited[v] = 1;
w = First(G, v);
while (w != -1) {
if (!visited[w]) DFS(G, w);
w = Next(G, v);
}
}
int main() {
int n;
printf("頂點數 (≤20): ");
scanf("%d", &n);
Creategraph(n, G);
for (int i=0; i<n; i++) visited[i]=0;
printf("DFS 順序: ");
for (int i=0; i<n; i++)
if (!visited[i]) DFS(G, i);
return 0;
}
Next() 跳過已造訪節點:確保不重複探索同一鄰接點。vector<int> (C++) 或動態陣列替代手寫鏈表,簡化記憶體管理。這個範例展示了 C 語言手動管理圖資料結構的經典模式,是理解指標操作、動態記憶體與遞歸圖算法的優秀練習。