Одна из проблем заключается в том, что вы не выделили хранилище для элемента word
, на который можно указать. Вы также не выделили место для name
, на которое можно указать. Это основная причина проблем.
Вам необходимо выделить место для name
; самый простой способ:
char name[128];
Вам необходимо выделить место для хранения слова, и вам необходимо скопировать содержимое name
в word
, чтобы при перезаписи следующей строки name
он не уничтожал сохраненные word
.
Адаптируя свой код, вы можете использовать:
struct student *Linsert(struct dict *list, char *name)
{
struct student *pnew;
struct student *pn;
pnew = (struct dict *)malloc(sizeof(struct dict));
if (pnew == 0)
...error...
pnew->next = NULL;
pnew->word = malloc(strlen(name) + 1);
if (pnew->word == 0)
...error...
strcpy(pnew->word, name);
if (list != NULL)
{
for (pn = list; pn->next != NULL; pn = pn->next)
;
pn->next = pnew;
}
else
list = pnew;
return list;
}
Не пропускайте проверки ошибок при распределении памяти - хотя это и болезненно. Он будет кусать тебя, когда ты забудешь.
Стилистически, не используйте пробелы вокруг ->
или .
; это операторы, которые очень тесно связаны, и их не следует разносить, как другие бинарные операторы.
Есть удобная функция, strdup()
, дублирует строку, но это не стандартный C (это стандартный POSIX).