领接表的基本操作(以任意结点为开始结点,含拓扑排序)

目录

0.功能区

1.预处理区

2 函数声明区

3 建栈,进栈,弹栈,判断栈空

4 定位函数

5 建立邻接表函数(有向图)

6 建立无向图

7 展示领接表函数

8元素v对应的第一个邻接点

9 返回G中顶点v相对于u的下一邻接点

10 DFS

11 建队列,进队列,退出队列,判空队列,求队首元素(为BFS准备)

12 判断图空

13 BFS操作

14 拓扑排序

15 Switch

16 全部代码


0.功能区

    printf("0.退出\n");
    printf("1.建立一个有向图\n");
    printf("2.建立一个无向图\n");
    printf("3.打印邻接表的样式\n");
    printf("4.深度优先遍历\n");
    printf("5.广度优先遍历\n");
    printf("6.拓扑排序判断是否为有向无环图\n");

1.预处理区

#include<stdio.h>
#include<stdlib.h>
#include <iostream>
#include <string>
#include<queue>

#define Stack_Init_Size 100
#define max 100
typedef struct ArcNode
{
    int adjvex;
    struct ArcNode *nextarc;
    char *Info;
}ArcNode;
typedef struct VNode
{
    int in;
    char data;
    ArcNode *firstarc;
}Vode,AdjList[max];
typedef struct
{
    AdjList vertices;
    int vexnum,arcnum;
    int kind; //无用;
}ALGraph;
typedef struct{
    int rear;
    int front;
    int *base;
    int maxsize;
}SqQueue;
typedef struct
{
    int *base;
    int *top;
    int stacksize;    
}SqStack;

2 函数声明区

int Locate(ALGraph G,char v);//定位函数
void CreatALGraphYouXiang(ALGraph &G);
void CreatALGraphWuXiang(ALGraph &G);
void showLinJieBiao(ALGraph G);
int FirstAdjVex(ALGraph G,char v);
int NextAdjVex(ALGraph G,char v,char w);
void DFS(ALGraph G,int v,int V[]);
void DFSTraverse(ALGraph G,int V[]);
void InitQueue(SqQueue &Q,ALGraph G);
void EnQueue(SqQueue &Q,int v);
void DeQueue(SqQueue &Q,int &v);
int IsNullQueue(SqQueue Q);
int firstqueue(SqQueue Q);
void IsNullGraph(int flag);
void BFS(ALGraph G,int v,SqQueue Q,int V[]);
void BFSTraverse(ALGraph G,SqQueue Q,int V[]);
void InitStack(SqStack &S);
void Push(SqStack &S,int e);
int Pop(SqStack &S,int *e);
int IsNullStack(SqStack S);
void TopologicalSort(ALGraph G);
void pro();
void switchs(ALGraph G,SqQueue Q,int V[]);

3 建栈,进栈,弹栈,判断栈空

void InitStack(SqStack &S)
{
    //建栈
    S.base=(int*)malloc(Stack_Init_Size*sizeof(int));
    S.top=S.base;
    S.stacksize=Stack_Init_Size;
}

void Push(SqStack &S,int e)
{
    *S.top++=e;
}

int Pop(SqStack &S,int *e)
{   
    //弹栈,并且返回出弹栈元素
    *e=*--S.top;
}

int IsNullStack(SqStack S)
{
    //判断栈是否为空
    if(S.base==S.top||S.base==NULL)
        return 1;
    else 
        return 0;
}

4 定位函数

int Locate(ALGraph G,char v)//定位函数
{
    int i;
    for(i=0;i<G.vexnum;i++)
    {
        if(v==G.vertices[i].data)
            return i;
    }
    return -1;
}

5 建立邻接表函数(有向图)

