图的基本操作--邻接表类型

本文作者:韩申权
作者博客:http://www.cnblogs.com/hsqdboke
转载请注明出处,侵权必究,保留最终解释权!

程序2

/* 邻接表的结点类型 */

typedef struct arc

   {int adjvex;

    struct arc *next;}ArcNode;

typedef struct VexNode

{int vertex;

 ArcNode *firstarc;

}VerNode;

typedef VerNode AdjList[MAXNODE];

 

/* 建立图的邻接表 */

void CreatAdjlist(AdjList GL)

 

/* 从初始点v出发深度优先遍历邻接表GL表示的图 */

void DfsAdjlist(AdjList GL,int v)

 

/*从初始点v出发广度优先遍历邻接表GL表示的图*/

void BfsAdjlist(AdjList GL,int v)

例如:

图的基本操作--邻接表类型

//2012年5月23日9:52:20

//图的邻接表进行图的基本操作

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define MAX_V 20 //定义最多有20个顶点

#define OVERFLOW -1

typedef int QElemType;

int p=1,q=1;

int visited[MAX_V];

typedef struct arc

{

    int adjvex;

    struct arc *next;

}ArcNode;

typedef struct VexNode

{

    char vertex[10];

    ArcNode *firstarc;

}VerNode;

typedef VerNode AdjList[MAX_V+1];

void CreateG(AdjList g,int v,int e)//创建图的链表

{

    int i,x;

    ArcNode *p=NULL,*q=NULL;

    printf("请输入顶点的信息:");

    for(i=1;i<=v;i++)

    {        

        scanf("%s",g[i].vertex);

        g[i].firstarc=NULL;

    }

    for(i=1;i<=v;i++)

    {

        printf("请输入与结点%d相邻的结点的序号,并以0结束:",i);//稍做处理 以0结束

        scanf("%d",&x);

        p=(ArcNode*)malloc(sizeof(ArcNode));

        q=(ArcNode*)malloc(sizeof(ArcNode));

        p->adjvex=x;

        p->next=NULL;

        g[i].firstarc=p;

        q=p;

        if(x)

        {

            while(1)

            {

                scanf("%d",&x);

                p=(ArcNode*)malloc(sizeof(ArcNode));

                p->adjvex=x;

                p->next=NULL;

                q->next=p;

                q=p;

                if(!x)break;

            }

        }

    }

}

int FAV(AdjList g,int vc)//vc为当前顶点返回第一个邻接点

{

    if(g[vc].firstarc->adjvex!=0)return g[vc].firstarc->adjvex;

    else return 0;

}

int NAV(AdjList g,int vc,int w)//返回其邻接点w的下一个邻接点

{

    ArcNode *p=NULL;

    if(g[vc].firstarc->adjvex==w)return g[vc].firstarc->next->adjvex;

    else

    {

        p=(ArcNode*)malloc(sizeof(ArcNode));

        p=g[vc].firstarc;

        while(p)

        {

            if(p->next->adjvex==w)return p->next->next->adjvex;

            p=p->next;

        }

    }

    return 0;

}

void visit(AdjList g,int v)

{

    if(p)

    {

        printf("%s",g[v].vertex);

        p=0;

    }

    else printf("->%s",g[v].vertex);



}

void visit1(AdjList g,int v)

{

    if(q)

    {

        printf("%s",g[v].vertex);

        q=0;

    }

    else printf("->%s",g[v].vertex);



}



void DFS(AdjList g,int v)   //DFS

{

    int w;

    visited[v]=1;

    visit(g,v);

    for(w=FAV(g,v);w;w=NAV(g,v,w))

        if(!visited[w])DFS(g,w);

}

void DFSTraverse(AdjList g,int n,int v)//从第n个顶点开始的DFS

{

    int i;

    memset(visited,0,sizeof(visited));

    printf("从初始点%d进行DFS的结果为:\n",n);

    DFS(g,n);

    for(i=1;i<=v;i++)

    {

        if(!visited[i])DFS(g,i);

    }

    printf("\n");

}

//BFS函数的需要的函数

typedef struct QNode

{

    QElemType data;

    struct QNode *next;

}QNode,*Queuep;

typedef struct

{

    Queuep front;

    Queuep rear;

}LinkQueue;

void InitQueue(LinkQueue *Q) //初始队列

{

    Q->front=Q->rear=(Queuep)malloc(sizeof(QNode));

    if(!Q->front)exit(OVERFLOW);

    Q->front->next=NULL;

}

void EnQueue(LinkQueue *Q,QElemType e)//队尾插入元素

{

    Queuep p;

    p=(Queuep)malloc(sizeof(QNode));

    if(!p)exit(OVERFLOW);

    p->data=e;

    p->next=NULL;

    Q->rear->next=p;

    Q->rear=p;

}

void DeQueue(LinkQueue *Q,QElemType *e)//删除队首元素

{

    Queuep p;

    p=Q->front->next;

    *e=p->data;

    Q->front->next=p->next;

    if(Q->rear==p)Q->rear=Q->front;

    free(p);

}

int  QueueEmpty(LinkQueue *Q)//判空

{

    if(Q->front==Q->rear)return 1;

    else return 0;

}

void BFSTraverse(AdjList g,int n,int v)

{

    int i,w,u;    

    LinkQueue Q;

    memset(visited,0,sizeof(visited));

    printf("从初始点%d进行BFS的结果为:\n",n);

    InitQueue(&Q);

    EnQueue(&Q,n);

    visited[n]=1;

    visit1(g,n);

    while(!QueueEmpty(&Q))

    {

        DeQueue(&Q,&u);

        for(w=FAV(g,u);w;w=NAV(g,u,w))

            if(!visited[w])

            {

                visited[w]=1;

                visit1(g,w);

                EnQueue(&Q,w);



            }

    }

    for(i=1;i<=v;i++)

    {

        if(!visited[i])

        {

            EnQueue(&Q,i);

            visited[i]=1;

            visit1(g,i);

            while(!QueueEmpty(&Q))

            {

                DeQueue(&Q,&u);

                for(w=FAV(g,u);w;w=NAV(g,u,w))

                    if(!visited[w])

                    {

                        visited[w]=1;

                        visit1(g,w);

                        EnQueue(&Q,w);

                    }

            }

        }

    }

    printf("\n");

}

int main()

{

    int n,e,v;

    AdjList g;

    printf("请输入图的顶点数和边数:");

    scanf("%d%d",&v,&e);

    printf("请输入从第几个顶点开始遍历:");

    scanf("%d",&n);

    CreateG(g,v,e);

    DFSTraverse(g,n,v);

    printf("\n");

    BFSTraverse(g,n,v);

    return 0;    

}

图的基本操作--邻接表类型

 

本文作者:韩申权
作者博客:http://www.cnblogs.com/hsqdboke
转载请注明出处,侵权必究,保留最终解释权!

 

 

你可能感兴趣的:(基本操作)