У меня возникли проблемы с созданием единого списка. Этот связанный список должен получать имя, GPA, ключ --- генерировать узлы --- print --- де-выделить память. Однако, похоже, в моем коде есть ошибки. Но я не могу найти, где они. Не могли бы вы рассказать мне, где неправильный код, если вы его найдете?Исключение при создании односвязного списка
Необработанная ошибка исключения win32 возникает всякий раз, когда я вводю имя, ГПД и информацию о ключах для второго узла.
#include <stdio.h>
#include <stdlib.h>
struct STUDENT {
char name[20];
float GPA;
int key;
struct STUDENT *next;
};
void newnode(struct STUDENT *head, struct STUDENT *tail, struct STUDENT *preptr, struct STUDENT *curptr, int i)
{
struct STUDENT *newitem;
newitem = (struct STUDENT*)malloc(sizeof(struct STUDENT));
if (newitem == (struct STUDENT*)NULL)
{
printf("No memory space available");
}
printf("Name?\n");
gets(newitem->name);
getchar();
printf("GPA?\n");
scanf("%f", &(newitem->GPA));
getchar();
printf("Key?\n");
scanf("%d", &(newitem->key));
getchar();
if (i == 0)
{
head = newitem;
tail = newitem;
curptr = newitem;
}
else
{
preptr = curptr;
tail = newitem;
curptr = newitem;
preptr->next = newitem;
}
}
void main()
{
int i;
struct STUDENT *head = NULL; //location of the first node
struct STUDENT *tail = NULL; //location of the last node
struct STUDENT *preptr = NULL; //previous
struct STUDENT *curptr = NULL; //current
for (i = 0; i <= 9; i++)
{
newnode(head, tail, preptr, curptr, i);
}
curptr = head;
printf("name %s, GPA %f, key %d\n", curptr->name, curptr->GPA, curptr->key);
preptr = head;
curptr = curptr->next;
for (i = 0; i <= 8; i++)
{
printf("name %s, GPA %f, key %d\n", curptr->name, curptr->GPA, curptr->key);
curptr = curptr->next;
}
curptr = head;
for (i = 0; i <= 9; i++)
{
free(curptr);
curptr = curptr->next;
}
getchar();
getchar();
}
Ваших поручений curptr, preptr и т.д. в методе newnode отбрасывается, как только этот метод возвращает. Попробуйте добавить '&' к параметрам, сделав их ссылками. И вам приятных выходных! – Kenney
Название этого вопроса не является конкретным. Любой человек с такой же проблемой в будущем не сможет его найти. –
Как сказал Кенни, ваши указательные головы, хвост, ...передаются значениями, вы изменяете их значения внутри функции newnode, но изменение остается локальным. Если у вас есть только компилятор C, вы должны пройти ** head ** tail, ... и написать * head = newnode, * tail = newnode, .... – OAnt