typedef char VertexType;//顶点类型
#define MAXVEX 20
typedef struct EdgeNode {
int adjvex;//邻接点域,用于存储该顶点对应下标
EdgeNode *next;
}EdgeNode;
typedef struct VerTexNode {
VertexType data;
EdgeNode *firstEdge;
}VerTexNode,AdjList[MAXVEX];
typedef struct {
AdjList adjlist;33333333333
int numVertexed, numEdges;//顶点数、边数
}GraphAdjList;
void CreateAdjList(GraphAdjList *G) {
int i, j, k;
EdgeNode *e;
cout << "请输入顶点数和边数" << endl;
cin >> G->numVertexed >> G->numEdges;
for (i = 0; i < G->numVertexed; i++) {
cin >> G->adjlist[i].data;
G->adjlist[i].firstEdge = NULL;
}//建立顶点信息
for (k = 0; k < G->numEdges; k++) {
cout << "请输入vi,vj上两个顶点的序号:" << endl;
cin >> i >> j;
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = j;
e->next = G->adjlist[i].firstEdge;
G->adjlist[i].firstEdge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = i;
e->next = G->adjlist[j].firstEdge;
G->adjlist[j].firstEdge = e;
}
}
使用深度优先遍历
int visitied[MAXVEX];
void DFS(GraphAdjList *GL, int i) {
EdgeNode *p;
visitied[i] = 1;
cout << GL->adjlist[i].data ;
p = GL->adjlist[i].firstEdge;
while (p) {
if (!visitied[p->adjvex])
DFS(GL, p->adjvex);
p=p->next;
}
}
void DFSTraverse(GraphAdjList GL) {
int i;
for (i = 0; i < GL.numVertexed; i++) {
visitied[i] = 0;
}
for (i = 0; i < GL.numVertexed; i++) {
if (!visitied[i])
DFS(&GL, i);
}
}
广度优先遍历
typedef struct Queue {
int Q[MAXVEX];
int font;
int rear;
} Queue;//使用循环队列原因
void InitQueue(Queue *Q) {
Q->font = 0;
Q->rear = 0;
}
bool EnQueue(Queue *Q, int e) {
if ((Q->font) != (Q->rear + 1) % MAXVEX) {
Q->Q[Q->rear] = e;
Q->rear = (Q->rear + 1) % MAXVEX;
return 1;
}
else
return 0;
}
bool DeQueue(Queue *Q) {
if ((Q->font) != (Q->rear)) {
//*e = Q->Q[Q->font];
Q->font = (Q->font + 1) % MAXVEX;
return 1;
}
else
return 0;
}
int visited[MAXVEX] = { 0 };
void BFSTraverse(GraphAdjList GL) {
int i;
EdgeNode *p;
Queue Q;
InitQueue(&Q);
for (i = 0; i != GL.numVertexed; i++) {
if (!visited[i]) {
visited[i] = 1;
cout << GL.adjlist[i].data << endl;
EnQueue(&Q, i);
while (Q.font != Q.rear) {
DeQueue(&Q);
cout << "查看i:" << i<<endl;
p = GL.adjlist[i].firstEdge;
while (p) {
if (!visited[p->adjvex]) {
visited[p->adjvex] = 1;
cout << GL.adjlist[p->adjvex].data << endl;
EnQueue(&Q, p->adjvex);
}
p = p->next;
}
}
}
}
}
int main() {
GraphAdjList a;
CreateAdjList(&a);
DFSTraverse(a);
system("pause");
}