void CreatALGraphYouXiang(ALGraph &G)
{
    int i;
    printf("请输入邻接表顶点的个数和边的个数\n");
    scanf("%d%d",&G.vexnum,&G.arcnum);
    getchar();
    printf("请输入邻接表顶点入度和顶点\n");
    for(i=0;i<G.vexnum;i++)
    {
        
        scanf("%d %c",&G.vertices[i].in,&G.vertices[i].data);
        getchar();
        G.vertices[i].firstarc=NULL;
    }
    printf("请输入两个顶点,即两个得关系\n");
    for(i=0;i<G.arcnum;i++)
    {
        char v1,v2;
        scanf("%c %c",&v1,&v2);
        getchar();
        int l1=Locate(G,v1);
        int l2=Locate(G,v2);
        ArcNode *p1=(ArcNode *)malloc(sizeof(ArcNode));
        p1->adjvex=l2;
        p1->nextarc=G.vertices[l1].firstarc;
        G.vertices[l1].firstarc=p1;
    }
}

6 建立无向图

void CreatALGraphWuXiang(ALGraph &G)
{
    int i;
    printf("请输入邻接表顶点的个数和边的个数\n");
    scanf("%d%d",&G.vexnum,&G.arcnum);
    getchar();
    printf("请输入邻接表的全部顶点\n");
    for(i=0;i<G.vexnum;i++)
    {
        
        scanf("%c",&G.vertices[i].data);
        getchar();
        G.vertices[i].firstarc=NULL;
    }
    printf("请输入两个顶点,即两个得关系\n");
    for(i=0;i<G.arcnum;i++)
    {
        char v1,v2;
        scanf("%c %c",&v1,&v2);
        getchar();
        int l1=Locate(G,v1);
        int l2=Locate(G,v2);
        ArcNode *p1=(ArcNode *)malloc(sizeof(ArcNode));
        p1->adjvex=l2;
        p1->nextarc=G.vertices[l1].firstarc;
        G.vertices[l1].firstarc=p1;
        ArcNode *p2=(ArcNode *)malloc(sizeof(ArcNode));
        p2->adjvex=l1;
        p2->nextarc=G.vertices[l2].firstarc;
        G.vertices[l2].firstarc=p2;
    }
}

7 展示领接表函数

void showLinJieBiao(ALGraph G)
{
    int i;
    ArcNode *p;
    for(i=0;i<G.vexnum;i++)
    {
        printf("%c ",G.vertices[i].data);
        p=G.vertices[i].firstarc;
        while(p)
        {
            printf(" -> %c",G.vertices[p->adjvex].data);
            p=p->nextarc;
        }
        printf(" -> NULL ");
        printf("\n");
    }
}

8元素v对应的第一个邻接点

int FirstAdjVex(ALGraph G,char v)
{
    int num;
    num=Locate(G,v);
    if(num==-1)
    {
        printf("没有邻接点\n");
        return -1;
    }
    if(G.vertices[num].firstarc==NULL)
    {
        printf("没有邻接点\n");
        return -1;
    }
    return G.vertices[num].firstarc->adjvex;
}

9 返回G中顶点v相对于u的下一邻接点

int NextAdjVex(ALGraph G,char v,char w)
{
    int num = Locate(G,v);
    int num2 = Locate(G,w);
    if(num==-1)
        return -1;
    else{
        ArcNode *p = G.vertices[num].firstarc;
        while(p!=NULL&&p->adjvex!=num2)
        {
            p=p->nextarc;
        }
        if(p->nextarc==NULL)
        {
            printf("G中顶点%c相对于%c的下一邻接点\n",G.vertices[num].data,G.vertices[num2].data);
            return -1;
        }
    }
}

10 DFS

void DFS(ALGraph G,int v,int V[])
{
    int i,j;
    printf("%c",G.vertices[v].data);
    V[v]=1;
    ArcNode *p=G.vertices[v].firstarc;
    while(p)
    {
        v=p->adjvex;
        if(!V[v])
            DFS(G,v,V);
        p=p->nextarc;
    }
}

void DFSTraverse(ALGraph G,int V[])
{
    printf("请输入起点元素\n");
    int m1,i;
    char v1;
     fflush(stdin);
    scanf("%c",&v1);
    m1=Locate(G,v1);
    for(i=0;i<G.vexnum;i++)
    {
        V[i]=0;
    }
        DFS(G,m1,V);
    for(i=0;i<G.vexnum;i++)
    {
        if(V[i]==0)
            DFS(G,i,V);
    }
}

