向线性表中写入数据时scanf输入问题,实在不知道错在哪里,求指教!
/**************************************************************************************程序的本意是先序建立一个二叉树,问题是程序输入不正常,scandata函数应该接收5个数据才终
止的,但是我输入了两个数据就终止了,分步运行的时候scanf函数会莫名其妙的跳过几次,我百思
不得其解,求大家帮忙看下,谢谢!
输入:
5 //表示有5个数据有输入
a a
b / \
# b ^
# / \
# ^ ^
这里就是输入了一个先序遍历的序列,“#”表示“空”。
输出:
没有输出,只是在内存中建立了一个二叉树。
目前的程序是:
输入:
5
a
b //输入到这里就跳出程序了debug自动结束了。
**************************************************************************************/
#include"stdio.h"
#include"malloc.h"
#define ERROR 0
#define OK 0
#define INIT_SIZE 10
#define INCREMENT 5
typedef int status;
typedef struct List
{
char *base;
int length;
int listsize;
}List;
typedef struct BiTree
{
BiTree *lchild;
BiTree *rchild;
char data;
}BiTree, *BiTreeP;
typedef struct stack
{
BiTreeP *base;
BiTreeP *top;
int stacksize;
}stack;
status InitList(List *l)
{
if(!(l->base = (char*)malloc(INIT_SIZE*sizeof(char)))) return ERROR;
l->length = 0;
l->listsize = 10;
}
status scandata(List*l,int n)//scandata函数,大家看看该怎么写呢?
{
int i = 0;
char *p = l->base;
for(;i < n;i++)
{
scanf("%c",p++);
l->length++;
}
return OK;
}
status InitStack(stack *s,int n)
{
s->stacksize = n;
if(!(s->base = (BiTreeP*)malloc(INIT_SIZE*sizeof(BiTreeP)))) return ERROR;
s->top = s->base;
}
int push(stack *s,BiTree *ch)
{
if(!(s->base + s->stacksize <= s->top))
{
BiTreeP *newbase;
if(!(newbase = (BiTreeP*)realloc(s->base,(s->stacksize + INCREMENT)*sizeof(BiTreeP))))
return ERROR;
else
{
s->stacksize += INCREMENT;
s->base = newbase;
s->top = s->base + s->stacksize;
}
}
*(s->top++) = ch;
return OK;
}
BiTreeP pop(stack *s)
{
if(!(s->base <= s->top))
return 0;
s->top--;
return *(s->top);
}
int StackEmpty(stack s)
{
if(s.top = s.base) return 1;
else return 0;
}
status main()
{
BiTree *ps = NULL;
stack s;
List l;
char * pl = NULL;
int n;
InitList(&l);
printf("How many data will be inputed ?\n");
scanf("%d",&n);
scandata(&l,n);
InitStack(&s,n);
if(!(ps = (BiTree*)malloc(sizeof(BiTree)))) return ERROR;
push(&s,ps);
while(!StackEmpty(s))
{
while(*pl != '#')
{
if(!(ps->lchild = (BiTree*)malloc(sizeof(BiTree)))) return ERROR;
ps->data = *pl;
push(&s,ps);
ps =ps->lchild;
pl++;
}
ps->lchild = NULL;
ps = ps->rchild;
pop(&s);
pl++;
}
return OK;
}