Head продолжает получать то же значение, что и указатель tail в односвязном списке

#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;
  

Из-за второй строки единственное, чего вы добиваетесь с помощью первой строки, — это утечки памяти. Полностью удалите первую строку.