无法添加到交换机中的链表

Can't add to linked list in switch

本文关键字:链表 交换机 添加      更新时间:2023-10-16

我测试了我的类成员函数,将其添加到交换机之外的链表中,它可以工作。但当我尝试在我的交换机中使用它时,它并没有。它实际上不会添加到列表中,因为当我显示列表时,没有任何内容。

类别和实现:

#ifndef HEADER_H
#define HEADER_H
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
template <class T>
class LinkedList{
        template<typename T>
        class Node
        {
        public:
                Node(T value = 0) : data(value), nextptr(NULL){};
                T retrieve() const{ return data; }
                Node<T> *next() const{ return nextptr; }
        private:
                T data;
                Node<T> *nextptr;
                friend LinkedList<T>;
        };
public:
        LinkedList();
        LinkedList(const T& x); //Copy Constructor
        ~LinkedList();
        void DisplayList();
        void ReverseList();
        LinkedList<T> operator= (const LinkedList<T> & x); //Assignment Operator
        bool isEmpty() const{ return Size() == 0; }
        int Size() const{ return n; }
        bool ElementAt(int k, T& x) const;
        LinkedList<T>& RemoveAt(int k, T& x)
        {
                if (k < 0 || k >= Size())
                {
                        cout << "Index not in list.";
                }
                Node<T> *del = NULL;
                if (k == 0)
                {
                        del = list_head;
                        list_head = del->nextptr;
                }
                else
                {
                        Node<T> *prev = list_head;
                        del = list_head->nextptr;
                        for (int i = 1; i< k; i++)
                        {
                                prev = del;
                                del = del->nextptr;
                        }
                        prev->nextptr = del->nextptr;
                }
                n--; x = del->data; delete del;
                return *this;
        }
        LinkedList<T>& Add(const T& x)
        {
                Node<T>
                        *node = new Node<T>(x);
                if (Size() == 0)
                        list_head = node;
                else
                {
                        Node<T> *temp = list_head;
                        while (temp->nextptr)
                        {
                                temp = temp->nextptr;
                        }
                        temp->nextptr = node;
                }
                n++;
                return *this;
        }

private:
        Node<T> *list_head;
        int n;
};
//Constructor
template<class T>
LinkedList<T>::LinkedList()
{
        list_head = NULL;
        n = 0;
}
//Copy Constructor
template<class T>
LinkedList<T>::LinkedList(const T& x)
{
        list_head = x.listhead;
        n = x.n;
}
//Destructor
template<class T>
LinkedList<T>::~LinkedList()
{
        Node<T> *temp = list_head, *del, *nextptr;
        while (temp != NULL)
        {
                del = temp->nextptr;
                delete temp;
                temp = del;
        }
}
template<class T>
bool LinkedList<T>::ElementAt(int k, T& x) const
{
        if (k < 0 || k >= Size())
                return false;
        Node<T> *temp = list_head;
        for (int i = 0; i< k; i++)
        {
                temp = temp->next;
        }
        x = temp->data;
        return true;
}
// Assignment Operator
template<class T>
LinkedList<T> LinkedList<T>::operator=(const LinkedList<T> & x)
{
        list_head = x.list_head;
        n = x.n;
        return *this;
}
template<class T>
void LinkedList<T>::DisplayList()
{
        Node<T> *temp = list_head;
        while (temp != NULL)
        {
                cout << temp->data << endl;
                temp = temp->nextptr;
        }
}
template<class T>
void LinkedList<T>::ReverseList()
{
        Node<T> *t, *y = list_head, *r = NULL, *listhead;
        while (y != NULL)
        {
                t = y->nextptr;
                y->nextptr = r;
                r = y;
                y = t;
        }
        list_head = r;
}
#endif

驱动程序:

#include "stdafx.h"
#include <iostream>
#include "Header.h"
using namespace std;
int main()
{
        int choice;
        string item;
        do
        {
                LinkedList<string> list;

                int num;
                cout << "1. Add new record to the file" << endl;
                cout << "2. Delete a record in the file (by index)" << endl;
                cout << "3. Display entire list of items" << endl;
                cout << "4. Display entire list of items backwards" << endl;
                cout << "5. Exit" << endl;
                cin >> choice;
                switch (choice)
                {
                case 1:
                {
                                  cout << "1. Add new record to the file" << endl;
                                  cout << "Enter the Item Description:" << endl;
                                  cin.ignore();
                                  getline(cin, item);
                                  list.Add(item);
                }
                        break;
                case 2:
                {
                                  cout << "2. Delete a record in the file" << endl;
                                  cout << "Enter the index number of the item you want to delete" << endl;
                                  cin >> num;
                                  //list.RemoveAt(num);
                }
                        break;
                case 3:
                {
                                  cout << "3. Display entire list of items" << endl;
                                  list.DisplayList();
                }
                        break;
                case 4:
                {
                                  cout << "4. Display entire list of items backwards" << endl;
                                  list.ReverseList();
                                  list.DisplayList();
                                  list.ReverseList();
                }
                        break;
                case 5:
                {
                                  return 0;
                }
                        break;
                }
        } while (0 < choice < 6);

        return 0;
}

有什么想法吗?

list声明移动到do..while循环之外。目前,每次循环时都会对其进行重新初始化。