问一道数据结构 求无向图和邻接表的习题麻烦老师讲解.

编辑: admin           2017-23-02         

    类似问题

    类似问题1:数据结构:无向图适合邻接矩阵,有向图适合邻接表这句话对吗,并给出理由[数学科目]

    这句话不对,邻接表和邻接矩阵,即可以存储无向图也可以存储有向图,稠密图适合用邻接矩阵,稀疏图适合用邻接表存储

    类似问题2:数据结构题.假定无向图G有6个结点和9条边,.(1) 画出G的邻接距阵和邻接表(2) 根据邻接表从顶点3假定无向图G有6个结点和9条边,并依次输入这9条边为(0,1)(0,2)(0,4)(0,5)(1,2)(2,3)(2

    #include<stdio.h>

    #include<stdlib.h>

    #include<conio.h>

    #include<malloc.h>

    #define maxsize 64

    #define TRUE 1

    #define FALSE 0

    #define  n  6

    #define  e  9

    typedef char datatype ;

    typedef char vextype;

    typedef int adjtype;

     

    typedef struct 

    {

     vextype vexs[maxsize];

     adjtype arcs[maxsize][maxsize];

    }graph;

     

    typedef struct 

    {

     datatype data[maxsize];

     int front,rear;

    }sequeue;

     

    typedef struct node 

    {

     int adjvex;

     struct node *next;

    }edgenode;

    typedef struct

    {

     vextype vertex;

     edgenode *link;

    }vexnode;

     

    vexnode gl[maxsize];

    graph  *ga;

    sequeue *Q;

     

    graph *CREATGRAPH()

    {

     int i,j,k;

     char ch;

     system("cls");

     scanf("%c",&ch);

     printf("\n请输入顶点信息(邻接矩阵):  ");

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

      scanf("%c",&ga->vexs[i]);

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

      for(j=1;j<=n;j++)

       ga->arcs[i][j]=0;

      printf("\n输入节点信息与权值:\n");

      for(k=0;k<e;k++)

      {

       scanf("%d%d",&i,&j);//读入一条变得两端顶点序号i,j及边上的权值

       ga->arcs[i][j]=1;

       ga->arcs[j][i]=1;

      }

      return ga;

    }

     

    void PRINT()

    {

     int i,j;

     system("cls");

     printf("\n对应的邻接矩阵是:\n\n");

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

     {

      for(j=1;j<=n;j++)

       printf("%5d",ga->arcs[i][j]);

      printf("\n");

     }

    }

     

    void CREATADJLIST()

    {

     int i,j,k;

     edgenode *s;

     char ch;

     system("cls");

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

     scanf("%c",&ch);

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

     { 

      gl[i].vertex=getchar();

      gl[i].link=NULL;

     }

     printf("输入边表节点信息:\n");

     for(k=1;k<=e;k++)

     {

          scanf("%d %d",&i,&j);

          s=(edgenode *)malloc(sizeof(edgenode));

          s->adjvex=j;

          s->next=gl[i].link;

          gl[i].link=s;

          s=(edgenode *)malloc(sizeof(edgenode));

          s->adjvex=i;

          s->next=gl[j].link;

          gl[j].link=s;

        }

    }

     

    void PRINTL()

    {

     int i;

     edgenode *s;

     system("cls");

     printf("\n对应的邻接表是:\n");

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

     {

       s=gl[i].link;

       printf("%3c",gl[i].vertex);

     

       while(s!=NULL)

       {

      printf("%5d",s->adjvex);

      s=s->next;

       }

       printf("\n");

     }

    }

     

    sequeue *SETNULL(sequeue *P)

    {

     P->front=maxsize-1;

     P->rear=maxsize-1;

     return P;

    }

     

    int EMPTY(sequeue *Q)

    {

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

      return TRUE;

     else

      return FALSE;

    }

     

    sequeue *ENQUEUE(sequeue *Q,int k)

    {

     if(Q->front==(Q->rear+1)%maxsize)

     {

      printf("队列已满!\n");

      return NULL;

     }

     else

     {

      Q->rear=(Q->rear+1)%maxsize;

      Q->data[Q->rear]=k;

     }

     return Q;

    }

    int DEQUEUE(sequeue *Q)

    {

     if(EMPTY(Q))

     {

      printf("队列为空,无法出队!\n");

      return FALSE;

     }

     else

     {

      Q->front=(Q->front+1)%maxsize;

      return Q->data[Q->front];

     }

     return 1;

    }

    void BFS(int k)

    {

      int i,j;

      int visited[maxsize]={0};

      printf("\n广度优先遍历后得到的序列是: ");

      Q=SETNULL(Q); 

      printf("%3c",ga->vexs[k]);

      visited[k]=TRUE;

      Q=ENQUEUE(Q,k);

      while(!EMPTY(Q))

      {

      i=DEQUEUE(Q);

      for(j=1;j<=n;j++)

      if((ga->arcs[i][j]==1)&&(!visited[j]))

        {

        printf("%3c",ga->vexs[j]);

         visited[j]=TRUE;

         Q=ENQUEUE(Q,j);

       }

     }

      printf("\n\n深度优先遍历后得到的序列是: ");

     

    }

     

    void BFSL(int k)

    {

       int i;

       int visited[maxsize]={0};

       edgenode *p;

       Q=SETNULL(Q); 

       printf("\n广度优先遍历后得到的序列是: ");

       printf("%3c",gl[k].vertex);

       visited[k]=TRUE;

       Q=ENQUEUE(Q,k);

       while(!EMPTY(Q))

       {

      i=DEQUEUE(Q);

      p=gl[i].link;

      while(p!=NULL)

      {

       if(!visited[p->adjvex])

       {

        printf("%3c",gl[p->adjvex].vertex);

                  visited[p->adjvex]=TRUE;

                  Q=ENQUEUE(Q,p->adjvex);

       }

       p=p->next; 

      }

     }

       printf("\n\n深度优先遍历后得到的序列是: ");

    }

     

    void  DFS(int i)

    {

       int j;

       static int visited[maxsize]={0};   

       printf("%3c",ga->vexs[i]);

       visited[i]=TRUE;

       for(j=1;j<=n;j++)

         if((ga->arcs[i][j]==1)&&(!visited[j]))

      DFS (j);

    }

    void DFSL(int k)

    {

     int j;

     edgenode *p;

     static int visited[maxsize]={0}; 

     printf("%3c",gl[k].vertex);

     visited[k]=TRUE;

     p=gl[k].link; 

     while(p)

     {

      j=p->adjvex;

      if(!visited[j])

      DFSL(j);

      p=p->next;

     }

    }

    void main()

    {

     int i,k;

     int ch;

     Q=malloc(sizeof(graph));

     ga=malloc(sizeof(graph));

     while(1)

     {

      printf("\n\n\n");

      printf("输入你的选择: ");

      scanf("%d",&ch);

      switch(ch)

      {

      case 1: CREATADJLIST();

        PRINTL();

        printf("想从第几号结点开始: ");

        scanf("%d",&k);

        BFSL(k);

        DFSL(k);break;

      case 2: ga=CREATGRAPH();

        PRINT();

        printf("想从第几号结点开始: ");

        scanf("%d",&i);

        BFS(i);

        DFS(i);break;

      case 3:exit (0);

      }

     

    }

    }

     

     

     

     

    PS:下标从1开始的,输入矩阵的对应元素时要按你的顺序输入  输入表的顺序是要逆序输入 否则两者答案不匹配 因为表的选择要有大小要求的 你可以试一下.

     

     

    类似问题3:数据结构关于图的一道题[数学科目]

    题在哪呢?

    你是要找题...?

    类似问题4:数据结构与算法实验题 条形图轮廓问题★实验任务在x 轴上水平放置着n 个条形图.条形图的轮廓是消去这n 个条形图的隐藏线后得到的图形,如图所示.每个条形图由3 元组(Li,Hi,Ri)表示.其中,[数学科目]

    #include

    #include

    #include

    #define LBound (-3000)

    #define UBound 3000

    #define Cod2Idx(x) ((x)-LBound)

    #define Size Cod2Idx(UBound+1)

    int main() {

    int hs[Size],n;

    int i,l,r,h,i0,i1;

    memset(hs,0,sizeof(*hs) * Size);

    scanf("%d",&n);

    for (i0=UBound,i1=LBound; n>0; n--) {

    scanf("%d %d %d",&l,&h,&r);

    if (l < i0) i0 = l;

    if (r > i1) i1 = r;

    for (i=l; i

    类似问题5:【数据结构】 填空第14题 求图求解析

    树的形状如下:

    A

    / \

    B C

    \ / \

    D E F

    / \

    G H

    所以中序遍历为:BGDAEHCF

  •   4
  • 相关文章

    专利代理人资格考试
    初级经济师考试
    执业医师考试
    教师资格证考试
    同等学力申硕考试
    AP考试
    CCIE考试
    营养师考试
    bec考试
    gre
Copyright ©2009-2021 逆火网训All Rights Reserved.     滇ICP备2023009294号-57