图——邻接表

来源:互联网 发布:淘宝登录 编辑:程序博客网 时间:2024/05/22 06:56
typedef char VertexType;//顶点类型#define MAXVEX 20typedef 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");}
0 0