Link 列表中的删除显示“0”

Deletion in Link List showing "0"

我不明白为什么在尝试删除列表的第一个元素时得到的是 0? 我插入了 3 个元素(7、8、9),删除 8 或 9 时它对我来说工作正常,但是当我尝试删除 7(即第一个元素)时,无论列表中存在的元素数是多少只得到0的val,最后附上截图。

代码是这样工作的

这是代码

# include <iostream>
using namespace std;
class node{
        private:
        int info;
        class node *ptr;
        public:

        class node * insertNode(class node * head);
        void traverseList(class node * head);
        class node * deleteNode(class node * head);
};
class node * node::insertNode(class node * head){
    node * newNode=new node();
    node * curNode=new node();
    int position,srchPos=0;
    if(newNode==NULL)
        cout<<"Node Creation Failed"<<endl;
    else{
        cout<<"Enter data to be stored"<<endl;
        cin>>newNode->info;
        newNode->ptr=NULL;
        cout<<"To Add in First Position  Press 1 else 2\n";
        cin>>position;
        if(position==1){
                newNode->ptr=head;
                head=newNode;           
            }
        else{
                curNode=head;
                cout<<"Enter the data after which you want to insert\n";
                cin>>srchPos;
                while((curNode->info!=srchPos)&&(curNode->ptr!=NULL)){
                        curNode=curNode->ptr;
                }
                if(curNode==NULL){
                        cout<<"Data not Found"<<endl;               
                }
                else{
                        newNode->ptr=curNode->ptr;
                        curNode->ptr=newNode;
                }
        }
    }
        return head;
}
void node::traverseList(class node * head){
            node * curNode=new node();
            curNode=head;
            cout<<"Data Present in the List ::\n";
            while(curNode!=NULL){
            cout<<curNode->info<<"\t";
            curNode=curNode->ptr;
            }
}
class node * node::deleteNode(class node * head){

        node * curNode=new node();
        node * prevNode=new node();
        int data; 
        if(head==NULL)
        cout<<"List Empty\n";
        cout<<"Enter Data to be deleted\n";
        cin>>data;
        curNode=head;
        while(curNode!=NULL){
            if(curNode->info==data){
                    if(curNode==head){   //This part where my code fails
                        head=head->ptr;
                        cout<<"val of head at:"<<head->info;
                        delete (curNode);
                        return head;                    
                    }
                    else{
                        prevNode->ptr=curNode->ptr;
                        delete(curNode);                
                        return head;    
                    }
            }
            else{
                    prevNode=curNode;           
                    curNode=curNode->ptr;
            }
    }
        cout<<"Node not found\n"    ;
        return head;

}
int main()
{
    node *head =NULL;
    node *n1=new node();
    int choice;
    while(1){
        cout<<"\n1:: Insert Node\t2:: Traversal\t3:: Delete\n";
        cout<<"Enter your Choice\n";
        cin>>choice;
        switch(choice){
            case 1:     head=n1->insertNode(head);
                        break;
            case 2: n1->traverseList(head);
                        break;
            case 3 :n1->deleteNode(head);
                        break;
            default: cout<<"Invalid Choice\n";
                            break;
        }           
    }
    return 0;
}

谁能帮我解决我所缺少的

这是我执行的快照

问题是您正在将 head 移动到 head->ptr,但是您在调用删除函数时未捕获 return 值(地址)。

case 3 :n1->deleteNode(head);

改为:

case 3 : head = n1->deleteNode(head);

这里不仅有head问题,deleteNode方法中也有内存泄漏。在 deleteNode 的开头,您将 curNode 和 prevNode 分配给新节点:

node * curNode=new node();
node * prevNode=new node();

然后您稍后在方法中重新分配两者,而不删除您创建的分配。

那么对于head没有按预期变化的情况,可以修改head指向的地址,但是不能用单个指针改变head指向的地址。您应该将 main 函数中的 head 重新分配给 deleteNode 返回的值,或者将 head 作为双指针传递给 deleteNode,以便您可以更改它指向的对象。