2013-03-03 2 views
0

Я работаю на экзамен 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; 
} 
} 
+0

Ваш 'header' переменная всегда' NULL', потому что вы что-нибудь еще к нему никогда не назначать. –

ответ

1

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

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

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

C оператор старшинства: http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^