11 建队列,进队列,退出队列,判空队列,求队首元素(为BFS准备)

//建队列
void InitQueue(SqQueue &Q,ALGraph G)
{
    Q.base=(int *)malloc(G.vexnum*sizeof(int));
    Q.front=Q.rear=0;
    Q.maxsize=G.vexnum;
}

//进队列
void EnQueue(SqQueue &Q,int v)
{
    Q.base[Q.rear]=v;
    Q.rear = (Q.rear+1)%Q.maxsize;
}

//退出队列
void DeQueue(SqQueue &Q,int &v)
{
    v=Q.base[Q.front];
    Q.front=(Q.front+1)%Q.maxsize;
}

int IsNullQueue(SqQueue Q)
{
    if(Q.front==Q.rear)
        return 1;
    else 
        return 0;
}

int firstqueue(SqQueue Q)
{
    return Q.base[Q.front];
}

12 判断图空

int firstqueue(SqQueue Q)
{
    return Q.base[Q.front];
}

13 BFS操作

void BFS(ALGraph G,int v,SqQueue Q,int V[])
{
    int i,j;
    ArcNode *p;
    printf("%c",G.vertices[v].data);
    V[v]=1;
    EnQueue(Q,v);
    while(!IsNullQueue(Q))
    {
        //j=firstqueue(Q);
        DeQueue(Q,v);
        p=G.vertices[v].firstarc;
        while(p!=NULL)
        {
            if(V[p->adjvex]==0)
            {
                printf("%c",G.vertices[p->adjvex].data);
                V[p->adjvex]=1;
                EnQueue(Q,p->adjvex);
                
            }
            p=p->nextarc;
        }
    }
}

void BFSTraverse(ALGraph G,SqQueue Q,int V[])
{
    int i,v;char v1;
    for(i=0;i<G.vexnum;i++)
        V[i]=0;
    fflush(stdin);
    printf("请输入起点顶点\n");
    scanf("%c",&v1);
    v=Locate(G,v1);
    BFS(G,v,Q,V);
    for(i=0;i<G.vexnum;i++)
    {
        if(V[i]==0)
            BFS(G,i,Q,V);
    }
}

14 拓扑排序


void TopologicalSort(ALGraph G)
{
    SqStack S;
    int i,count,k;
    ArcNode *p;
    InitStack(S);
    for(i=0;i<G.vexnum;i++)
    {
        if(G.vertices[i].in==0)
            Push(S,i);
    }
    count = 0;
    while(!IsNullStack(S))
    {
        Pop(S,&i);
        printf("%d,%c",i,G.vertices[i].data);
        ++count;
        for(p=G.vertices[i].firstarc;p;p=p->nextarc)
        {
            k=p->adjvex;
            if(!(--G.vertices[k].in))
            Push(S,k);
        }
        
    }
    if(count<G.vexnum)
            printf("此图不是有向无环图\n");
        else
            printf("此图是有向无环图\n");
}

15 Switch

void pro()
{
    printf("0.退出\n");
    printf("1.建立一个有向图\n");
    printf("2.建立一个无向图\n");
    printf("3.打印邻接表的样式\n");
    printf("4.深度优先遍历\n");
    printf("5.广度优先遍历\n");
    printf("6.拓扑排序判断是否为有向无环图\n");
}

void switchs(ALGraph G,SqQueue Q,int V[])
{
    int num;
    pro();
    printf("请输入功能数字\n");
    scanf("%d",&num);
    while(num)
    {
        switch(num)
        {
            case 0:
                num=0;
                break;
            case 1:
                CreatALGraphYouXiang(G);
            break;
            case 2:
                CreatALGraphWuXiang(G);
            break;
            case 3:
                showLinJieBiao(G);
            break;
            case 4:
                DFSTraverse(G,V);
            break;
            case 5:
                BFSTraverse(G,Q,V);
            break;
            case 6:
                TopologicalSort(G);
            break;
            default:
                printf("输入错误请重新输入\n");
        }
            printf("\n\n");
            pro();
            printf("请输入功能数字\n");
            scanf("%d",&num);
    }
}

