C ++ присвоение нового адреса * next в структуре данных - PullRequest
2 голосов
/ 17 февраля 2012

есть кое-что, что я не могу придумать ... По сути, мне дана следующая структура данных:

struct node_ll {
    int payload;
    node_ll *next;  //pointer to next node
};

По сути, это набор чисел.Мне нужно создать метод со следующим прототипом:

int tail_return(node_ll **list)

, где **list - адрес памяти вышеупомянутой структуры данных.Моя реализация выглядит следующим образом:

int tail_return(node_ll **list) {

    node_ll *temp;
    temp = *list;

    node_ll *prev_temp;
    prev_temp = *list;

    bool firstPass = true;

    while(temp){

        if(firstPass == true){
        temp = temp->next;
        firstPass = false;

        } else {
            temp = temp->next;
            prev_temp = prev_temp->next;

        }
    }

    int toReturn = prev_temp->payload;

    prev_temp->payload = 0;
    (**list).next = prev_temp;

    delete temp;
    delete prev_temp;
    return toReturn;
}

Однако я получаю следующие результаты тестовых запусков:

List a after head insertion of 2,4,6,8,10 elements:

{10,8,6,4,2}

now removing the last element

DELETED: 2

{10,0} where it's supposed to be: {10,8,6,4}

Что я делаю не так?Очевидно, метод находит правильное значение для удаления - 2. Но почему, когда я пытаюсь распечатать его после удаления, я получаю 10 и 0?

Ответы [ 3 ]

1 голос
/ 17 февраля 2012

Я предполагаю, что tail_return должен взять связанный список node_ll и удалить элемент tail?

Да на @Aditya, похоже на

(**list).next = prev_temp;
Строка

вызывает проблему. Причина в том, что вы переназначаете список, чтобы он указывал на второй или последний элемент (prev_temp)

Удаление последнего элемента правильно сделано с помощью

delete temp;

А также убрать строку

delete prev_temp;

, так как при этом также удаляется второй-последний элемент, который вы хотите сохранить.

Кроме того, вы в настоящее время возвращаете второй к последнему элементу. Так что поменяй

int toReturn = prev_temp->payload;

до

int toReturn = temp->payload;
1 голос
/ 17 февраля 2012
(**list).next = prev_temp;

слишком сложно.Если вы напишите это как

(*list)->next = prev_temp;

, то теперь становится ясно (э), что вы изменили первый элемент в списке.

Это всего лишь небольшая рекомендациядля написания более понятного кода.Посмотрите другие ответы для решения вашей проблемы.

1 голос
/ 17 февраля 2012
 (**list).next = prev_temp;

должно быть

prev_temp->next = 0 ; 

когда вы делаете (**list).next = prev_temp;, вы управляете параметром, который был передан вашему методу, а не последним узлом в связанном списке.

...