(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'爲結束標誌