C++ 将节点添加到链接列表的末尾

C++ 将节点添加到链接列表的末尾,c++,insert,linked-list,traversal,C++,Insert,Linked List,Traversal,我一直在尝试将一个项目添加到链接列表的末尾。我想我已经掌握了这个概念,但是我很难实现代码。特别是,能够遍历链表并找到尾部。这是我到目前为止所拥有的。我已经做了一段时间了,试着做不同的事情。任何帮助都将不胜感激 ##include <iostream> using namespace std; class node { public: int data; node *next; }; class linkedList { private: node* p

我一直在尝试将一个项目添加到链接列表的末尾。我想我已经掌握了这个概念,但是我很难实现代码。特别是,能够遍历链表并找到尾部。这是我到目前为止所拥有的。我已经做了一段时间了,试着做不同的事情。任何帮助都将不胜感激

##include <iostream>
using namespace std;


class node
{
public:
    int data;
    node *next;
};


class linkedList
{
private:
    node* ptrHead;
    node* ptrTail;

    int size;

public:
    linkedList();  //default constructor
    void display();
    void addFront(int);
    void removeFront();
    void addBack(int);
    void removeBack();
};

//default constructor
linkedList::linkedList(){
    size = 0;
    ptrHead = ptrTail = NULL;
}
//display linked list
void linkedList::display(){
    node* current = ptrHead;

    while (current != NULL) {
        cout << current->data << " "; //display current item
        current = current->next; //move to next item
    }
    cout << size;
}
//add item to front of linked list
void linkedList::addFront(int addData){

    node* n = new node;
    n->next = ptrHead;
    n->data = addData;
    ptrHead = n;

    size++;
}
//remove item from front of linked list
void linkedList::removeFront(){

    node* n = ptrHead;
    ptrHead = ptrHead->next;
    delete n;

    size--;
}

       void linkedList::addBack(int addData){   ////work in progress


        node* n = new node; //create new node
        n->data = addData;  //input data
        n->next = NULL;     //set node to point to NULL

        if ( ptrTail == NULL )  // or if ( ptrTail == nullptr )
        {
            ptrHead = n;
            ptrTail = n;
        }
        else
        {
            ptrTail->next = n;
            ptrTail = n;
        }

        size++;
    }



    //this is the test code from my main function
              int main()
        {
            //test code
            linkedList list;

            list.addFront(40);
            list.addFront(30);
            list.addFront(20);
            list.addFront(10);
            list.addFront(0);
            list.addBack(50);
            list.addBack(60);

            list.display(); //50 60 7  (the 7 is the count/size of the linked list)
            cout << endl;
        }
##包括
使用名称空间std;
类节点
{
公众:
int数据;
节点*下一步;
};
类链接列表
{
私人:
节点*ptrHead;
节点*ptrTail;
整数大小;
公众:
linkedList();//默认构造函数
void display();
无效地址(int);
void removeFront();
无效加回(int);
void removeBack();
};
//默认构造函数
linkedList::linkedList(){
尺寸=0;
ptrHead=ptrTail=NULL;
}
//显示链表
void linkedList::display(){
节点*电流=ptrHead;
while(当前!=NULL){
cout data next;//移动到下一项
}
cout-next=ptrHead;
n->data=addData;
ptrHead=n;
大小++;
}
//从链接列表的前面删除项目
作废linkedList::removeFront(){
节点*n=ptrHead;
ptrHead=ptrHead->next;
删除n;
大小--;
}
void linkedList::addBack(int addData){///正在进行的工作
node*n=new node;//创建新节点
n->data=addData;//输入数据
n->next=NULL;//将节点设置为指向NULL
if(ptrTail==NULL)//或if(ptrTail==NULL)
{
ptrHead=n;
ptrTail=n;
}
其他的
{
ptrTail->next=n;
ptrTail=n;
}
大小++;
}
//这是我的主函数中的测试代码
int main()
{
//测试代码
链接列表;
addFront(40);
列表。addFront(30);
列表。addFront(20);
列表。addFront(10);
列表。addFront(0);
列表。加回(50);
列表。addBack(60);
list.display();//50 60 7(7是链表的计数/大小)
试试这个

node* pCurrent = ptrHead;
if( pCurrent != NULL ){
    //find tail
    while (pCurrent->next != NULL)
        pCurrent = pCurrent->next;

    // add new node at end of tail
    pCurrent->next = n;
    } else {
        pCurrent = n;
    }
}
试试这个

node* pCurrent = ptrHead;
if( pCurrent != NULL ){
    //find tail
    while (pCurrent->next != NULL)
        pCurrent = pCurrent->next;

    // add new node at end of tail
    pCurrent->next = n;
    } else {
        pCurrent = n;
    }
}

您没有显示linkedList的定义

所以我只能假设它有数据成员ptrTail和ptrHead

