Link 列表中的删除显示“0”
Deletion in Link List showing "0"
我不明白为什么在尝试删除列表的第一个元素时得到的是 0?
我插入了 3 个元素(7、8、9),删除 8 或 9 时它对我来说工作正常,但是当我尝试删除 7(即第一个元素)时,无论列表中存在的元素数是多少只得到0的val,最后附上截图。
代码是这样工作的
- 在第一个位置插入一个元素(为此按 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;
}
谁能帮我解决我所缺少的
这是我执行的快照
问题是您正在将 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,以便您可以更改它指向的对象。
我不明白为什么在尝试删除列表的第一个元素时得到的是 0? 我插入了 3 个元素(7、8、9),删除 8 或 9 时它对我来说工作正常,但是当我尝试删除 7(即第一个元素)时,无论列表中存在的元素数是多少只得到0的val,最后附上截图。
代码是这样工作的
- 在第一个位置插入一个元素(为此按 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;
}
谁能帮我解决我所缺少的
这是我执行的快照
问题是您正在将 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,以便您可以更改它指向的对象。