Weite_Zhang
Weite_Zhang
2019-06-15 14:18
采纳率: 60%
浏览 286

c语言静态链表无法成功赋值

整个算法是为了使用静态链表建树
** scanf("%c %d %d", &t[i].data, &cl, &cr);**这一行出了问题。无法正常赋值,不知道怎么回事。调试如下:图片说明
以cl为例,赋值而之后,左边调试框里面还是一个垃圾值。
大神能不能帮我看下怎么回事?
谢谢!
代码ru'xia

#include<stdio.h>

#define maxsize 5
#define Null -1

struct treenode{
    char data;
    int left;
    int right;  
};
typedef struct treenode tree;
int buildtree(tree t[]);

int main(){
    tree t1[maxsize], t2[maxsize];//用结构体定义了两个结构数组,用来存储树 
    int r1, r2, i;//r1 r2 代表的是t1,t2结构数组中根节点的下标 
    r1 = buildtree(t1);
    r2 = buildtree(t2);
    for(i=0; i<maxsize; i++){
        printf("%c %d %d\n", t1[i].data, t1[i].left, t1[i].right);
    }
    return 0;
} 

int buildtree(tree t[]){
    int n,i;//n代表树的节点数量 
    int check[maxsize] = {0};//用来检查谁是根节点 

    printf("你要输入数量\n");
    scanf("%d", &n);
    if(n){
    for(i=0; i<n; i++){ 
        int cl, cr;//用来记录左孩子与右孩子的值 
        printf("请输入字母 左孩子 右孩子\n");
**      scanf("%c %d %d", &t[i].data, &cl, &cr);**
        printf("%c %d %d", t[i].data, cl, cr);
        if(cl!=-1){//如果左孩子存在,该节点的左孩子被赋值,并且记录到check数组,来证明这不是一个孤儿。 
            t[i].left = cl;
            check[t[i].left] = 1;                       
        }else
            t[i].left = -1;
        if(cr!=-1){
            t[i].right = cr;
            check[t[i].right] = 1;                      
        }else
            t[i].right = -1;    
    }
    }
    else
        return -1;

    for(i=0; i<maxsize; i++)
        if(!check[i])
            break;
    return i;   
}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • foomow
    茂大叔 2019-06-15 16:11
    已采纳

    因为

    scanf("%d", &n);
    

    实际上输入了一个数字和一个回车
    所以在紧接着的

    scanf("%c %d %d", &t[i].data, &cl, &cr);
    
    

    里面,c就接收了这个回车,然后……奇怪的事情就出来了。
    可以改成

    scanf("%d\n", &n);
    .....
    scanf("%c %d %d\n", &t[i].data, &cl, &cr);
    

    或者每次scanf后都

    fflush (stdin);
    

    释放一下输入缓冲……

    点赞 评论
  • caozhy

    fflush(stdin); //前面加上
    scanf("%c%d%d", &(t[i].data), &cl, &cr);

    点赞 评论

相关推荐