关闭

图的基本操作

188人阅读 评论(0) 收藏 举报
分类:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stack>
#include<queue>

using namespace std;

#define Max 20

int visited[Max]={0};
int indegree[Max]={0};
typedef struct ArcNode
{
    int adj;
    struct ArcNode *nextarc;
}ArcNode;

typedef struct
{
    char date;
    ArcNode *firstarc;
}VNode,AdjList[Max];

typedef struct
{
    AdjList vertices;
    int vexnum,arcnum;
}AlGraph;

int Located(AlGraph &G,char v)
{
    int i,k=-1;
    for(i=0;i<G.vexnum;i++)
        if(v==G.vertices[i].date)
        {
            k=i;
            break;
        }
    return k;
}

void Creat_Graph(AlGraph &G)
{
    int i,j,k;
    int la,lb;
    char V1,V2;
    ArcNode *p,*s;
    printf("输入图的顶点以及边的个数\n");
    scanf("%d%d",&G.vexnum,&G.arcnum);
    printf("输入图的顶点信息\n");
    for(i=0;i<G.vexnum;i++)
    {
        getchar();
        scanf("%c",&G.vertices[i].date);
        G.vertices[i].firstarc=NULL;
    }
    printf("输入图每条边所依附的顶点\n");
    for(k=0;k<G.arcnum;k++)
    {
        getchar();
        scanf("%c %c",&V1,&V2);
        la=Located(G,V1);
        lb=Located(G,V2);
        s=(ArcNode*)malloc(sizeof(ArcNode));
        s->adj=lb;
        s->nextarc=NULL;
        p=G.vertices[la].firstarc;
        if(!p)
            G.vertices[la].firstarc=s;
        else
        {
            while(p->nextarc)
                p=p->nextarc;
            p->nextarc=s;
        }
    }

}

void DFS(AlGraph G,char ch)
{
    int v,w;
    ArcNode *p;
    v=Located(G,ch);
    visited[v]=1;
    printf("%c  ",G.vertices[v].date);
    p=G.vertices[v].firstarc;
    while(p)
    {
        w=p->adj;
        if(visited[w]==0)
        DFS(G,G.vertices[w].date);
        p=p->nextarc;
    }
}
void DFSTravel(AlGraph G)
{
    int v;
    for(v=0;v<G.vexnum;v++)
        visited[v]=0;
    for(v=0;v<G.vexnum;v++)
    {
        if(visited[v]==0)
            DFS(G,G.vertices[v].date);
    }
}

void Un_DFSTravel(AlGraph G)
{
    stack<int>S;
    ArcNode *p;
    int i;
    for(i=0;i<G.vexnum;i++)
        visited[i]=0;
    for(i=0;i<G.vexnum;i++)
    {
        if(visited[i]==0)
        {
            visited[i]=1;
            printf("%c ",G.vertices[i].date);
            S.push(i);
            while(!S.empty())
            {
                p=G.vertices[S.top()].firstarc;
                while(p)
                {
                    if(!visited[p->adj])
                    {
                        printf("%c ",G.vertices[p->adj].date);
                        visited[p->adj]=1;
                        S.push(p->adj);
                        p=G.vertices[S.top()].firstarc;
                    }
                    else
                        p=p->nextarc;
                }
                S.pop();
            }
        }
    }
}

void BFSTravel(AlGraph G)
{
    queue<int>Q;
    int i,v;
    ArcNode *p;
    int s;
    for(i=0;i<G.vexnum;i++)
        visited[i]=0;
    for(v=0;v<G.vexnum;v++)
    {
        if(!visited[v])
        {
            visited[v]=1;
            printf("%c ",G.vertices[v].date);
            Q.push(v);
            while(!Q.empty())
            {
                s=Q.front();
                p=G.vertices[s].firstarc;
                while(p)
                {
                    if(!visited[p->adj])
                    {
                        visited[p->adj]=1;
                        printf("%c ",G.vertices[p->adj].date);
                        Q.push(p->adj);
                    }
                    else
                        p=p->nextarc;
                }
                Q.pop();
            }
        }
    }
}

void Finddgree(AlGraph G,int indegree[])
{
    int i;
    ArcNode *p;
    for(i=0;i<G.vexnum;i++)
        indegree[i]=0;
    for(i=0;i<G.vexnum;i++)
    {
        p=G.vertices[i].firstarc;
        while(p)
        {
            indegree[p->adj]++;
            p=p->nextarc;
        }
    }

}

void TopologicalSort(AlGraph G)
{
    stack<int>S;
    int num;
    int k,i;
    ArcNode *p;
    Finddgree(G,indegree);
    for(i=0;i<G.vexnum;i++)
        if(!indegree[i])
            S.push(i);
    num=0;
    while(!S.empty())
    {
        i=S.top();
        S.pop();
        printf("%c  ",G.vertices[i].date);
        num++;
        for(p=G.vertices[i].firstarc;p;p=p->nextarc)
        {
            k=p->adj;
            if(!(--indegree[k]))
                S.push(k);

        }
    }
    if(num<G.vexnum)
        printf("这是一个有环图\n");
    else
        printf("这是一个无环图\n");

}

int main()
{
    AlGraph G;

    Creat_Graph(G);
    printf("深度搜索递归序列\n");
    DFSTravel(G);
    putchar('\n');
    printf("深度搜索非递归序列\n");
    Un_DFSTravel(G);
    putchar('\n');
    printf("广度搜索递归序列\n");
    BFSTravel(G);
    putchar('\n');
    printf("拓扑序列\n");
    TopologicalSort(G);
    putchar('\n');
    return 0;
}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:40212次
    • 积分:1898
    • 等级:
    • 排名:千里之外
    • 原创:155篇
    • 转载:6篇
    • 译文:0篇
    • 评论:1条