2015-05-12 2 views
0

Здравствуйте, я кодирую программу, которая принимает строку ввода пользователя и выполняет ее токенизацию и сохраняет ее в связанном списке. Я тестировал свой связанный список с помощью руководства, я имею в виду словосочетание без использования strtok(), и он отлично работает, может быть, есть что-то с моей strtok(). Я не уверен, хотя вы можете также проверить мою реализацию моего связанного списка.связанный список сбивает мою программу

Вот код:

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

typedef struct wordNode NODE; 
struct wordNode 
{ 
    char *word; 
    char *nextWord; 
    NODE *next; 
}; 

NODE *head = NULL; 
NODE *tail = NULL; 

NODE* createList(char*, char*); 
NODE* addToList(char*, char*); 
void printList(void); 

int main(void) 
{ 
    char input[2048]; 
    char *userWord, *firstWord, *nextWord; 

    gets(input); 

    userWord = strtok(input, " .,!?;:"); 

    while(userWord != NULL) 
    { 
     firstWord = userWord; 
     userWord = strtok(NULL, " .,!?;:"); 
     nextWord = userWord; 
     addToList(firstWord, nextWord); 
    } 

    printList(); 

    return 0; 
} 

NODE* createList(char* word, char* nextWord) 
{ 
    NODE *ptr = malloc(sizeof(NODE)); 

    if(ptr == NULL) 
    { 
     /*node creation failde*/ 
     return NULL; 
    } 

    ptr->word = malloc((strlen(word) + 1)*sizeof(char)); 
    ptr->nextWord = malloc((strlen(nextWord) + 1)*sizeof(char)); 
    ptr->word = strdup(word); 
    ptr->word = strdup(nextWord); 
    ptr->next = NULL; 

    head = tail = ptr; 

    return ptr; 
} 

NODE* addToList(char* word, char* nextWord) 
{ 
    if(head == NULL) 
    { 
     return createList(word, nextWord); 
    } 

    NODE *ptr = malloc(sizeof(NODE)); 

    if(ptr == NULL) 
    { 
     /*node creation failed*/ 
     return NULL; 
    } 

    ptr->word = malloc((strlen(word) + 1)*sizeof(char)); 
    ptr->nextWord = malloc((strlen(nextWord) + 1)*sizeof(char)); 
    ptr->word = strdup(word); 
    ptr->word = strdup(nextWord); 
    ptr->next = NULL; 

    tail->next = ptr; 
    tail = ptr; 

    return ptr; 
} 

void printList(void) 
{ 
    NODE *ptr = head; 

    while(ptr != NULL) 
    { 
     printf("\n--%s----%s--\n", ptr->word, ptr->nextWord); 
     ptr = ptr->next; 
    } 
} 
+0

Я проверил его снова. Я думаю, что это связано с моим связанным перечетом. – user2272420

+1

Я уверен, что это тоже. Пожалуйста, дайте нам больше информации, а не просто «он разбился». Например, вы сузились там, где может произойти авария? Использование отладчика сообщит вам эту информацию почти сразу. – kaylum

+1

, если вы используете 'strdup', вам не нужно« malloc »заранее, это будет только утечка памяти – Diego

ответ

0

Я просто удалил строку таНос часть, и я заметил, что я никогда ничего не положил на * NextWord указатель, поэтому он просто печать случайных специальных символов.

NODE* createList(char* word, char* nextWord) 
{ 
    NODE *ptr = malloc(sizeof(NODE)); 

    if(ptr == NULL) 
    { 
     /*node creation failde*/ 
     return NULL; 
    } 

    //ptr->word = malloc((strlen(word) + 1)*sizeof(char)); 
    //ptr->nextWord = malloc((strlen(nextWord) + 1)*sizeof(char)); 
    ptr->word = strdup(word); 
    ptr->nextWord = strdup(nextWord); 
    ptr->next = NULL; 

    head = tail = ptr; 

    return ptr; 
} 

NODE* addToList(char* word, char* nextWord) 
{ 
    if(head == NULL) 
    { 
     return createList(word, nextWord); 
    } 

    NODE *ptr = malloc(sizeof(NODE)); 

    if(ptr == NULL) 
    { 
     /*node creation failed*/ 
     return NULL; 
    } 

    //ptr->word = malloc((strlen(word) + 1)*sizeof(char)); 
    //ptr->nextWord = malloc((strlen(nextWord) + 1)*sizeof(char)); 
    ptr->word = strdup(word); 
    ptr->nextWord = strdup(nextWord); 
    ptr->next = NULL; 

    tail->next = ptr; 
    tail = ptr; 

    return ptr; 
} 
Смежные вопросы