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吗是否考虑创建双链接列表?