回 帖 发 新 帖 刷新版面

主题:邻接表无向图生成树算法实现疑问

这个程序用来实现深度优先生成树的遍历,
但是总是无法通过遍历生成的二叉链表来打印对应的生成树接点
实在不清楚我那里写错了
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define mvern 20
#define Null 0
#define flase -1
#define truth 1
typedef char vertextype;
typedef struct arcnode
{
    int adjvex;
    struct arcnode *nextarc;
    /* int info;*/
}arcnode;

typedef struct vnode
{
    vertextype data[2];
    arcnode *firstarc;
}vnode;

typedef struct vnode adjlist[mvern];

typedef struct algraph
{
    adjlist vertices;
    int vexnum,arcnum;
    int kind;
}algraph;

int v,a,first,visited[mvern];



typedef struct csnode
{
  int data;
  struct csnode *firstch,*nextsibling;
}csnode,*cstree;

void creatal(algraph *x)
{
   algraph *g;
   arcnode *s;
   int i,j,m,n,k;
   char c1[2],c2[2];
   g=x;
   printf("\nPlease input the vexn and arcn:\n");
   scanf("%d%d",&g->vexnum,&g->arcnum);
   v=g->vexnum;
   a=g->arcnum;
   printf("g->vexnum=%d g->arcnum=%d\n",g->vexnum,g->arcnum);
   fflush(stdin);
   printf("\nPlease input the vexdata:\n");
   for(i=0;i<g->vexnum;++i)
    {
        scanf("%s",&g->vertices[i].data);
        g->vertices[i].firstarc=Null;
        fflush(stdin);
    }
   for(i=0;i<g->vexnum;++i)
    {
        printf("%s %d\n",g->vertices[i].data,g->vertices[i].firstarc);
    }
  printf("\nPlease input the vm->vn:\n");
  fflush(stdin);
  for(i=0;i<g->arcnum;++i)
   {
      scanf("%s",&c1);fflush(stdin);
      m=locate(g,&c1);
      scanf("%s",&c2);
      n=locate(g,&c2);
      fflush(stdin);
      s=(struct arcnode *) malloc (sizeof(struct arcnode));
      s->adjvex=n;
      s->nextarc=g->vertices[m].firstarc;
      g->vertices[m].firstarc=s;
      s=(struct arcnode *) malloc (sizeof(struct arcnode));
      s->adjvex=m;
      s->nextarc=g->vertices[n].firstarc;
      g->vertices[n].firstarc=s;

   }
}

int locate(algraph *x,char z[2])
{
    int i;
    for(i=0;i<x->vexnum;++i)
     {
        if(strcmp((x->vertices[i].data),z)==0)
         {
           printf("\nlocate i =%d\n",i);
           return (i);
           break;
         }
     }
}

void print(algraph *y)
{
    algraph *g;
    arcnode *p;
    int i,j,k;
    g=y;
    for(k=0;k<g->vexnum;++k)
    {
        printf("%s->",g->vertices[k].data);
        p=g->vertices[k].firstarc;
        while(p)
        {
            printf("%d",p->adjvex);
            p=p->nextarc;
            if(p!=Null) printf("->");
        }
        printf("\n");
    }
}

dfsforest(algraph *x,csnode *t)
{
    algraph *g;
    csnode *p,*q;
    int vi,i,j,k;
    g=x;
    /* t=(struct csnode *) malloc (sizeof(struct csnode));*/
    t=NULL;
    for(vi=0;vi<g->vexnum;vi++)
     {
       visited[vi]=-1;
     }
    for(vi=0;vi<g->vexnum;vi++)
     {
        if(visited[vi]==-1)
         {
           p=(struct csnode *) malloc (sizeof(struct csnode));
           p->data=vi;
           printf("\np->data=%d\n",p->data);
           p->firstch=NULL;
           p->nextsibling=NULL;
           if(t==NULL) {t=p;}
           else  {q->nextsibling=p;}
           q=p;
           dfstree(g,vi,p);
         }
     }
}

dfstree(algraph *x,int vi,csnode *t)
{
    algraph *g;
    arcnode *s;
    csnode *p,*q;
    int w;
    g=x;
    visited[vi]=truth;
    first=truth;
    printf("dfstree visit vertex:%s\n",g->vertices[vi].data);//访问顶点vi
    for(w=FirstAdjVex(g,vi);w>=0;w=NextAdjVex(g,vi,w))
    {
       if(visited[w]==flase)//若vi尚未被访问
         {
            p=(struct csnode *) malloc (sizeof(struct csnode));
            p->data=w;
            p->firstch=NULL;
            p->nextsibling=NULL;
            if(first==truth)
              {
                t->firstch=p;
                first=flase;
              }
            else{q->nextsibling=p;}
            q=p;
            dfstree(g,w,q);
         }

    }

}

