如果尝试在链表程序中添加多个条目,为什么此代码会忽略该条目



我不明白这段代码出了什么问题,我的意思是它运行了,但不允许在列表中添加多个值,如果我试图添加多个数值,它就会忽略该条目

#include<iostream>
#include<string>
#include<limits>//For cleaning buffer i used some code in the line 19
#include<ios>//For cleaning buffer i used some code in the line 19
using namespace std;
class node{
public:
node *link;
int info1;
string info2;
};
node *START=NULL;
node *createNode(){
node *obj=new node();
obj->link=NULL;
cout<<"Enter the integer info 1"<<endl;
cin>>obj->info1;
cin.ignore(numeric_limits<streamsize>::max(),'n');
cout<<"Enter the String info 2"<<endl;
getline(cin,obj->info2);
return obj;
}

我仔细检查了这个add((函数,但没有发现问题

void add(){//Addition from last
if(START==NULL){
START=createNode();
}
else{
node *temp=START;
while(temp!=NULL){//Main Logic
temp=temp->link;
}
temp=createNode();
}
}

我也仔细检查了这个del((函数!!但是我没有发现的问题

void del(){//Deletion from beginning
if(START==NULL) 
cout<<endl<<"There is nothing to delete!!"<<endl;
else{
node *temp=START;
START=START->link;
delete temp;
}
}

我也仔细检查了这个print((函数!!但是我没有发现的问题

void print(){
if(START==NULL)
cout<<endl<<"There is nothing to print!!"<<endl;
else{
node *temp=START;
while(temp!=NULL){
cout<<"Info 1 : "<<temp->info1<<endl;
cout<<"Info 2 : "<<temp->info2<<endl<<endl;
temp=temp->link;
}
}
}
int menu(){
int choice;
cout<<endl<<"1. Add"<<endl;
cout<<"2. Delete"<<endl;
cout<<"3. Print"<<endl;
cout<<"0. Exit"<<endl;
cin>>choice;
cin.ignore(numeric_limits<streamsize>::max(),'n');
return choice;
}
int main(){
int choice;
cout<<"Hello There!!"<<endl<<"Choose one option!!"<<endl;
do{
choice=menu();
switch(choice){
case 1:{
add();
break;
}
case 2:{
del();
break;
}
case 3:{
print();
break;
}
}
}while(choice!=0);
}

我的结论是add((函数有问题,但我找不到是什么!!

您的add函数存在缺陷。当您尝试添加第二个节点时,您将创建一个新节点,将其地址存储在temp中,然后离开该函数。变量temp超出范围,并且新节点丢失。它从未附加到列表中。你必须重新思考这个功能。

您实际上还没有将创建的temp节点链接到上一个节点。您可以通过temp=createNode()创建一个节点。但是,没有以前的节点链接到此新节点。

因此,您必须将条件(temp!=NULL)更改为(temp->link != NULL)。一旦检测到指向新节点的链接是NULL,就创建新节点并将其分配给temp->link。这会将链接列表中的最后一个节点链接到您刚刚创建的新节点。

因此,您的新代码将具有以下结构:

//Addition to last element of linked list
void add(){
if(START==NULL){
START=createNode();
}
else{
node *temp = START;
while(temp->link != NULL){ // CHANGE HERE
temp = temp->link; 
}
temp->link = createNode(); // CHANGE HERE
}
}

基于指向您可能想要附加新节点的链接的更简单的方法。这消除了对START的特殊情况的需要,因为START只是另一个具有不同名称的link

通过指向link,我们在前一个节点中有插入点,并且有一条到列表中下一个节点的路径。这减少了额外记账的需要。

void add() { 
node **curpp = &START; // point at the start pointer
while ((*curpp) != NULL) { // test if the pointer at the current pointer is in use
curpp = &(*curpp )->link; // in use, advance to next link
}
*curpp = createNode(); // create and store new pointer at the current pointer
}

附带说明:通过使所有函数都依赖于全局变量START,您只能拥有一个链表。这并不是特别有用。您应该将列表的根节点传递给需要它的函数,或者创建一个链表类来管理自己的根节点(从而管理自己的列表(

相关内容

  • 没有找到相关文章

最新更新