Односвязный список слов - PullRequest
0 голосов
/ 06 февраля 2012

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

К сожалению, программа выдает ошибку во время работы, не могли бы вы объяснить, что идет не так, и я также был бы признателен за некоторые советы.Вот код:

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

struct node{
    char* word;
    struct node* next;
};

void printList(struct node* list){
    struct node* it = list;
    while(it != NULL){
        printf("%s ", it -> word);
        it = it -> next;
    }
    printf("\n");
}

void insertLast(struct node* tail, char* neww){
    tail -> next = (struct node*)malloc(sizeof(struct node));
    tail = tail -> next;
    tail -> word = neww;
    tail -> next = NULL;
}

struct node* words(char* s){
    char* slowo = strtok(s, " ");
    struct node* head;
    struct node* tail;
    if (sizeof(slowo) == 0)
        return NULL ;
    head = (struct node*)malloc(sizeof(struct node));

    head -> word = slowo;
    head -> next = NULL;
    tail = head;
    slowo = strtok(NULL, " ");
    while (slowo != NULL){
        insertLast(tail, slowo);
        tail = tail -> next;
        slowo = strtok(NULL, " ");
    }
    return head;
}

int main() {
    printList(words("Some sentance la al olaalal"));
    getch();
    return (EXIT_SUCCESS);
}

Ответы [ 2 ]

1 голос
/ 06 февраля 2012

Если вы не хотите insertLast установить tail в вызывающей функции, вы должны передать указатель по ссылке (т.е. как указатель на указатель.):

void insertLast(struct node** tail, char* neww)

Используйте правильную разыменование в insertLast, чтобы оно работало.

0 голосов
/ 06 февраля 2012

Ваша words() функция изменяет свой аргумент (s) на месте.Вы вызываете words() со строковым литералом, и изменение строкового литерала не допускается.Чтобы решить эту проблему, вы можете поместить s в выделенную кучу память, используя strdup() или malloc()+strcpy().

...