| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 797 人关注过本帖
标题:运行起来没办法停止...请高手们看看
只看楼主 加入收藏
半夏
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-12-1
收藏
 问题点数:0 回复次数:6 
运行起来没办法停止...请高手们看看
要求设计一个家谱管理系统,允许用户输入家谱信息,并显示层次化的家谱图。允许用户输入成员姓名,在家谱中查询是否存在该成员并返回该成员所在的辈分(家谱中的第几代)、双亲及孩子。

扩展要求:将输入的家谱信息保存在文件中,或者直接用文件输入代替键盘输入,程序执行的时候打开文件,读入家谱信息,允许用户查询。


#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>


#define OK 1
#define ERROR -1
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef int Status;

struct BiNode{
    //用结构体定义结点类型。
    //数据域信息包含家谱中该对的男、女名字,其双亲名字,以及这对夫妇位于家谱中的辈分
    //指针域指向他们的第一个孩子以及其他兄弟
    char man[10],woman[10],father[10],mother[10];
    int level;
    struct BiNode *firstchild,*nextsibling;
};
struct SqStack{
    //对栈类型进行定义
    BiNode *base;
    BiNode *top;
    int stacksize;
};

//函数声明
Status InitStack (SqStack &S);
Status Push (SqStack &S,BiNode e);
Status CreateBiTree(BiNode *s);
Status Pop(SqStack &S,BiNode e);
Status EmptyStack(SqStack &S);
Status Preorder(BiNode *T,char name[10],BiNode *p);
//Status CreateParent(BiNode *s);
void findchildren(BiNode *p);
void putoutchildren(BiNode *q,int n);
void findparents(BiNode *p);
void levelhome(BiNode *T);
void  leveling(SqStack S1,SqStack S2,int n);
void print(BiNode *p);

//主函数
void main()
{
    BiNode *home=NULL,*p=NULL;
    char name[10];
    printf("请按先序遍历的顺序根据提示输入家谱信息,不存在则输入“#”\n");
    CreateBiTree(home);
    printf("层次化的家谱信息为\n");
    levelhome(home);
    printf("请输入要查找的人的名字");
    gets(name);
    Preorder(home,name,p);
    if(!p)printf("家谱中无此人");
    else{
        printf("辈分:%d\n",p->level);
        printf("孩子信息");
        findchildren(p);
        printf("父母信息:");
        findparents(p);
    }
}

//函数定义

Status InitStack (SqStack &S){
    //初始化函数
    S.base=(BiNode*)malloc(STACK_INIT_SIZE * sizeof(BiNode));
    if(!S.base) return ERROR;
    S.top=S.base;
    S.stacksize =STACK_INIT_SIZE;
    return OK;
}

