我不明白这段代码出了什么问题,我的意思是它运行了,但不允许在列表中添加多个值,如果我试图添加多个数值,它就会忽略该条目
#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
,您只能拥有一个链表。这并不是特别有用。您应该将列表的根节点传递给需要它的函数,或者创建一个链表类来管理自己的根节点(从而管理自己的列表(