//主函数
int main()
{
    ALGraph G;
    SqQueue Q;
    InitQueue(Q,G);
    int V[20];
    switchs(G,Q,V);
}

16 全部代码

#include<stdio.h>
#include<stdlib.h>
#include <iostream>
#include <string>
#include<queue>

#define Stack_Init_Size 100
#define max 100
typedef struct ArcNode
{
    int adjvex;
    struct ArcNode *nextarc;
    char *Info;
}ArcNode;
typedef struct VNode
{
    int in;
    char data;
    ArcNode *firstarc;
}Vode,AdjList[max];
typedef struct
{
    AdjList vertices;
    int vexnum,arcnum;
    int kind; //无用;
}ALGraph;
typedef struct{
    int rear;
    int front;
    int *base;
    int maxsize;
}SqQueue;
typedef struct
{
    int *base;
    int *top;
    int stacksize;    
}SqStack;

int Locate(ALGraph G,char v);//定位函数
void CreatALGraphYouXiang(ALGraph &G);
void CreatALGraphWuXiang(ALGraph &G);
void showLinJieBiao(ALGraph G);
int FirstAdjVex(ALGraph G,char v);
int NextAdjVex(ALGraph G,char v,char w);
void DFS(ALGraph G,int v,int V[]);
void DFSTraverse(ALGraph G,int V[]);
void InitQueue(SqQueue &Q,ALGraph G);
void EnQueue(SqQueue &Q,int v);
void DeQueue(SqQueue &Q,int &v);
int IsNullQueue(SqQueue Q);
int firstqueue(SqQueue Q);
void IsNullGraph(int flag);
void BFS(ALGraph G,int v,SqQueue Q,int V[]);
void BFSTraverse(ALGraph G,SqQueue Q,int V[]);
void InitStack(SqStack &S);
void Push(SqStack &S,int e);
int Pop(SqStack &S,int *e);
int IsNullStack(SqStack S);
void TopologicalSort(ALGraph G);
void pro();
void switchs(ALGraph G,SqQueue Q,int V[]);

void InitStack(SqStack &S)
{
    //建栈
    S.base=(int*)malloc(Stack_Init_Size*sizeof(int));
    S.top=S.base;
    S.stacksize=Stack_Init_Size;
}

void Push(SqStack &S,int e)
{
    *S.top++=e;
}

int Pop(SqStack &S,int *e)
{   
    //弹栈,并且返回出弹栈元素
    *e=*--S.top;
}

int IsNullStack(SqStack S)
{
    //判断栈是否为空
    if(S.base==S.top||S.base==NULL)
        return 1;
    else 
        return 0;
}

int Locate(ALGraph G,char v)//定位函数
{
    int i;
    for(i=0;i<G.vexnum;i++)
    {
        if(v==G.vertices[i].data)
            return i;
    }
    return -1;
}

//建立邻接表函数(有向图)
void CreatALGraphYouXiang(ALGraph &G)
{
    int i;
    printf("请输入邻接表顶点的个数和边的个数\n");
    scanf("%d%d",&G.vexnum,&G.arcnum);
    getchar();
    printf("请输入邻接表顶点入度和顶点\n");
    for(i=0;i<G.vexnum;i++)
    {
        
        scanf("%d %c",&G.vertices[i].in,&G.vertices[i].data);
        getchar();
        G.vertices[i].firstarc=NULL;
    }
    printf("请输入两个顶点,即两个得关系\n");
    for(i=0;i<G.arcnum;i++)
    {
        char v1,v2;
        scanf("%c %c",&v1,&v2);
        getchar();
        int l1=Locate(G,v1);
        int l2=Locate(G,v2);
        ArcNode *p1=(ArcNode *)malloc(sizeof(ArcNode));
        p1->adjvex=l2;
        p1->nextarc=G.vertices[l1].firstarc;
        G.vertices[l1].firstarc=p1;
    }
}