int FirstAdjVex(algraph *G,int vi)
{
   arcnode *p;
   p=G->vertices[vi].firstarc; // vi为顶点在图G中的序号
   if(p)
     return p->adjvex;
   else
     return -1;
}

int NextAdjVex(algraph *G,int vi,int w)
 { // 初始条件: 图G存在,v是G中某个顶点,w是v的邻接顶点
   // 操作结果: 返回v的(相对于w的)下一个邻接顶点的序号。
   //           若w是v的最后一个邻接点,则返回-1
   arcnode *p;
   p=G->vertices[vi].firstarc;
   while(p&&p->adjvex!=w) // 指针p不空且所指表结点不是w
     p=p->nextarc;
   if(!p||!p->nextarc) // 没找到w或w是最后一个邻接点
     return -1;
   else // p->adjvex==w
     return p->nextarc->adjvex; // 返回v的(相对于w的)下一个邻接顶点的序号
 }


csvisit(csnode *cs)
{
    if(cs!=NULL)
     {
        printf("%d",cs->data);
        csvisit(cs->firstch);
        csvisit(cs->nextsibling);
     }
}

main()
{
  algraph *G;
  csnode *t;
  int i;
  G=(struct algraph *) malloc (sizeof(struct algraph));
  creatal(G);
  print(G);
  dfsforest(G,t);
  csvisit(t);
}

回复列表 (共6个回复)

沙发

没人理我啊

板凳

帮帮我吧

3 楼

又重写了一次,问题依旧,奇怪啊,
仍然无法输出遍历生成树
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define mvern 20
#define flase -1
#define truth 1
int visited[mvern];
typedef char vertextype;
typedef struct vnode adjlist[mvern];
typedef struct arcnode
{
    int adjvex;
    struct arcnode *nextarc;
    /* int info;*/
}arcnode;

typedef struct vnode
{
    vertextype data[2];
    arcnode *firstarc;
}vnode;

typedef struct algraph
{
    adjlist vertices;
    int vexnum,arcnum;
    int kind;
}algraph;

typedef struct csnode
{
    char csn[2];
    struct csnode *firstcl,*nextsibling;
}csnode;

void creatal(algraph *g)
{
   arcnode *s;
   int i,j,m,n,k;
   char *c1,*c2;
   printf("\nPlease input the vexn and arcn:\n");
   scanf("%d%d",&g->vexnum,&g->arcnum);
   fflush(stdin);
   printf("g->vexnum=%d g->arcnum=%d\n",g->vexnum,g->arcnum);
   printf("\nPlease input the vexdata:\n");
   for(i=1;i<=g->vexnum;i++)
    {
        printf("\ni=%d",i);
        scanf("%s",&g->vertices[i].data);
        g->vertices[i].firstarc=NULL;
        fflush(stdin);
    }
   for(i=1;i<=g->vexnum;i++)
    {
        printf("%s %d\n",g->vertices[i].data,g->vertices[i].firstarc);
    }
  printf("\nPlease input the vm->vn:\n");
  fflush(stdin);
  for(i=1;i<=g->arcnum;i++)
   {
      scanf("%s",&c1);
      m=locate(g,&c1);
      scanf("%s",&c2);
      n=locate(g,&c2);
      fflush(stdin);
      s=(struct arcnode *) malloc (sizeof(struct arcnode));
      s->adjvex=n;
      s->nextarc=g->vertices[m].firstarc;
      g->vertices[m].firstarc=s;
      s=(struct arcnode *) malloc (sizeof(struct arcnode));
      s->adjvex=m;
      s->nextarc=g->vertices[n].firstarc;
      g->vertices[n].firstarc=s;

   }
}

int locate(algraph *x,char *z)
{
    int i;
    for(i=1;i<=x->vexnum;i++)
     {
        if(strcmp((x->vertices[i].data),z)==0)
         {
           printf("\nlocate i =%d\n",i);
           return (i);
           break;
         }
     }
}

4 楼

char *getvex(algraph *x,int v)
{
    char *j,tn[2];
    j=tn;
    if(v<0 || v>x->vexnum) printf("\nget error!\n");
    else
     {
        strcpy(j,x->vertices[v].data);
        printf("%s",j);
        return (j);
     }
}


