| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 863 人关注过本帖
标题:输入的的时候我把%c改成%s才能输入请问这是怎么回事啊
只看楼主 加入收藏
qq384200403
Rank: 2
等 级:论坛游民
帖 子:35
专家分:39
注 册:2013-3-1
结帖率:87.5%
收藏
已结贴  问题点数:20 回复次数:2 
输入的的时候我把%c改成%s才能输入请问这是怎么回事啊
关于二叉树的操作下面是我的程序


关于二叉树的建立,插入,删除,前序。中序。后续,打印。
问题出现在主函数  
请往下看  问题在主函数的地方有标出


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

typedef char  datatype;
typedef  struct  btreenode
{
    datatype  data;
    struct btreenode  *lchild;
    struct btreenode  *rchild;
}nodetype;



/*nodetype  *initiate(nodetype *bt)
{    if((bt=(nodetype *)malloc(sizeof(nodetype)))==NULL) return 0;
    bt->lchild=NULL;
    bt->rchild=NULL;
    return bt;
}*/

int initiate(nodetype **bt) /*初始化*/
{    if((*bt=(nodetype *)malloc(sizeof(nodetype)))==NULL) return 0;
    (*bt)->lchild=NULL;
    (*bt)->rchild=NULL;
    return 1;
}


nodetype *create(nodetype *bt, datatype  x) /*创建二叉树*/
{    bt->data=x;
    return bt;
}


void preorder(nodetype *bt) /*前序遍历二叉树*/
{    if(bt==NULL)return;
    printf("%20c%20p%20p%20p\n",bt->data,bt,bt->lchild,bt->rchild);
    preorder(bt->lchild);
    preorder(bt->rchild);
}
void  InOrder(nodetype *bt)//中序遍历二叉树
{
   
    if (bt==NULL) return;
    InOrder(bt->lchild);
    printf("%20c%20p%20p%20p\n",bt->data,bt,bt->lchild,bt->rchild);
    InOrder(bt->rchild);

}

void   PostOrder(nodetype *bt)//后序遍历二叉树
{
    if (bt==NULL) return;
    {
        PostOrder(bt->lchild);
        PostOrder(bt->rchild);
        printf("%20c%20p%20p%20p\n",bt->data,bt,bt->lchild,bt->rchild);/*访问根结点*/
    }
}
nodetype *search(nodetype *bt, datatype x) /*查找数据*/
 {     nodetype *p;
     if(bt==NULL) return NULL;
     if(bt->data==x)   return bt;
     if(bt->lchild!=NULL)
     {     p=search(bt->lchild,x);
         if(p!=NULL)return p;     }
     if(bt->rchild!=NULL)
     {     p=search(bt->rchild,x);
         if(p!=NULL)return p;     }
     
     return NULL;
 }


nodetype *insertl(datatype x,nodetype *parent) /*将x插入到结点parent的左孩子处*/
{    nodetype *p;
    if(parent==NULL)
    {    printf("\n error");
        return NULL;    }
    if((p=(nodetype *)malloc(sizeof(nodetype)))==NULL) return NULL;
    p->data=x;
    p->lchild=NULL;
    p->rchild=NULL;
    if(parent->lchild==NULL)parent->lchild=p;
    else
    {    p->lchild=parent->lchild;
        parent->lchild=p;    }
    return p;
}



nodetype *insertr(char  x,nodetype *parent)   /*将结点x插入到结点parent的右孩子结点*/
{    nodetype *p;
    if(parent==NULL)
    {    printf("\n error");
        return NULL;    }
    if((p=(nodetype *)malloc(sizeof(nodetype)))==NULL) return NULL;
    p->data=x;
    p->lchild=NULL;
    p->rchild=NULL;
    if(parent->rchild==NULL)parent->rchild=p;
    else
    {    p->rchild=parent->rchild;
        parent->rchild=p;    }
    return p;
}



nodetype *insert(nodetype *bt)  
{    char x,y,z;nodetype *parent,*p;
    printf("输入您要插入的字符.\n");
    scanf("%s",&x);
    printf("请选择您要插入的结点的双亲.\n");
    scanf("%s",&y);
    parent=search(bt,y);
    printf("left(l) or right(r).\n");
    scanf("%s",&z);
    if(z=='l'){
        if((p=insertl(x,parent))==NULL)
        {    printf("\n内存不够");
            return 0;        }
    }
    if(z=='r'){
        if((p=insertr(x,parent))==NULL)
        {    printf("\n内存不够");
            return 0;        }
    }
    return p;
}


