| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1230 人关注过本帖
标题:求指教家谱问题一下,拜托,拜托
只看楼主 加入收藏
jerh1235
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-6-27
结帖率:0
收藏
已结贴  问题点数:20 回复次数:3 
求指教家谱问题一下,拜托,拜托
下面这段源代码,怎么总是运行第二步,第三步,等步骤的时候就会停止运行;
求教大神!!!


#include<stdio.h>
#include<string.h>
#include<malloc.h>
struct node;
node *creat();//建立祖先
void add_child(node *head);//添加家庭成员
void add_brother(node *head);//添加兄弟成员
void print(node *head,char *x);//输出指定家庭成员
int beifen(node *p,char *x);//确定成员辈分
void print1(node *head);//先序遍历 输出家庭成员
void chengyuan(node *head,int s);//输出相应辈分成员
node *shanchu(node *head,char *s);//删除成员

struct node//结构体变量
{
  char data[20];//家庭成员
  int n;//辈分
  node *lchild,*rchild;//左孩子是孩子,右孩子是兄弟
};

node *creat()//建立祖先
{
    node *head;
    head=(node *)malloc(sizeof(node));//分配存储空间
    char s[20];
    printf("输入祖先名字:");
    scanf("%s",&s);
    strcpy(head->data,s);// 赋值
    head->n=1;//分配辈分
    printf("祖先载入成功!\n\n");
    return head;//返回祖先节点(根节点)
}

void add_child(node *head)//添加家庭成员  非递归法
{
            char y[20],x[20];
            node *p,*q;//定义新变量
            q=head;
            printf("输入加入父节点姓名:");
            scanf("%s",&x);//输入父节点
            p=(node *)malloc(sizeof(node));//动态分配存储空间
            printf("输入要添加的孩子:");
            scanf("%s",&y);//输入孩子信息
            strcpy(p->data,y);//赋值到节点
            p->lchild=NULL;//新节点左孩子为空
            p->rchild=NULL;//新节点右孩子为空
             while(q!=NULL)//循环左孩子查找
             {
                if(strcmp(x,q->data)==0)//比较
                {
                    if(q->lchild==NULL)//如果此结点没有孩子则添加到左孩子
                    {
                        p->n=q->n+1;//孩子为父节点的辈分加1
                        q->lchild=p;//新节点为父节点的左孩子节点
                           printf("孩子添加成功!\n");
                            return ;
                    }
                    else//如果此结点有孩子,则找到孩子,再找到最后一个兄弟,并添加到后面
                    {
                        q=q->lchild;
                           while(q->rchild!=NULL)//循环到最后一个
                           {
                              q=q->rchild;//兄弟指向右孩子
                           }
                           p->n=q->n;//兄弟辈分相同
                           q->rchild=p;//新节点为父节点的左孩子节点
                              printf("孩子添加成功!\n");
                               return ;
                       }
               }
                q=q->lchild;
             }
             q=head;
              while(q!=NULL)//循环右孩子查找
             {
                if(strcmp(x,q->data)==0)//比较
                {
                    if(q->lchild==NULL)//如果此结点没有孩子则添加到左孩子
                    {
                        p->n=q->n+1;//孩子为父节点的辈分加1
                        q->lchild=p;//新节点为父节点的左孩子节点
                           printf("孩子添加成功!\n");
                           return ;
                    }
                    else//如果此结点有孩子,则找到孩子,再找到最后一个兄弟,并添加到后面
                    {
                        q=q->lchild;
                           while(q->rchild!=NULL)//循环到最后一个
                           {
                              q=q->rchild;//兄弟指向右孩子
                           }
                           p->n=q->n;//兄弟辈分相同
                           q->rchild=p;//新节点为父节点的左孩子节点
                              printf("孩子添加成功!\n");
                               return ;
                       }
               }
                q=q->rchild;
             }

      printf("父节点不存在\n");
      return ;
      
}
        
   
void add_brother(node *head)//添加兄弟成员  非递归法
{
        node *p,*s; //定义新变量
        char y[20],x[20];
        p=head;
        s=(node *)malloc(sizeof(node));//动态分配存储空间
        printf("输入加入兄弟节点姓名");
        scanf("%s",&x);//输入兄弟节点姓名                                                                                       
        printf("请输入要添加的兄弟:");
        scanf("%s",&y);//输入添加信息
        strcpy(s->data,y);//赋值
        s->lchild=NULL;//新节点左孩子为空
        s->rchild=NULL;//新节点右孩子为空
       while(p!=NULL)//循环左孩子查找
        {
          if(strcmp(p->data,x)!=0)//比较
            {
                if(p->rchild==NULL)//如果兄弟节点为空,赋给兄弟节点
                {
                    s->n=p->n;//兄弟辈分相同
                    p->rchild=s;//兄弟为右孩子
                     printf("兄弟添加成功!\n");
                      return ;
                }
                else//否则找到最后一个兄弟,在其后添加结点
                {
                    while(p->rchild!=NULL)//循环到最后节点
                    {
                        p=p->rchild;//指向下一个右孩子
                    }
                    s->n=p->n;//兄弟辈分相同
                    p->rchild=s;//兄弟为右孩子
                     printf("兄弟添加成功!\n");
                      return ;
                }
            }
          p=p->lchild;
       }
       p=head;
       while(p!=NULL)//循环右孩子查找
        {
          if(strcmp(p->data,x)!=0)//比较
            {
                if(p->rchild==NULL)//如果兄弟节点为空,赋给兄弟节点
                {
                    s->n=p->n;//兄弟辈分相同
                    p->rchild=s;//兄弟为右孩子
                     printf("兄弟添加成功!\n");
                      return ;
                }
                else//否则找到最后一个兄弟,在其后添加结点
                {
                    while(p->rchild!=NULL)//循环到最后节点
                    {
                        p=p->rchild;//指向下一个右孩子
                    }
                    s->n=p->n;//兄弟辈分相同
                    p->rchild=s;//兄弟为右孩子
                     printf("兄弟添加成功!\n");
                      return ;
                }
            }
          p=p->rchild;
       }
      printf("该兄弟节点不存在\n");
      return ;        
}
     
      

