вставка связанного списка и печать C ++ - PullRequest
0 голосов
/ 09 июня 2019

Поэтому я пытаюсь использовать двойные указатели для создания функции вставки, а затем распечатать связанный список.

Мне удалось сделать это с одиночными указателями, но этот двойной указатель сводит меня с ума.

#include <iostream>
#include <string>

using namespace std;

class Node {
public:
   string name;
   int ID;
   int marks[10];
   Node *next;
};

void printOptions() {
    cout << endl;
    cout << "1.Insert New Node" << endl;
    cout << "2.Print List" << endl;
    cout << "3.Exit" << endl;
}

void insertAtBack(string inputName, Node **headref) {
    Node **currentNodeRef;
    currentNodeRef = headref;

        while ((*currentNodeRef)->next != NULL) {
             (*currentNodeRef) = (*currentNodeRef)->next;
    }
    (*currentNodeRef)->next = new Node();
    (*currentNodeRef)->next->name = inputName;
    (*currentNodeRef)->next->next = NULL;

 }

 void printList(Node *head) {
    Node *indexNode;
    indexNode = head;
    while (indexNode != NULL) {
        cout << (indexNode)->name << endl;
        (indexNode) = (indexNode)->next;
    }
  }

 int main() {

       cout << "This implements a linked list" << endl;

       int option;
       bool infinite = true;

       Node *head = NULL;
       string testName;

       while (infinite == true) {
         printOptions();
         std::cin >> option;


         switch (option) {

         case 1:
            cout << "Enter student name" << endl;
            std::cin >> testName;
            if (head == NULL) {
                 head = new Node();
                 head->name = testName;
            }
            else {
                 insertAtBack(testName, &head);
            }
            break;

         case 2:
             printList(head);
             break;

         case 3:
             exit(1);
             break;
         default:
             exit(1);
             break;
         }

       }
     return 0; 
    }

Таким образом, нет ошибки компиляции или ошибки сегмента, но вместо запуска кода он принимает 2 значения и печатает их нормально.когда вводится другое значение, оно печатает только 2 значения.Я думаю, что функция печати хороша, потому что раньше она работала с одним указателем, но я не уверен на 100%.Я думаю, что проблема в функции вставки, но я не сир, где.

1 Ответ

0 голосов
/ 10 июня 2019
void insertAtBack(string inputName, Node **headref) {
    Node **currentNodeRef;
    currentNodeRef = headref;
    ...

Node **currentNodeRef = headref; - ошибка.Помните, что вы передаете адрес указателя.Вы хотите написать:

Node *currentNodeRef = *headref;

И изменить функцию следующим образом:

void insertAtBack(string inputName, Node **head) 
{
    Node *tail = *head;
    while(tail->next != NULL)
        tail = tail->next;
    tail->next = new Node();
    tail->next->name = inputName;
    tail->next->next = NULL;
}

Также не забудьте инициализировать head->next = nullptr;

if (head == NULL) {
                 head = new Node();
                 head->name = testName;
                 head->next = nullptr; <--- add
            }

Однако лучше, если insertAtBack готов обработать head, когда head равен NULL.Причина, по которой вы передаете Node **head, заключается в том, что вам нужна ссылка на указатель, чтобы вы могли ее инициализировать.Таким образом, вы можете изменить код как:

void insertAtBack(string inputName, Node **head) 
{
    Node *new_node = new Node();
    new_node->name = inputName;
    new_node->next = nullptr;

    if(*head)
    {
        Node *tail = *head;
        while(tail->next)
            tail = tail->next;
        tail->next = new_node;
    }
    else
    {
        *head = new_node;
    }
}

void printList(Node *head) 
{
    Node *node = head;
    while(node) 
    {
        cout << node->name << endl;
        node = node->next;
    }
}

int main() 
{
    cout << "This implements a linked list" << endl;
    Node *head = NULL;
    string testName;
    while(true) 
    {
        printOptions();
        int option;
        std::cin >> option;
        switch(option) 
        {
        case 1:
            cout << "Enter student name" << endl;
            std::cin >> testName;
            insertAtBack(testName, &head);
            break;
        case 2: printList(head); break;
        case 3: exit(1); break;
        default: exit(1); break;
        }
    }
    return 0;
}
...