вставка связанного списка, путаница с указателем - PullRequest
0 голосов
/ 14 марта 2019

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

class linkedList {
    private:
        typedef struct node {
                int data;
                struct node *next;
                node(int d):data(d), next(NULL){}
        }*nodePtr;

        nodePtr head, temp, curr;

    public:
        linkedList():head(NULL), temp(NULL), curr(NULL){}

        void pushBack(int d) { 
            temp = new node(d);
            curr = head;
            if (curr != NULL) {
                while (curr->next != NULL) {
                    curr = curr->next;
                }
                curr->next = temp;
            } else head = temp;
        }

        void printAll() {
            curr = head;
            cout << "list:" << endl;
            while (curr) {
                cout << curr->data << " ";
                curr = curr->next;
            }
            cout << endl;
        }
};

но почему моя функция pushBack не может быть написана так?

void pushBack(int d) {
        temp = new node(d);
        curr = head;
        while (curr != NULL) {
                curr = curr->next;
        }
        curr = temp;
}

Он должен перебирать список до появления curr == NULL, а затем устанавливать curr = temp. Если список пуст, то он не входит в цикл, и заголовок будет установлен на новый узел, если для параметра temp задано значение curr (для которого self задано значение head).

Логика имеет для меня смысл, поэтому я, должно быть, упускаю что-то еще.

Спасибо за помощь!

1 Ответ

2 голосов
/ 14 марта 2019

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

curr = head;

curr теперь указывает на head, а не наоборот. Когда curr затем назначается temp (то есть, когда первый узел добавляется в этот связанный список), вы только переназначаете указатель curr с местоположением, удерживаемым temp. Теперь все, что у вас есть, это указатель курсора, указывающий на то же место, что и temp, оба указателя которого вообще не связаны с указателем головы!

измененная версия вашего кода, которая будет работать:

void pushBack(int d)
{

  temp = new node(d);
  curr = head;
    if(curr!=NULL)
    {
       while (curr != NULL) 
       {
          curr = curr->next;
       }
        curr = temp;
    }
    else head=temp;
}


...