#c #linked-list #singly-linked-list
#c #связанный список #single-linked-list
Вопрос:
Я пытаюсь создать односвязный список с узлами, содержащими два параметра. Всякий раз, когда я ставлю в очередь другой узел, используя указатель tail, указатель head принимает то же значение, что и новый узел.
Я уверен, что указатели указывают на одну и ту же ячейку памяти или что-то подобное, но я не уверен, как это исправить.
struct node
{
struct process *p;
struct node *next;
}
struct node* head;
struct node* tail;
void enqueue(struct process* newProcess)
{
struct node *newNode = malloc(sizeof(struct node));
newNode->p = malloc(sizeof(struct process));
newNode->p = newProcess);
if(tail==NULL)
{
head = tail = newNode;
return;
}
tail = tail->next;
tail = newNode;
}
Я хотел бы использовать эту функцию, чтобы иметь возможность создавать односвязный список с головным узлом, указывающим на первый элемент в списке, и конечным узлом, указывающим на последний элемент в списке. Текущий код приводит к тому, что обе переменные представляют последний добавленный элемент.
Комментарии:
1. ` newNode-> p = malloc(sizeof(struct process)); newNode-> p = newProcess` приводит к утечке памяти.
tail = tail->next
и где вы обновляетеtail->next
значение указателя?2. Предлагаю поиск stackoverflow.com для ‘односвязного списка’
Ответ №1:
Параметр tail = tail->next
устанавливает значение tail равным null, потому что оно не установлено в первый раз, а затем и tail, и head немедленно перезаписываются при последующем вызове.
Ответ №2:
Здесь есть некоторые проблемы. Во-первых, чтобы устранить вашу проблему, замените две последние строки на:
tail = tail->next = newNode;
Также учтите это:
tail = tail->next;
tail = newNode;
Какой смысл присваивать переменной значение, если вы переназначаете ту же переменную в следующем операторе? Ранее у вас тоже была такая же ошибка:
newNode->p = malloc(sizeof(struct process));
newNode->p = newProcess;
Из-за второй строки единственное, чего вы добиваетесь с помощью первой строки, — это утечки памяти. Полностью удалите первую строку.