我无法弄清楚为什么在尝试删除列表的第一个元素时会得到0? 我已经插入了3个元素(7,8,9),当我删除8或9时它对我来说工作正常,但当我试图删除7(.ie第一个元素)时,无论列表中存在的元素是否存在只得到val为0,最后附上截图。
这就是代码的工作方式
这是代码
# 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;
}
有人可以帮助我解决我错过的问题
这是我执行的快照
答案 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,以便您可以更改它指向的对象。