void print(node *head,char *x)//输出指定家庭成员   递归法
{
    if(head!=NULL)
    {
        if(strcmp(head->data,x)==0)//查找
        {
            if(strcmp(head->data,"0")!=0)//比较
            printf("%s-",head->data);//找到后先输出该成员,再调用函数输出其子孙
            if(head->lchild!=NULL)
            {
              head=head->lchild;
              print1(head);//调用函数,输出孩子节点
            }
        }
        print(head->lchild,x);//递归
        print(head->rchild,x);//递归
    }
}

int beifen(node *p,char *x)//确定成员辈分   递归法
{
    if(p!=NULL)
    {
        if(strcmp(p->data,x)==0&&strcmp(p->data,"0")!=0)//如果找到且不为字符 0 则输出
        {
            printf("%d",p->n);//输出
            return 1;
        }
        beifen(p->lchild,x);//递归
        beifen(p->rchild,x);//递归
    }
}

void print1(node *head)//先序遍历 输出家庭成员    递归法
{
    if(head!=NULL)
    {
        if(strcmp(head->data,"0")!=0)//判断是否为空
        printf("-%s-",head->data);//输出
        print1(head->lchild);//递归
        print1(head->rchild);//递归
    }
}

void chengyuan(node *head,int s)//输出相应辈分成员   递归法
{
    if(head!=NULL)
    {
        if(head->n==s)//找到后且该成员未被删除  则输出
        {
           if(strcmp(head->data,"0")!=0)//查找
           printf("-%s-",head->data);//输出
        }
        chengyuan(head->lchild,s);//递归
        chengyuan(head->rchild,s);//递归
    }
}

node *shanchu(node *head,char *s)//其实未删除,只是将其姓名设为字符 0   递归法
{
    if(head!=NULL)
    {
        if(strcmp(head->data,s)==0)//比较找到
           strcpy(head->data,"0");//值归0
        shanchu(head->lchild,s);//递归
        shanchu(head->rchild,s);//递归
    }
return head;
}



int main()//主函数
{
    node *head;//定义头节点
    int n,m;
    char s[20];
    printf("\n******家谱(孩子兄弟表示法)********\n");
    while(1)
    {
        printf("*        1.设立家谱祖先          *\n");
        printf("*        2.添加家庭成员(孩子)  *\n");
        printf("*        3.添加家庭成员(兄弟)  *\n");
        printf("*        4.输出指定家庭成员      *\n");
        printf("*        5.确定成员辈分          *\n");
        printf("*        6.输出指定辈的所有成员  *\n");
        printf("*        7.删除家庭成员          *\n");
        printf("*        0.退出                  *\n");
        printf("输入选项:");
        scanf("%d",&m);//输入选项
        switch(m)
        {
        case 1://创建祖先
      
            head=creat();//调用函数
            break;
   
        case 2://添加孩子
        
            add_child(head);//调用函数
            break;
        
        case 3://添加兄弟
        
            add_brother(head);//调用函数
            break;
        
        case 4://输出一个家庭成员
        
            printf("请输入父亲节点:");
            scanf("%s",&s);
            printf("\n成员为: ");
            print(head,s);//调用函数
            printf("\n");
            break;
        
        case 5://确定某人辈分
        
            printf("请输入姓名:");
            scanf("%s",&s);
            printf("辈分为:");
            beifen(head,s);//调用函数
            printf("\n");
            break;
        
        case 6://输出指定辈分中所有人
        
            printf("请输入辈分:");
            scanf("%d",&n);
            printf("\n成员为: ");
            chengyuan(head,n);//调用函数
            printf("\n");
            break;

        case 7://删除成员
        
            printf("请输入要删除的成员:");
            scanf("%s",&s);
            shanchu(head,s);//调用函数
            break;
        
        case 0://退出
        
          printf("谢谢使用家谱系统!\n");
          break;
        }  
    }
return 0;
}
搜索更多相关主题的帖子: include 源代码 
2016-06-29 15:40
jerh1235
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-6-27
收藏
得分:0 
拜托,帮帮我吧
2016-06-29 15:41
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:20 
你在第一步创建时,没有把左右孩子节点置空。

程序代码:
node *creat()//建立祖先
{
    node *head;
    head = (node *)malloc(sizeof(node));//分配存储空间
    char s[20];
    printf("输入祖先名字:");
    scanf("%s", &s);
    strcpy(head->data, s);// 赋值
    head->n = 1;//分配辈分
    printf("祖先载入成功!\n\n");
    head->lchild = NULL;//新节点左孩子为空
    head->rchild = NULL;//新节点右孩子为空
    return head;//返回祖先节点(根节点)
}
2016-06-29 16:07
jerh1235
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-6-27
收藏
得分:0 
回复 3楼 grmmylbs
真的太感谢你了!问题都解决了。
2016-06-29 17:54
快速回复:求指教家谱问题一下,拜托,拜托
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017061 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved