1

我是链表的初学者。最初,我创建了一个单节点链接列表并尝试显示其数据,但由于该 while(temp1!=NULL)条件未显示。然后我试图在一个循环中接受一些输入,但现在我得到了未处理异常的错误,这是我的代码:

struct node
{
int data;
node* next;
};

//Initializing a NULL pointer for head
    node *head=NULL;

//create a temporary node 
    node *temp; 

//allocate space for node 
    temp = (node*)malloc(sizeof(node));

//Initilaizing avariable of node type to store data
node info;
for (int i=0;i<3;i++){
cout<<"Enter Data\t";
cin>>info.data;

//Store data(First Field)
temp->data=info.data;

//Store the address of the head pointer(Second Field)
temp->next=head;

//Converting temp into head since we are adding data from front
    temp=head;
}
  //==============Traversing the Link List=====================//
//Declaring a temporary pointer
 node *temp1;

//Assigning the address of head to temp1
temp1=head;

//Loop to traverse the list
cout<<"the data"<<endl;
while(temp1!=NULL)
{
    cout<<"the data is"<<endl;
    cout<<temp1->data<<endl;
    temp1=temp1->next;
}
4

4 回答 4

6

这就是问题所在

temp = (node*)malloc(sizeof(node)); 
//Initilaizing avariable of node type to store data
node info;
for (int i=0;i<3;i++)
{
    cout<<"Enter Data\t";
    cin>>info.data;
    //Store data(First Field)
    temp->data=info.data;
    //Store the address of the head pointer(Second Field)
    temp->next=head;
    //Converting temp into head since we are adding data from front
    temp=head;
}

您正在尝试构建包含三个项目的列表,因此您必须分配三个节点。但是上面的代码只分配了一个节点。您需要将调用移动到malloc循环内部,以便调用 3 次。

于 2013-04-29T05:36:33.403 回答
1

如果这是 C++,请不要使用 malloc,如果这是 C,请不要使用 cout。您在糟糕的编码中混合了两种语言。

每次打电话时,你首先要考虑malloc的是“我什么时候才能有空?” 在输入之前您必须做的第一件事new是“我什么时候删除?”。

第二个要考虑的是“谁负责物品的寿命”:是“拥有”整个清单的主人,还是物品彼此欠款?或者是其他东西(即列表本身是一个对象,而不仅仅是项目)

在这一点上,考虑两个类:一个node携带值,一个list托管节点并提供购买和关闭节点的方法,一个遍历节点。

于 2013-04-29T06:22:16.833 回答
0
temp = (node*)malloc(sizeof(node)); 

您只分配一个节点,而您需要分配三个因此该语句应该循环,以便可以为每个节点分配内存

于 2013-04-29T05:40:51.713 回答
0

这样做--->

node *head=NULL;
node *temp,*ptr;
temp=ptr=NULL
for (int i=0;i<3;i++)
{
     temp = (node*)malloc(sizeof(node));
     cout<<"Enter Data\t";
     cin>>info.data;
     //Store data(First Field)
     temp->data=info.data;
     //Store the address of the head pointer(Second Field)

      //Converting temp into head since we are adding data from front
      if(head== NULL)
      {
        head=temp;
        temp->next=NULL;
        ptr=temp;
       }
      else
      {
          ptr->next=temp;
          temp->next=NULL;
          ptr=temp;
      }
}

现在列表已填满,head 指向第一个节点,因此您可以访问它。

于 2013-04-29T05:46:06.643 回答