首页 > 解决方案 > 大家,我已经更改了我的代码,现在我正在使用已成功构建但未打印任何内容的函数制作链表,请告诉我的错误

问题描述

#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;
}

我试图通过将其拆分为函数来制作链表。它构建成功,但没有打印任何东西,谁能告诉我我的错误。首先在这篇文章中,我试图删除一个不在函数中的节点现在我有另一个疑问,我正在使用函数制作链表。

标签: c++algorithmdata-structureslinked-listsingly-linked-list

解决方案


对于初学者,您的代码不区分等于 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;
           }

请注意,处理位置的程序的其他部分也可能会调用未定义的行为或产生内存泄漏,应该重写。

如果您将程序拆分为单独的功能,那会更好。


推荐阅读