void linkedList::addBack(int addData)
{
   node* n = new node; //create new node
   n->data = addData;  //input data
   n->next = NULL;     //set node to point to NULL

   if ( ptrTail == NULL )  // or if ( ptrTail == nullptr )
   {
      ptrHead = n;
   }
   else
   {
      ptrTail->next = n;
   }
   ptrTail = n;

   size++;
}
函数
addFront
可以用类似的方式定义

void linkedList::addFront(int addData)
{
   node* n = new node; //create new node
   n->data = addData;  //input data

   if ( ptrHead == NULL )  // or if ( ptrHead == nullptr )
   {
      ptrTail = n;
   }

   n->next = ptrHead;
   ptrHead = n;

   size++;
}
还有一个功能

void linkedList::removeFront()
{
    if ( ptrHead != NULL )
    {
        if ( ptrTail == ptrHead ) ptrTail = NULL;
        node* n = ptrHead;
        ptrHead = ptrHead->next;
        delete n;
        size--;
    }
}

您没有显示linkedList的定义

所以我只能假设它有数据成员ptrTail和ptrHead

void linkedList::addBack(int addData)
{
   node* n = new node; //create new node
   n->data = addData;  //input data
   n->next = NULL;     //set node to point to NULL

   if ( ptrTail == NULL )  // or if ( ptrTail == nullptr )
   {
      ptrHead = n;
   }
   else
   {
      ptrTail->next = n;
   }
   ptrTail = n;

   size++;
}
函数
addFront
可以用类似的方式定义

void linkedList::addFront(int addData)
{
   node* n = new node; //create new node
   n->data = addData;  //input data

   if ( ptrHead == NULL )  // or if ( ptrHead == nullptr )
   {
      ptrTail = n;
   }

   n->next = ptrHead;
   ptrHead = n;

   size++;
}
还有一个功能

void linkedList::removeFront()
{
    if ( ptrHead != NULL )
    {
        if ( ptrTail == ptrHead ) ptrTail = NULL;
        node* n = ptrHead;
        ptrHead = ptrHead->next;
        delete n;
        size--;
    }
}


这是有效的。非常感谢您,好先生。我一直试图将我的pCurrent节点分配给我的tail节点,结果弄混了。@JosephK这不起作用,因为ptrHead可以等于NULL。这是一个无效代码。请参阅我的帖子。如果在空列表上将列表管理为
ptrHead==NULL
,则此答案是错误的。如果列表为婴儿床到头部前哨淋巴结哲学(这既令人困惑又令人讨厌),它可能会起作用。但不管怎样,取消引用而不检查几乎总是错误的。这是有效的。非常感谢您,好的先生。我一直试图将我的pCurrent节点分配给我的tail节点,结果弄得一团糟。@JosephK这不起作用,因为pThHead可以等于NULL。这是一个无效代码。请参阅我的帖子。如果在一个空列表上,该列表被管理为
ptrHead==NULL
。如果该列表归因于头部前哨节点philosphy(这既令人困惑又令人讨厌),它可能会起作用。但不管怎样,取消引用而不检查几乎总是错误的。如果您整合
ptrTail=n;
(我知道,它变化无常,但它非常接近,而且是您先发布的,我会很高兴地抛出我的答案并将其加上标记。)我尝试以这种方式实现它,但得到的结果很奇怪。我的输出是0 10 20 30 40,在我将50和60添加到后面之后,我的输出仅为50 60。@JosephK,正如我所说,您没有显示您的类定义。此错误可能是其他错误成员函数定义的结果。例如,在构造函数。@JosephK使用这个类定义,函数必须正常工作。@JosephK如果有错误,那么它就在函数addFront中。如果你合并
ptrTail=n;
(我知道,它变化无常,但它非常接近,而且你先发布了…),我会很高兴地抛出我的答案并将其加起来我尝试以这种方式实现它,但得到的结果很奇怪。我的输出是0 10 20 30 40,在我将50和60添加到后面之后,我的输出仅为50 60。@JosephK,正如我所说,您没有显示您的类定义。此错误可能是其他错误成员函数定义的结果。例如,在构造函数。@JosephK使用此类定义,函数必须正常工作。@JosephK如果有错误,则它位于函数addFront中。这并不能回答您的问题,但您是否考虑过创建一个双链接列表?如果您将“n->prev”指针添加到“node”,则可以避免每次添加节点时都必须遍历整个列表em到列表的末尾。我还没有学习双链表。我正在努力学习。不过谢谢你的提示。:)你已经确定了单链表的主要缺点。有一些非常具体的场景,其中以线性方式从头到尾遍历完美地模拟了所需的函数。例如,foreach block将从头到尾处理每条语句,除非您添加退出条件以打破循环。双链接列表的工作原理相同,但包含双向的引用和指针。它增加了更多开销,但在某些特定情况下很有用,与单链接列表的工作方式相同。这并不能回答您的问题,但您有c吗是否考虑创建双链接列表?