Вставка элемента в связанный список

Я работаю над экзаменом C и, пытаясь вставить элемент в связанный список, столкнулся с проблемой во время выполнения. Моя единственная цель - добавить 4 элемента в список, а затем распечатать список. Однако выдает ошибку. Я уже посмотрел несколько кодов вставки, и мой код кажется правильным. Не могу увидеть ошибку. Любая помощь будет оценена.

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

struct ders{
    char kod;
    struct ders *next;

}*header;
typedef struct ders Ders;
void add(Ders*,Ders*);
void print(Ders*);

int main(void)
{

header = NULL;
Ders *node = NULL;
int i = 0;
char c;
while(i<4)
{
    scanf("%c",&c);
    node = (Ders*)malloc(sizeof(Ders));
    node->kod = c;
    node->next = NULL;
    add(header,node );
    i++;


}
print(header);

return 0;
}

void add(Ders *header, Ders *node)
{
    if(header == NULL){
        header = node;
        header->next = NULL; }
    else{
        node->next = header;
        header = node;

    }
}

void print(Ders *header)
{
Ders *gecici = header;

while(gecici != NULL){
    printf("%c\n",gecici->kod);
    gecici = gecici->next;
}
}

person nihirus    schedule 03.03.2013    source источник
comment
Ваша переменная header всегда NULL, потому что вы никогда не присваиваете ей ничего другого.   -  person Mikhail Vladimirov    schedule 03.03.2013


Ответы (1)


Как сказал Нихирус: «Указатель передается по значению. Таким образом, вы можете изменить память, на которую он указывает, но вы не можете изменить фактический указатель, то есть сделать так, чтобы он указывал на что-то другое».

Ваша модификация привела к ошибке *header is not member of struct, поскольку -> имеет более высокий приоритет, чем *.

Попробуйте вместо этого использовать (*header)->next = NULL.

Приоритет оператора C: http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm

person Athul Suresh    schedule 03.03.2013
comment
спасибо за это. Мне удалось добавить элемент. Я хочу задать последний вопрос только для уточнения. если мы делаем это void(int *a), он ожидает целочисленный массив или целочисленный адрес. Другими словами, вызов по ссылке. почему void(Ders *a) берет копию указателя? Должен ли я использовать **, если я хочу сделать callbyref для указателя? Разумно ли сделать что-то вроде этого: void(char **a)? - person nihirus; 03.03.2013