在链接列表中删除显示“0”

时间:2015-06-16 18:45:32

标签: c++ linked-list

我无法弄清楚为什么在尝试删除列表的第一个元素时会得到0? 我已经插入了3个元素(7,8,9),当我删除8或9时它对我来说工作正常,但当我试图删除7(.ie第一个元素)时,无论列表中存在的元素是否存在只得到val为0,最后附上截图。

这就是代码的工作方式

  • 在第一个位置插入一个元素(按1表示) 其他职位新闻2
  • 显示列表
  • 从列表中删除元素

这是代码

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

有人可以帮助我解决我错过的问题

这是我执行的快照 enter image description here

2 个答案:

答案 0 :(得分:3)

问题是您正在将head转移到head->ptr但是在调用删除功能时您没有捕获返回值(地址)。

case 3 :n1->deleteNode(head);

将其更改为:

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

答案 1 :(得分:1)

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

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

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

然后,对于未按预期更改的头,您可以修改头指向的地址,但不能使用单个指针更改地址头点。您应该将main函数中的head重新分配给deleteNode返回的值,或者将head作为双指针传递给deleteNode,以便您可以更改它指向的对象。