图的基本操作

原创 2015年11月19日 16:03:02
#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;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

C/C++ 图的基本操作

数据结构—图的基本操作:添加节点、为有向图/无向图添加邻接矩阵、打印邻接矩阵、深度优先遍历、广度优先遍历等...
  • shangguanyunlan
  • shangguanyunlan
  • 2016年10月23日 11:09
  • 1372

数据结构 图的基本操作实现

实验题目: 图的基本操作实现                实验环境:   Visual C++ 6.0                     实验目的:掌握图的邻接矩阵和邻接表两个存储结构及表示。...
  • yao1373446012
  • yao1373446012
  • 2016年11月07日 17:28
  • 2780

算法与数据结构--图的实现、基本操作及应用

#include #include #include using namespace std; #define INFINITY DBL_MAX //无穷大 #define MAX_VERT...
  • u011390632
  • u011390632
  • 2014年05月28日 16:12
  • 2101

LUT算法与数据结构--图的基本操作与实现和通讯录

  • 2017年12月10日 17:46
  • 965KB
  • 下载

图的基本操作

  • 2016年11月16日 15:23
  • 2KB
  • 下载

C# GDI+写的5个小练习,各种GDI基本操作,仿QQ屏幕截图

  • 2017年10月28日 22:20
  • 21KB
  • 下载

图的基本操作

  • 2017年02月09日 10:45
  • 272KB
  • 下载

图的基本操作

  • 2014年05月19日 23:01
  • 25KB
  • 下载

PROTEUS教学(基本操作、电路原理图设计。。。)

  • 2009年07月12日 10:59
  • 9.86MB
  • 下载

图的基本操作

  • 2016年01月05日 09:24
  • 7KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图的基本操作
举报原因:
原因补充:

(最多只允许输入30个字)