nodetype *deleted(nodetype *bt) /*删除*/
{    nodetype *parent,*p;char  x,y;
    printf("输入删除字符的双亲结点.\n");
    scanf("%s",&y);
    parent=search(bt,y);
    printf("left or right.\n");
    scanf("%c",&x);
    if(x=='l'){
        p=parent->lchild;
        parent->lchild=NULL;
        free(p);
    }
    if(x=='r')
        {p=parent->rchild;
        parent->rchild=NULL;
        free(p);    }
    return parent;
}


 void printtree(nodetype *bt,int n) /*屏幕显示树*/
 {     int i;
     if(bt==NULL) return ;
     printtree(bt->rchild,n+1);
     for(i=0;i<n-1;++i)   printf("     ");
     if(n>=1)    printf("- - -");
     //printf("%s\n",bt->data);
     printf("%20c\n",bt->data);
     printtree(bt->lchild,n+1);
 }
 void printftree(nodetype *bt)
 {     if(bt==NULL) return;
     printf("%-20c%-20p%-20p%-20p\n",bt->data,bt,bt->lchild,bt->rchild);
     printftree(bt->lchild);
     printftree(bt->rchild);
 }

void main ()
{   int m ,n=1;char i,j;
while(1)
{
    printf("1==创建一个二叉树\n2==插入一个结点\n3==删除一个结点\n4==屏幕显示数的存储结构\n5==前序遍历二叉树\n6==中序遍历二叉树\n7==后序遍历二叉树\n8==查找一个元素\n9==退出\n");
    scanf("%d",&m);
    if(m==9)
        break;
     
    switch(m)                                                  
    {
        
     case 1:
    nodetype *bt;
    bt=(nodetype *)malloc(sizeof(nodetype));
    initiate( &bt);
    printf("结点数据");
    scanf("%s",&i);    //注意这里,我吧%s改成%c 结果显示的时候就直接跳过了这行,可是我定义的I是字符类型的啊这是怎么回事啊?????
    create( bt, i);
    printftree(  bt);
    break;
     case 2:
         insert( bt);
         n=n+1;
         printftree( bt);
         break;
     case 3:
         deleted( bt);
         printftree( bt);
         break;
     case 4:
         printtree(bt,  n);
         break;
     case 5:
         preorder( bt);
         break;

     case 6:
         InOrder( bt);
         break;

     case 7:
         PostOrder( bt);
         break;
     case 8:
         printf("输入查找数据的数据");
         scanf("%s",&j );
         search( bt, j);
         
         //printftree( bt);
         break;
     default :
         printf("输入错误");
    }
     



         
        

   
}

}
搜索更多相关主题的帖子: 函数 include return 二叉树 
2013-05-08 13:39
笑傲
Rank: 8Rank: 8
来 自:迪拜
等 级:蝙蝠侠
威 望:5
帖 子:223
专家分:856
注 册:2013-3-9
收藏
得分:20 
printf("1==创建一个二叉树\n2==插入一个结点\n3==删除一个结点\n4==屏幕显示数的存储结构\n5==前序遍历二叉树\n6==中序遍历二叉树\n7==后序遍历二叉树\n8==查找一个元素\n9==退出\n");
    scanf("%d",&m);
    getchar();       //在这里加一句就好了,因为在输入m时还输入了回车;回车键还保留缓存区中;
//所以应该用getchar()吸收就可以了;或者用fflush(stdin);清空缓存;
所以如果你是用%c则将回车给了它,就表现为直接跳过;

练就一身本领,只为笑傲江湖!
2013-05-08 14:49
qq384200403
Rank: 2
等 级:论坛游民
帖 子:35
专家分:39
注 册:2013-3-1
收藏
得分:0 
回复 2楼 笑傲
非常感谢
2013-05-10 13:21
快速回复:输入的的时候我把%c改成%s才能输入请问这是怎么回事啊
数据加载中...
 
   



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

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