//建立无向图
void CreatALGraphWuXiang(ALGraph &G)
{
    int i;
    printf("请输入邻接表顶点的个数和边的个数\n");
    scanf("%d%d",&G.vexnum,&G.arcnum);
    getchar();
    printf("请输入邻接表的全部顶点\n");
    for(i=0;i<G.vexnum;i++)
    {
        
        scanf("%c",&G.vertices[i].data);
        getchar();
        G.vertices[i].firstarc=NULL;
    }
    printf("请输入两个顶点,即两个得关系\n");
    for(i=0;i<G.arcnum;i++)
    {
        char v1,v2;
        scanf("%c %c",&v1,&v2);
        getchar();
        int l1=Locate(G,v1);
        int l2=Locate(G,v2);
        ArcNode *p1=(ArcNode *)malloc(sizeof(ArcNode));
        p1->adjvex=l2;
        p1->nextarc=G.vertices[l1].firstarc;
        G.vertices[l1].firstarc=p1;
        ArcNode *p2=(ArcNode *)malloc(sizeof(ArcNode));
        p2->adjvex=l1;
        p2->nextarc=G.vertices[l2].firstarc;
        G.vertices[l2].firstarc=p2;
    }
}

void showLinJieBiao(ALGraph G)
{
    int i;
    ArcNode *p;
    for(i=0;i<G.vexnum;i++)
    {
        printf("%c ",G.vertices[i].data);
        p=G.vertices[i].firstarc;
        while(p)
        {
            printf(" -> %c",G.vertices[p->adjvex].data);
            p=p->nextarc;
        }
        printf(" -> NULL ");
        printf("\n");
    }
}

//元素v对应的第一个邻接点
int FirstAdjVex(ALGraph G,char v)
{
    int num;
    num=Locate(G,v);
    if(num==-1)
    {
        printf("没有邻接点\n");
        return -1;
    }
    if(G.vertices[num].firstarc==NULL)
    {
        printf("没有邻接点\n");
        return -1;
    }
    return G.vertices[num].firstarc->adjvex;
}

//返回G中顶点v相对于u的下一邻接点
int NextAdjVex(ALGraph G,char v,char w)
{
    int num = Locate(G,v);
    int num2 = Locate(G,w);
    if(num==-1)
        return -1;
    else{
        ArcNode *p = G.vertices[num].firstarc;
        while(p!=NULL&&p->adjvex!=num2)
        {
            p=p->nextarc;
        }
        if(p->nextarc==NULL)
        {
            printf("G中顶点%c相对于%c的下一邻接点\n",G.vertices[num].data,G.vertices[num2].data);
            return -1;
        }
    }
}

/*void DFS(ALGraph G,int w,int V[])
{
    int num,i;
    char v;

    printf("%c ",G.vertices[num].data);
        V[w]=0;
    for(i=FirstAdjVex(G,G.vertices[num].data);i>=0;i=NextAdjVex(G,G.vertices[num].data,G.vertices[i].data))
        if(!V[i])
            DFS(G,i,V);
}

//DFS
void DFSTraverse(ALGraph G,int V[])
{
    int i,num;
    char v;
    for(i=0;i<G.vexnum;i++)
        V[i]=0;
    printf("请输入一个开始访问的结点\n");
    getchar();
    scanf("%c",&v);
    num=Locate(G,v);
    DFS(G,num,V);
    for(i=0;i<G.vexnum;i++)
        if(V[i]==0)
            DFS(G,i,V);
}*/
void DFS(ALGraph G,int v,int V[])
{
    int i,j;
    printf("%c",G.vertices[v].data);
    V[v]=1;
    ArcNode *p=G.vertices[v].firstarc;
    while(p)
    {
        v=p->adjvex;
        if(!V[v])
            DFS(G,v,V);
        p=p->nextarc;
    }
}

void DFSTraverse(ALGraph G,int V[])
{
    printf("请输入起点元素\n");
    int m1,i;
    char v1;
     fflush(stdin);
    scanf("%c",&v1);
    m1=Locate(G,v1);
    for(i=0;i<G.vexnum;i++)
    {
        V[i]=0;
    }
        DFS(G,m1,V);
    for(i=0;i<G.vexnum;i++)
    {
        if(V[i]==0)
            DFS(G,i,V);
    }
}