Status Push (SqStack &S,BiNode e){
    //将e结点推入栈,作为栈顶元素
    if(S.top-S.base >=S.stacksize ){
        S.base=(BiNode *)realloc(S.base ,(S.stacksize +STACKINCREMENT)*sizeof(BiNode));
        if(!S.base ) return ERROR;
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    *S.top++=e;
    return OK;
}

Status Pop(SqStack &S,BiNode e){
    //取出栈顶元素
    if(S.base==S.top) return ERROR;
    e=*--S.top;
    return OK;
}

Status EmptyStack(SqStack &S){
    //若栈空,则返回0
    return (S.top == NULL);
}


Status CreateBiTree(BiNode *root){
    //创建家谱二叉树
    char man1[10],woman1[10],father[10],mother[10];
    printf("man:");//男方名字,不存在则输入“#”
    gets(man1);
    printf("woman:");//女方名字,不存在则输入“#”
    gets(man1);
    if(strcmp(man1,"#")==0&&strcmp(woman1,"#")==0)//若该结点男女都不存在,则说明该结点为空,即该子树的根结点不存在
    {
        root=NULL;
    }
    else{
        root=(BiNode *)malloc(sizeof(BiNode));
        strcpy(root->man,man1);  //将男女的名字赋给该结点的数据域
        strcpy(root->woman,woman1);

        printf("father:"); //输入该结点的双亲名字
        gets(father);
        printf("mother:");
        gets(mother);
      
        CreateBiTree(root->firstchild); //递归创建该结点的左、右子树
        CreateBiTree(root->nextsibling);
        root->level=0;//将改结点的层数暂时定义为0
        }
    return OK;

}

Status Preorder(BiNode *T,char name[10],BiNode *p){
    //先序遍历家谱树,查找与name名字相同的结点位置
    if(T){
        if(strcmp(T->man,name)==0||strcmp(T->woman,name)==0){
            p=T;
            return OK;
        }
        else{
            if(Preorder(T->firstchild,name,p))return OK;
            else return(Preorder(T->nextsibling,name,p));
        }
    }
    else return ERROR;
}

void findchildren(BiNode *p){
    //查找所得名字的孩子信息,输出他们的名字,若无孩子,则输出无孩子
    int n=1;
    BiNode *q;
    if(p->firstchild){//该结点的firstchild指针指向的为他的第一个孩子
        q=p->firstchild;
        putoutchildren(q,n);//输出
    }
    while(q->nextsibling){
        //第一个孩子的nextsibling指针指向的为孩子的兄弟,即第二个孩子
        //如此继续,知道结点的右指针为空
        q=q->nextsibling;
        putoutchildren(q,n);//输出
    }
    if(n==1)printf("无孩子");
}

void putoutchildren(BiNode *q,int n){
    //输出其孩子的结点的信息,并把孩子数加一
    printf("第%d个孩子,男方名字%s,女方名字%s\n",n++,q->man,q->woman);
}

void findparents(BiNode *s){
    //查询该结点的双亲名字
    if(s->father=="#"&&s->mother=="#")
    printf("没有父母信息");
    else{
        if((s->father)!="#")printf("father:%s\n",s->father);
        if((s->mother)!="#")printf("mother:%s\n",s->mother);
    }
}

void levelhome(BiNode *T){
    //按层输出该家谱
    SqStack S,N;  //定义两个栈并初始化
    InitStack(S);
    InitStack(N);
    BiNode *p;
    p=T;
    int n=1;
    printf("第%d层的信息为:\n");
    if(p){
        print(p);
        p->level=n;//修改p所指向的结点的辈分信息
        Push(S,*p);//将该结点推进栈S
    }
    while(p=p->nextsibling){
        //用循环来查找该层的所有信息,只要其nextsibling指向的结点不空,均为同一层
        print(p);
        p->level=n;
        Push(S,*p);
    }
    while(!EmptyStack(S)||!EmptyStack(N)){
        //循环,知道栈S和N都为空,说明按辈分遍历完成
        leveling(S,N,n++);
        leveling(N,S,n++);
    }
    printf("\n");
}

void leveling(SqStack S1,SqStack S2,int n){
    //将S1栈保存的信息一一取出,查找他孩子的结点,输出其名字,并推入栈S2.
    //即S2栈保存的结点是S1的下一辈
    BiNode *p,*q;
    printf("第%d层的信息为:\n");
    while(!EmptyStack(S1)){
        Pop(S1,*p);
        q=p->firstchild;
        if(q){
            print(q);
            q->level=n;
            Push(S2,*q);
            while(q=q->nextsibling){
                print(q);
                q->level=n;
                Push(S2,*q);
            }
        }
    }
}

void print(BiNode *p){
    //输出该结点处的夫妇名字
    printf("%s,%s\\",p->man,p->woman);
}
搜索更多相关主题的帖子: 办法 运行 
2008-12-01 19:56
半夏
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-12-1
收藏
得分:0 
高手们快快帮忙啊啊!!
2008-12-01 20:20
半夏
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-12-1
收藏
得分:0 
为什么还没人回复我的。。。
2008-12-01 20:36
半夏
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-12-1
收藏
得分:0 
太可怜了怎么都是我自己顶啊。。。
2008-12-02 23:19
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
----------------------------------------

E:\C语言教程\习作\1\400.c: At top level:
E:\C语言教程\习作\1\400.c:206: error: syntax error before "S1"
E:\C语言教程\习作\1\400.c: In function `leveling':
E:\C语言教程\习作\1\400.c:209: error: `BiNode' undeclared (first use in this function)
E:\C语言教程\习作\1\400.c:209: error: `p' undeclared (first use in this function)
E:\C语言教程\习作\1\400.c:209: error: `q' undeclared (first use in this function)
E:\C语言教程\习作\1\400.c:209: warning: left-hand operand of comma expression has no effect
E:\C语言教程\习作\1\400.c:210: warning: too few arguments for format
E:\C语言教程\习作\1\400.c:211: error: `S1' undeclared (first use in this function)
E:\C语言教程\习作\1\400.c:216: error: `n' undeclared (first use in this function)
E:\C语言教程\习作\1\400.c:217: error: `S2' undeclared (first use in this function)
E:\C语言教程\习作\1\400.c: At top level:
E:\C语言教程\习作\1\400.c:227: error: syntax error before '*' token
E:\C语言教程\习作\1\400.c: In function `print':
E:\C语言教程\习作\1\400.c:229: error: `p' undeclared (first use in this function)
E:\C语言教程\习作\1\400.c:230:2: warning: no newline at end of file
E:\C语言教程\习作\1\400.c: In function `leveling':
E:\C语言教程\习作\1\400.c:209: warning: statement with no effect
E:\C语言教程\习作\1\400.c: In function `main':
E:\C语言教程\习作\1\400.c:47: warning: statement with no effect
编译失败!请检查错误!

输出完成 (耗时: 0 秒)


-------------------------------------------------------

    程序太长了,我帮你检查了一下,发现了这么些的错误,你改正一下,然后运行一下试试吧。
2008-12-02 23:36
半夏
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-12-1
收藏
得分:0 
回复 第4楼 半夏 的帖子
好的~谢谢哈~我再看看。。。这学期基本没怎么写程序。。都不知道怎么写了
2008-12-04 16:54
zqy110007
Rank: 3Rank: 3
来 自:外太空
等 级:论坛游民
威 望:6
帖 子:1493
专家分:82
注 册:2008-11-19
收藏
得分:0 
回复 第5楼 广陵绝唱 的帖子
你的那个是编译系统报的错还是你自己做的程序报的错啊??

每个人都是蛤蟆,只是井的大小不同罢了.
沙石下的泉水,挖得越深,泉水越清.
2008-12-04 18:06
快速回复:运行起来没办法停止...请高手们看看
数据加载中...
 
   



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

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