void print(algraph *g)
{
    arcnode *p;
    int i,j,k;
    for(k=1;k<=g->vexnum;k++)
    {
        printf("%s->",g->vertices[k].data);
        p=g->vertices[k].firstarc;
        while(p!=NULL)
        {
            printf("%d",p->adjvex);
            p=p->nextarc;
            if(p!=NULL) printf("->");
        }
        printf("\n");
    }
}


void dfsforest(algraph *g,csnode *t)
{
    csnode *p,*q,r;
    int v,i,j;
    char *get;
    t=NULL;
    for(v=1;v<=g->vexnum;v++)
     {
       visited[v]=flase;
     }
    for(v=1;v<=g->vexnum;v++)
     {
        if(visited[v]==flase)
         {
           p=(struct csnode *) malloc (sizeof(struct csnode));
           get=getvex(g,v);
           strcpy(p->csn,get);
           printf("\nj3p->data=%s\n",p->csn);
           p->firstcl=NULL;
           p->nextsibling=NULL;
           if(!t) {t=p;printf("\nt->data=%s\n",t->csn);}
           else
           {
             q->nextsibling=p;
           }
           q=p;
           dfstree(g,v,p);
         }
     }
}

dfstree(algraph *x,int v,csnode *t)
{
    algraph *g;
    arcnode *s;
    csnode *p,*q;
    char *j3;
    int w,first;
    g=x;
    visited[v]=truth;
    first=truth;
    printf("dfstree visit vertex:%s\n",g->vertices[v].data);//访问顶点vi
    for(w=FirstAdjVex(g,v);w>=1;w=NextAdjVex(g,v,w))
    {
       printf("\nw=%d\n",w);
       if(visited[w]==flase)//若vi尚未被访问
         {
            p=(struct csnode *) malloc (sizeof(struct csnode));
            j3=getvex(g,v);
            strcpy(p->csn,j3);
            p->firstcl=NULL;
            p->nextsibling=NULL;
            if(first)
              {
                t->firstcl=p;
                first=flase;
              }
            else
                {
                  q->nextsibling=p;
                  printf("\nnext->%s\n",q->nextsibling->csn);}
            q=p;
            dfstree(g,w,q);
         }

    }

}

int FirstAdjVex(algraph *x,int vi)
{
   arcnode *p;
   p=x->vertices[vi].firstarc; // vi为顶点在图G中的序号
   if(p)
     return p->adjvex;
   else
     return -1;
}

5 楼

我终于调试出来了,可是实在不明白为什么树要用二级指针才能正常,望各位指点
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define mvern 20
#define flase -1
#define truth 1
int visited[mvern];
typedef char vertextype;
typedef struct vnode adjlist[mvern];
typedef struct arcnode
{
    int adjvex;
    struct arcnode *nextarc;
    /* int info;*/
}arcnode;

typedef struct vnode
{
    vertextype data[2];
    arcnode *firstarc;
}vnode;

typedef struct algraph
{
    adjlist vertices;
    int vexnum,arcnum;
    int kind;
}algraph;

typedef struct csnode
{
    char csn[2];
    struct csnode *firstcl,*nextsibling;
}csnode;

void creatal(algraph *g)
{
   arcnode *s;
   int i,j,m,n,k;
   char *c1,*c2;
   printf("\nPlease input the vexn and arcn:\n");
   scanf("%d%d",&g->vexnum,&g->arcnum);
   fflush(stdin);
   printf("g->vexnum=%d g->arcnum=%d\n",g->vexnum,g->arcnum);
   printf("\nPlease input the vexdata:\n");
   for(i=1;i<=g->vexnum;i++)
    {
        printf("\ni=%d",i);
        scanf("%s",&g->vertices[i].data);
        g->vertices[i].firstarc=NULL;
        fflush(stdin);
    }
   for(i=1;i<=g->vexnum;i++)
    {
        printf("%s %d\n",g->vertices[i].data,g->vertices[i].firstarc);
    }
  printf("\nPlease input the vm->vn:\n");
  fflush(stdin);
  for(i=1;i<=g->arcnum;i++)
   {
      scanf("%s",&c1);
      m=locate(g,&c1);
      scanf("%s",&c2);
      n=locate(g,&c2);
      fflush(stdin);
      s=(struct arcnode *) malloc (sizeof(struct arcnode));
      s->adjvex=n;
      s->nextarc=g->vertices[m].firstarc;
      g->vertices[m].firstarc=s;
      s=(struct arcnode *) malloc (sizeof(struct arcnode));
      s->adjvex=m;
      s->nextarc=g->vertices[n].firstarc;
      g->vertices[n].firstarc=s;

   }
}

