2017-02-02 4 views
0

Я реализую структуру данных каната. Как передать мои строковые значения? Они отображаются как «(null)». Я думаю, что мое чёрное слово настроено неправильно. Я новичок в C, начиная с C++. В конечном итоге это будет текстовый редактор, но пока я просто пытаюсь отобразить введенные строки в упорядоченном списке по номеру индекса.Передача строк в C

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

typedef struct treeNode 
{ 
    int i, length; 
    char word; 
    struct treeNode *left; 
    struct treeNode *right; 
} treeNode; 

treeNode *insert(treeNode *node, int i, char word, int length) 
{ 
    printf("Insert %d :", word); 
    if(node==NULL) 
    { 
     treeNode *temp; 
     temp = (treeNode *)malloc(sizeof(treeNode)); 
     temp->i = i; 
     temp->word; 
     temp->length; 
     temp->left = temp->right = NULL; 
     return temp; 
    } 

    if(i >(node->i)) 
     node->right = insert(node->right, i, word, length); 

    else if(i < (node->i)) 
     node->left = insert(node->left,i,word,length); 
    return node; 
} 

void PrintInorder(treeNode *node) 
{ 
    if(node==NULL) 
     return; 
    PrintInorder(node->left); 
    printf("%d", node->i); 
    printf("%s", node->word); 
    PrintInorder(node->right); 
} 

void main() 
{ 
    treeNode *root = NULL; 
    char word[256]; 
    int length, a; 
    for(a = 0; a < 3; a++) 
    { 
     printf("Enter word: "); 
     scanf("%s", word); 
     length = strlen(word);  
     root = insert(root, a, *word,length); 
    } 
    printf("Print in order:\n"); 
    PrintInorder(root); 
} 
+0

'Е ("Вставка% D:", слово);' => 'Е ("Вставьте% s \ N", слово),' ' – bruceg

+3

символ слово' является одиночным символом. Вы должны либо использовать «char * word», либо самостоятельно распределять/освобождать память, либо использовать «char word [256]» (оптимистично оценивая максимальную длину слова, которую вы можете ожидать). –

+0

Использовать слово char [256] С помощью функции ввода и структуры? – user3337705

ответ

1

Вы должны char *word в вашем treeNode, чтобы представить строку (немного веревки). Вы должны определить insert с char *word, и назовите его word, а не *word (потому что в вызывающем контексте это будет первый символ word). И, наконец, вам действительно нужно какое-то задание: temp->word = word.

В коде имеются и другие логические ошибки, в частности, не обрабатываются i или length любым существенным способом, но они не мешают вам печатать по порядку, по крайней мере.

EDIT:

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

typedef struct treeNode 
{ 
    int i, length; 
    //char word;    // this only stores a single character 
    char *word;    // needs to be a pointer so it can point to string 
    struct treeNode *left; 
    struct treeNode *right; 
}treeNode; 

// this accepts a single character as `word`, not a string 
// treeNode *insert(treeNode *node, int i, char word, int length){ 
// needs to be `*word` 
treeNode *insert(treeNode *node, int i, char *word, int length) 
{ 
    printf("Insert %d :",word); 
    if(node==NULL) 
    { 
     treeNode *temp; 
     temp = (treeNode *)malloc(sizeof(treeNode)); 
     temp->i = i; 
     // temp->word;   // This does nothing; 
     temp->word = word; // This assigns the pointer 
     temp->length; 
     temp->left = temp->right = NULL; 
     return temp; 
    } 

    // This logic does not work correctly... What is `i` specifically? 
    if(i >(node->i)) 
     node->right = insert(node->right,i,word,length); // OK because passing pointer 

    else if(i < (node->i)) 
     node->left = insert(node->left,i,word,length); // OK because passing pointer 
    return node; 
} 

void PrintInorder(treeNode *node) 
{ 
    if(node==NULL) 
     return; 
    PrintInorder(node->left); 
    printf("%d",node->i); 
    printf("%s",node->word); 
    PrintInorder(node->right); 
} 

void main() 
{ 
    treeNode *root = NULL; 
    char word[256]; 
    int length, a; 
    for(a = 0; a < 3; a++) 
    { 
     printf("Enter word: "); 
     scanf("%s", word); 
     length = strlen(word);  
     // root = insert(root, a, *word,length); // This would only pass the first character of `word` 
     root = insert(root, a, word,length); // We want to pass the word pointer 
    } 
    printf("Print in order:\n"); 
    PrintInorder(root); 
} 
+0

Как насчет вставки (корень, а, * слово, длина); ? Если я получаю катание указателей, как сказал, я получил rope.c: 19: 16: warning: присваивание делает указатель из целого без литья temp-> word = word; – user3337705

+0

Вы не можете избавиться от указателей; но вам нужно различать, когда '* word' означает« слово »является указателем», а когда это означает «содержимое указателя' word' ». – Amadan

+0

Таким образом, это должно быть слово char * [256]; массив указателей? Я не понимаю, когда отличать. – user3337705

0

Это работало в качестве решения. Еще раз спасибо Amadan

int main(){ 
    treeNode *root = NULL; 
    int length, a; 
    for(a=0;a<3;a++) 
    { 
     char *word = malloc(sizeof(char)*length+1); 
     printf("Enter word: "); 
     scanf("%s",word); 
     length = strlen(word);   
     char *wordcpy = word; 
     strcpy (wordcpy,word); 
     root = insert(root, a,wordcpy,length); 
    } 
PrintInorder(root); 
    return 0; 
}