//建队列
void InitQueue(SqQueue &Q,ALGraph G)
{
    Q.base=(int *)malloc(G.vexnum*sizeof(int));
    Q.front=Q.rear=0;
    Q.maxsize=G.vexnum;
}

//进队列
void EnQueue(SqQueue &Q,int v)
{
    Q.base[Q.rear]=v;
    Q.rear = (Q.rear+1)%Q.maxsize;
}

//退出队列
void DeQueue(SqQueue &Q,int &v)
{
    v=Q.base[Q.front];
    Q.front=(Q.front+1)%Q.maxsize;
}

int IsNullQueue(SqQueue Q)
{
    if(Q.front==Q.rear)
        return 1;
    else 
        return 0;
}

int firstqueue(SqQueue Q)
{
    return Q.base[Q.front];
}
void IsNullGraph(int flag)
{
    if(flag==0)
    {
        printf("图为空\n");
    }else{
        printf("图不为空\n");
    }
}

void BFS(ALGraph G,int v,SqQueue Q,int V[])
{
    int i,j;
    ArcNode *p;
    printf("%c",G.vertices[v].data);
    V[v]=1;
    EnQueue(Q,v);
    while(!IsNullQueue(Q))
    {
        //j=firstqueue(Q);
        DeQueue(Q,v);
        p=G.vertices[v].firstarc;
        while(p!=NULL)
        {
            if(V[p->adjvex]==0)
            {
                printf("%c",G.vertices[p->adjvex].data);
                V[p->adjvex]=1;
                EnQueue(Q,p->adjvex);
                
            }
            p=p->nextarc;
        }
    }
}

void BFSTraverse(ALGraph G,SqQueue Q,int V[])
{
    int i,v;char v1;
    for(i=0;i<G.vexnum;i++)
        V[i]=0;
    fflush(stdin);
    printf("请输入起点顶点\n");
    scanf("%c",&v1);
    v=Locate(G,v1);
    BFS(G,v,Q,V);
    for(i=0;i<G.vexnum;i++)
    {
        if(V[i]==0)
            BFS(G,i,Q,V);
    }
}

void TopologicalSort(ALGraph G)
{
    SqStack S;
    int i,count,k;
    ArcNode *p;
    InitStack(S);
    for(i=0;i<G.vexnum;i++)
    {
        if(G.vertices[i].in==0)
            Push(S,i);
    }
    count = 0;
    while(!IsNullStack(S))
    {
        Pop(S,&i);
        printf("%d,%c",i,G.vertices[i].data);
        ++count;
        for(p=G.vertices[i].firstarc;p;p=p->nextarc)
        {
            k=p->adjvex;
            if(!(--G.vertices[k].in))
            Push(S,k);
        }
        
    }
    if(count<G.vexnum)
            printf("此图不是有向无环图\n");
        else
            printf("此图是有向无环图\n");
}

void pro()
{
    printf("0.退出\n");
    printf("1.建立一个有向图\n");
    printf("2.建立一个无向图\n");
    printf("3.打印邻接表的样式\n");
    printf("4.深度优先遍历\n");
    printf("5.广度优先遍历\n");
    printf("6.拓扑排序判断是否为有向无环图\n");
}

void switchs(ALGraph G,SqQueue Q,int V[])
{
    int num;
    pro();
    printf("请输入功能数字\n");
    scanf("%d",&num);
    while(num)
    {
        switch(num)
        {
            case 0:
                num=0;
                break;
            case 1:
                CreatALGraphYouXiang(G);
            break;
            case 2:
                CreatALGraphWuXiang(G);
            break;
            case 3:
                showLinJieBiao(G);
            break;
            case 4:
                DFSTraverse(G,V);
            break;
            case 5:
                BFSTraverse(G,Q,V);
            break;
            case 6:
                TopologicalSort(G);
            break;
            default:
                printf("输入错误请重新输入\n");
        }
            printf("\n\n");
            pro();
            printf("请输入功能数字\n");
            scanf("%d",&num);
    }
}

//主函数
int main()
{
    ALGraph G;
    SqQueue Q;
    InitQueue(Q,G);
    int V[20];
    switchs(G,Q,V);
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值