图的链式存储以及遍历各种操作

来源:互联网 发布:apache flink 安装 编辑:程序博客网 时间:2024/05/21 19:28

CodeBlocks编写


#include<bits/stdc++.h>using namespace std;struct LinkNode{    int data;    LinkNode *next;};struct node{   int num;   LinkNode *first;   int sum;};void chushihua(node* L,int n);                   //初始化void creatY(node* L,int n,int m);               //创建有向图void creatW(node* L,int n,int m);              //创建无向图void add(node &LL,int to);                    //把节点添加到图中区void out(node *L,int n);                     //输出图void du(node *L,int n);                     // 有向图的度void dfs(node *L,int i,int n,int *flag);   //深度优先搜索遍历无向图void bfs(node *L,int n,int *flag);        //广搜遍历无向图int main(){    printf("有向图及无向图的操作\n");    int ny,my,nw,mw;    printf("建立有向图,请输入节点个数n和边数m\n");    scanf("%d%d",&ny,&my);    printf("请输入m条边对应邻接点\n");    node LY[ny+1];    chushihua(LY,ny);    creatY(LY,ny,my);    printf("建立无向图,请输入节点个数n和边数m\n");    scanf("%d%d",&nw,&mw);    node LW[nw+1];    printf("请输入m条边对应邻接点\n");    chushihua(LW,nw);    creatW(LW,nw,mw);    printf("\n有向图邻接表为 \n");    out(LY,ny);    printf("有向图各个顶点的度为 \n");    du(LY,ny);    printf("\n");    printf("有向图邻接表为 \n");    out(LW,nw);    int flag[nw+1];    for(int i=1;i<=nw;i++)        flag[i]=0;    printf("无向图深度优先搜索遍历顺序如下\n");    for(int i=1;i<=nw;i++)    {        if(!flag[i])        {            printf("%d ",i);            flag[i]=1;            dfs(LW,i,nw,flag);        }    }    for(int i=1;i<=nw;i++)        flag[i]=0;    printf("\n无向图广度优先搜索遍历顺序如下\n");    bfs(LW,nw,flag);    free(flag);    return 0;}void chushihua(node* L,int n){  int i=0;  for(i=1;i<=n;i++)  {    L[i].num=i;    L[i].first=NULL;    L[i].sum=0;  }}void creatY(node* L,int n,int m){    int i,from,to;    for(i=1;i<=m;i++)    {        scanf("%d%d",&from,&to);        add(L[from],to);    }}void creatW(node* L,int n,int m){    int i,from,to;    for(i=1;i<=m;i++)    {        scanf("%d%d",&from,&to);        if(from==to)            add(L[from],to);        else        {           add(L[from],to);           add(L[to],from);        }    }}void add(node &LL,int to){    LinkNode *p,*q;    q = (LinkNode *)malloc(sizeof(LinkNode));    q->data=to;    q->next=NULL;    p=LL.first;    LL.sum++;    if(LL.first==NULL)    {       LL.first=q;       return;    }    while(p->next)    {        p=p->next;    }    p->next=q;}void out(node *L,int n){   int i;   for(i=1;i<=n;i++)   {       LinkNode *p=L[i].first;       printf("与%d邻接的有   ",i);       while(p)       {           printf("%d  ",p->data);           p=p->next;       }       printf("\n");   }   printf("\n");}void du(node *L,int n){    int i;    for(i=1;i<=n;i++)    {        printf("%d的度为 %d\n",i,L[i].sum);    }}void dfs(node *L,int i,int n,int *flag){    LinkNode *p=L[i].first;    if(p==NULL)        return;    while(p)    {        if(!flag[p->data])        {            printf("%d ",p->data);            flag[p->data]=1;            dfs(L,p->data,n,flag);        }        p=p->next;    }}void bfs(node *L,int n,int *flag){    int l,r;    l=0;    int Queue[2*n+1];    Queue[0]=1;    flag[1]=1;    r=1;    while(l<r)    {        LinkNode *p=L[Queue[l]].first;        printf("%d ",Queue[l]);        while(p)        {            if(!flag[ p->data ])            {                flag[p->data]=1;                Queue[r++]=p->data;            }            p=p->next;        }        l++;    }}



0 0