(1)无冗余接受键盘输入的n个字符串,并将其无冗余的存放到对应的字符数组中,在按照每行1串的格式输出这些字符串。15
(2)以单个字符串为数据域,按字典顺序将n个字符串生成一棵二叉搜索树,并且规定左子树小于右子树。10
(3)先序遍历该二叉搜索树并输出结果。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct T{
char *p;
struct T* lchild;
struct T* rchild;
}*BTree,Node;
//建立一个空白点。
Node* create(){
Node* T=(Node*)malloc(sizeof(Node));
T->rchild=T->lchild=NULL;
return T;
}
//二叉树添加点
BTree AddNode(BTree T,char*x){
if(T==NULL){
T=create();
T->p=(char*)malloc(strlen(x)*sizeof(char));
strcpy(T->p,x);
return T;
}
if(strcmp(T->p,x)>0){
T->lchild=AddNode(T->lchild,x);
}else if(strcmp(T->p,x)<0){
T->rchild=AddNode(T->rchild,x);
}
return T;
}
//先序遍历
void PreOrder(BTree T){
if(T==NULL)return ;
printf("%s\n",T->p);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
//中序遍历
void InOrder(BTree T){
if(T==NULL)return ;
InOrder(T->lchild);
printf("%s\n",T->p);
InOrder(T->rchild);
}
//后续遍历
void PostOrder(BTree T){
if(T==NULL)return ;
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%s\n",T->p);
}
int main(void){
int n,i,count;
char **str=NULL;
char c;
while(scanf("%d",&n)!=EOF){
fflush(stdin);//清空缓冲区。主要是防止后面读取缓冲区内部的'\n'字符.
str=(char**)malloc(n*sizeof(char*));
for(i=0;i<n;i++){
count=0;
str[i]=NULL;//定义字符串
while(scanf("%c",&c)){
count++;
str[i]=(char*)realloc(str[i],count*sizeof(char));//动态更新了字符串的空间大小
if(c=='\n'){
str[i][count-1]='\0';break;//字符读取,'\n'字符串跟字符串的标志
}else{
str[i][count-1]=c;
}
}
}
for(i=0;i<n;i++){
printf("%s\n",str[i]);
}
}
BTree T=NULL;
for(i=0;i<n;i++){
T=AddNode(T,str[i]);
}
printf("PreOrder:\n");
PreOrder(T);
printf("\n");
return 0;
}
这个版本跟网上另外一个版本的代码有点区别。
我定义字符串不是以空格为结束标志。而是以'\n'为结束标志。网上的另外一个版本是输入的字符串是以空格跟'\n'为结束标志