c++ - 大家,我已经更改了我的代码,现在我正在使用已成功构建但未打印任何内容的函数制作链表,请告诉我的错误
问题描述
#include <iostream>
using namespace std;
class Node{
public:
int data;
Node *next;
};
class LinkedList{
Node *head;
public:
//Node *head;
LinkedList(){
head=NULL;
}
void addAtTail(int);
void print();
};
void LinkedList::addAtTail(int val){
Node *nodeToAdd=new Node();
nodeToAdd->data=val;
if(head==NULL){
head=nodeToAdd;
}
else{
Node *temp=head;
while(temp!=NULL){
temp=temp->next;
}
temp->next=nodeToAdd;
}
}
void LinkedList::print(){
Node *temp=head;
while(temp->next!=NULL){
cout<<temp->data;
temp=temp->next;
}
}
int main()
{
LinkedList ll;
ll.addAtTail(10);
ll.addAtTail(20);
ll.addAtTail(30);
ll.print();
cout<<"Hello World";
return 0;
}
我试图通过将其拆分为函数来制作链表。它构建成功,但没有打印任何东西,谁能告诉我我的错误。首先在这篇文章中,我试图删除一个不在函数中的节点现在我有另一个疑问,我正在使用函数制作链表。
解决方案
对于初学者,您的代码不区分等于 0 的位置和等于 1 的位置,因为对于这两个位置,这个 while 循环
while(i<pos-1){
curNode=curNode->next;
i++;
}
不会被执行。
同样在循环中,您不会检查是否curNode
等于空指针。
这个说法
curNode->next=curNode->next->next;
curNode->next
如果 when是空指针,也可以调用未定义的行为。
并且从列表中删除的节点应该使用操作符 delete 删除。否则会出现内存泄漏。
例如,您可以通过以下方式重写此代码段
else{
cout<<"Enter Position - ";
cin>>pos;
if ( pos < 0 )
{
std::cout << "Invalid position.\n";
}
else
{
Node **curNode = &head;
while ( *curNode && pos-- )
{
curNode = &( *curNode )->next;
}
if ( *curNode == nullptr )
{
std::cout << "Invalid position.\n";
}
else
{
Node *tmp = *curNode;
*curNode = ( *curNode )->next;
delete tmp;
}
}
break;
}
请注意,处理位置的程序的其他部分也可能会调用未定义的行为或产生内存泄漏,应该重写。
如果您将程序拆分为单独的功能,那会更好。
推荐阅读
- c# - 在 .editorconfig (Visual Studio 2019) 中为缺少 xml 注释配置警告
- leaflet - 更改leafletjs中的默认图层
- firebase - 自动从firestore触发器创建集合索引
- swift - 如何使用viewController编写代码以在swift 5中显示字母及其数字分数
- sql-server - 适当避免 SQL 注入
- android - 我应该如何从服务器获取数据以进行 recyclerview
- python - 如何跳过中间节点?
- javascript - 无法读取welcomeChannel.send 中未定义的属性“发送”
- css - 图像 Flexbox 样式在 Github Markdown 中不起作用
- c++ - 在 C++ 中的链表中间插入节点时出现段错误