Голова продолжает получать то же значение, что и указатель хвоста в односвязном списке - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь создать односвязный список с узлами, содержащими два параметра.Всякий раз, когда я ставлю в очередь другой узел, используя указатель хвоста, указатель заголовка принимает то же значение, что и новый узел.

Я уверен, что указатели указывают на ту же самую область памяти или что-то подобное, но я неконечно, как это исправить.

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

Я хотел бы использовать эту функцию, чтобы иметь возможность создать односвязный список с головным узлом, указывающим на первый элемент в списке, и с хвостовым узлом, указывающим напоследний элемент в списке.В результате выполнения текущего кода обе переменные представляют последний добавленный элемент.

Ответы [ 2 ]

1 голос
/ 24 марта 2019

Здесь есть некоторые проблемы.Во-первых, чтобы решить вашу проблему, замените две последние строки на:

tail = tail->next = newNode;

Также учтите следующее:

tail = tail->next;
tail = newNode;

Какой смысл присваивать значение переменной, если выпереназначить эту же переменную в следующем операторе?Ранее у вас тоже была та же ошибка:

newNode->p = malloc(sizeof(struct process));
newNode->p = newProcess;

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

1 голос
/ 24 марта 2019

Установка tail = tail->next устанавливает tail в null, потому что он не устанавливается в первый раз, а затем и tail, и head немедленно перезаписываются при следующем вызове.

...