user-0 提问: 二叉树建立里的scanf为啥不运行呢 ？？

回复:
user: user-1
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

user: user-2
content: scanf %c 会读取回车 注意一下

user: user-0
content: 晕倒，手机里发的，排版怎么成这样呢

user: user-0
content: /*2017年9月12日13:46:02 建立二叉树，并遍历。 01（上个程序）：静态建立（即不需要用户输入数据，程序员已经设定好了各个树的数据域） 02（本程序）：尝试动态建立二叉树（即用户自己输入各个子树的数据域，程序接收） */  # include <stdio.h> # include <malloc.h>  struct BTNode { 	char data; 	struct BTNode * pLchild; 	struct BTNode * pRchild; };  struct BTNode * CreateBTree(); void Fuzhi(struct BTNode * pA); void PreTraverseBTree(struct BTNode * pT);  int main(void) { 	struct BTNode * pT = CreateBTree(); 	PreTraverseBTree(pT);/7oid PreTraverseBTree(struct BTNode * pT);这行原来是这样写的，也不报错，就是无输出结果。 	//pT本身已经是地址，前面再加struct BTNode *是啥意思呢，不懂！可以试试去掉或加上，运行看看。 	 	return 0; }   struct BTNode * CreateBTree(void) { 	struct BTNode * pA = (struct BTNode *)malloc(sizeof(struct BTNode)); 	struct BTNode * pB = (struct BTNode *)malloc(sizeof(struct BTNode)); 	struct BTNode * pC = (struct BTNode *)malloc(sizeof(struct BTNode)); 	struct BTNode * pD = (struct BTNode *)malloc(sizeof(struct BTNode)); 	struct BTNode * pE = (struct BTNode *)malloc(sizeof(struct BTNode)); 	 	pA->data = 'A'; 	pB->data = 'B'; 	pC->data = 'C'; 	pD->data = 'D'; 	pE->data = 'E'; 	 	pA->pLchild = pB; 	pA->pRchild = pC; 	pB->pLchild = pB->pRchild = NULL; 	pC->pLchild = pD; 	pC->pRchild = NULL; 	pD->pLchild = NULL; 	pD->pRchild = pE; 	pE->pLchild = pE->pRchild = NULL;  	Fuzhi(pA); 	 	 	return pA; }   void Fuzhi(struct BTNode * pA) { 	if(NULL != pA) 	{ 		printf("请输入子树%c的数据域值(字符型)：", pA->data); 		scanf("%c", pA); 		printf("哈哈"); 		printf("\n"); 		if(NULL != pA->pLchild) 		{ 			Fuzhi(pA->pLchild); 		} 		 		if (NULL != pA->pRchild) 		{ 			Fuzhi(pA->pRchild); 		} 	} 	 }   void PreTraverseBTree(struct BTNode * pT) { 	if(NULL != pT) 	{ 		printf("%c\n", pT->data); 		if(NULL != pT->pLchild) 		{ 			PreTraverseBTree(pT->pLchild); 		} 		if(NULL != pT->pRchild) 		{ 			PreTraverseBTree(pT->pRchild); 		} 	} 	 }  /* 2017年9月12日20:12:46  输出结果为(不懂啊，为啥B和D的scanf没有执行 ？)：  请输入子树A的数据域值(字符型)：k 哈哈 请输入子树B的数据域值(字符型)：哈哈 请输入子树C的数据域值(字符型)：m 哈哈 请输入子树D的数据域值(字符型)：哈哈 请输入子树E的数据域值(字符型)：n 哈哈 k   m   n Press any key to continue  */

user: user-3
content: /*2017年9月12日13:46:02   建立二叉树，并遍历。   01（上个程序）：静态建立（即不需要用户输入数据，程序员已经设定好了各个树的数据域）   02（本程序）：尝试动态建立二叉树（即用户自己输入各个子树的数据域，程序接收）   */  # include <stdio.h> # include <malloc.h>  struct BTNode {     char data;     struct BTNode * pLchild;     struct BTNode * pRchild; };  struct BTNode * CreateBTree(); void Fuzhi(struct BTNode * pA); void PreTraverseBTree(struct BTNode * pT);  int main(void) {     struct BTNode * pT = CreateBTree();     PreTraverseBTree(pT);          return 0; }   struct BTNode * CreateBTree(void) {     struct BTNode * pA = (struct BTNode *)malloc(sizeof(struct BTNode));     struct BTNode * pB = (struct BTNode *)malloc(sizeof(struct BTNode));     struct BTNode * pC = (struct BTNode *)malloc(sizeof(struct BTNode));     struct BTNode * pD = (struct BTNode *)malloc(sizeof(struct BTNode));     struct BTNode * pE = (struct BTNode *)malloc(sizeof(struct BTNode));      pA->data = 'A';     pB->data = 'B';     pC->data = 'C';     pD->data = 'D';     pE->data = 'E';      pA->pLchild = pB;     pA->pRchild = pC;     pB->pLchild = pB->pRchild = NULL;     pC->pLchild = pD;     pC->pRchild = NULL;     pD->pLchild = NULL;     pD->pRchild = pE;     pE->pLchild = pE->pRchild = NULL;      Fuzhi(pA);       return pA; }   void Fuzhi(struct BTNode * pA) {     if(NULL != pA)     {         printf("请输入子树%c的数据域值(字符型)：", pA->data);         scanf("%c", &pA->data);         getchar();         printf("哈哈");         printf("\n");         if(NULL != pA->pLchild)         {             Fuzhi(pA->pLchild);         }          if (NULL != pA->pRchild)         {             Fuzhi(pA->pRchild);         }     }  }   void PreTraverseBTree(struct BTNode * pT) {     if(NULL != pT)     {         printf("%c\n", pT->data);         if(NULL != pT->pLchild)         {             PreTraverseBTree(pT->pLchild);         }         if(NULL != pT->pRchild)         {             PreTraverseBTree(pT->pRchild);         }     }  }  注意scanf("%c", &pA->data); 另外，对于%c输入比较特殊，因为上次输入的回车符残留在输入缓存里，加一个getchar()就是为了接收这个回车符。