сохранить строку в связанном списке (с) - PullRequest
1 голос
/ 20 сентября 2011

Я думаю, что у меня есть некоторые проблемы с тем, как работают связанные списки, имейте в виду, что я не являюсь экспертом в C и что раньше я не работал со связанными списками.

Я пытаюсьвзять текстовый файл со списком вещей и сохранить его в связанном списке.У меня есть следующий код прямо сейчас:

typedef struct linked_list {
    struct linked_list *next_ptr;
    char name;
    float price1;
    float price2;
}linked_list;

struct linked_list *first_ptr;
char name_temp;

int writeList(void) {
    // read input files
    FILE *sh_list;
    sh_list=fopen("case1/shoppingList.dat", "rw");
    if (sh_list == NULL) {
        perror("Cannot open file, you seem to have something mixed up...");
        exit(8);
    }

    struct linked_list *current_ptr;
    current_ptr = first_ptr;

    while ((fscanf(sh_list, "%s", &name_temp)) !=EOF) {
        next_ptr = malloc(sizeof(linked_list));
        strcpy(name, name_temp);
        //move to next node and complete the same task
    }
};

Я остановился на // движении ... потому что я изо всех сил пытаюсь получить правильный код - моя IDE дает мне ошибки.Точно так же я не могу заставить его читать переменную «имя», что мне нужно сделать, чтобы скопировать строку в узел.

Ответы [ 3 ]

1 голос
/ 20 сентября 2011

Вы получаете next_ptr как необъявленное, потому что вы не удалили его.

Ваш код должен выглядеть примерно так ...

linked_list   *next_ptr;
char          name_temp[MAX_SIZE];

while ((fscanf(sh_list, "%s", &name_temp)) !=EOF) {
         next_ptr = malloc(sizeof(linked_list));
         strcpy(next_ptr->name, name_temp);
         next_ptr->next_ptr = first_ptr;
         first_ptr = next_ptr;
} 

Вы также должны сделать объявление имени всвязанный список будет:

char      name[MAX_SIZE];
0 голосов
/ 20 сентября 2011

это должно быть strcpy(current_ptr->name, name_temp);

Вы пытаетесь сослаться на переменную имени в структуре, к которой необходимо получить доступ через current_ptr.

, поэтому аналогично это должно быть current_ptr->next_ptr = malloc(sizeof(linked_list));

Чтобы получить доступ к переменной в структуре, вам нужно использовать оператор ..Когда вы используете указатель на структуру, вы получаете доступ к ее переменным с помощью оператора ->.

0 голосов
/ 20 сентября 2011

В своем выражении fscanf вы указываете, что вводите строку, %s, но name_temp имеет тип char. Вам нужно изменить его на массив char, например:

char name_temp[100];

Вы должны будете сделать массив достаточно большим для ваших целей. Вам также придется изменить тип name:

char name[100];

Ошибка, которую вы получаете, заключается в том, что name и next_ptr являются частью структуры linked_list, но вы должны создать экземпляр linked_list для доступа к name. В вашем случае у вас есть current_ptr, поэтому вы должны изменить его на:

current_ptr->next_ptr = malloc(sizeof(linked_list));
strcpy(current_ptr->name, name_tmp);
...