int locate(algraph *x,char *z)
{
    int i;
    for(i=1;i<=x->vexnum;i++)
     {
        if(strcmp((x->vertices[i].data),z)==0)
         {
           //printf("\nlocate i =%d\n",i); test
           return (i);
           break;
         }
     }
}


char *getvex(algraph *x,int v)
{
    char *j,tn[2];
    j=tn;
    if(v<0 || v>x->vexnum) printf("\nget error!\n");
    else
     {
        strcpy(j,x->vertices[v].data);
        //printf("%s",j); test
        return (j);
     }
}


void print(algraph *g)
{
    arcnode *p;
    int i,j,k;
    for(k=1;k<=g->vexnum;k++)
    {
        printf("%s->",g->vertices[k].data);
        p=g->vertices[k].firstarc;
        while(p!=NULL)
        {
            printf("%d",p->adjvex);
            p=p->nextarc;
            if(p!=NULL) printf("->");
        }
        printf("\n");
    }
}

6 楼

void dfsforest(algraph *g,csnode **t)
{
    csnode *p,*q,r;
    int v,i,j;
    char *get;
    (*t)=NULL;
    for(v=1;v<=g->vexnum;v++)
     {
       visited[v]=flase;
     }
    for(v=1;v<=g->vexnum;v++)
     {
        if(visited[v]==flase)
         {
           p=(struct csnode *) malloc (sizeof(struct csnode));
           get=getvex(g,v);
           strcpy(p->csn,get);
           p->firstcl=NULL;
           p->nextsibling=NULL;
           if(!(*t))
           {
             (*t)=p;
             //printf("\nt->data=%d\n",(*t)->csn);
           }
           else
           {
             q->nextsibling=p;
             //printf("\nq->data=%s\n",q->csn);
           }
           q=p;
           dfstree(g,v,&p);
         }
     }
}

dfstree(algraph *x,int v,csnode **t)
{
    arcnode *s;
    csnode *p,*q;
    char *j3;
    int w,first;
    visited[v]=truth;
    first=truth;
    printf("dfstree visit vertex:%s\n",x->vertices[v].data);//访问顶点vi
    for(w=FirstAdjVex(x,v);w>=1;w=NextAdjVex(x,v,w))
    {
        if(visited[w]==flase)//若vi尚未被访问
         {
            p=(struct csnode *) malloc (sizeof(struct csnode));
            j3=getvex(x,w);
            strcpy(p->csn,j3);
            p->firstcl=NULL;
            p->nextsibling=NULL;
            //printf("\nfirst=%d\n",first);
            if(first!=-1)
              {
                (*t)->firstcl=p;
                first=flase;
              }
            else
                {
                  q->nextsibling=p;
                }
            q=p;
            dfstree(x,w,&q);
         }

    }
}
int FirstAdjVex(algraph *x,int vi)
{
   arcnode *p;
   p=x->vertices[vi].firstarc; // vi为顶点在图G中的序号
   if(p)
     return p->adjvex;
   else
     return -1;
}

int NextAdjVex(algraph *x,int vi,int w)
 { // 初始条件: 图G存在,v是G中某个顶点,w是v的邻接顶点
   // 操作结果: 返回v的(相对于w的)下一个邻接顶点的序号。
   //           若w是v的最后一个邻接点,则返回-1
   arcnode *p;
   p=x->vertices[vi].firstarc;
   while(p&&p->adjvex!=w) // 指针p不空且所指表结点不是w
     p=p->nextarc;
   if(!p||!p->nextarc) // 没找到w或w是最后一个邻接点
     return -1;
   else // p->adjvex==w
     return p->nextarc->adjvex; // 返回v的(相对于w的)下一个邻接顶点的序号
 }

TreeEmpty(csnode *x)
 { // 初始条件: 树T存在。操作结果: 若T为空树,则返回TURE,否则返回FALSE
   if(x) // T不空
     return flase;
   else
     return truth;
 }

csvisit(csnode *x)
{

    if(x)
    {
      printf("%s-",x->csn);
      csvisit(x->firstcl);
      csvisit(x->nextsibling);
      if(x->firstcl==NULL && x->nextsibling==NULL) printf("\n****\n");
     }

}

main()
{
  algraph *G;
  csnode *T;
  G=(struct algraph *) malloc (sizeof(struct algraph));
  creatal(G);
  print(G);
  dfsforest(G,&T);
  csvisit(T);
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册