0

我的以下代码仅打印第一个元素。在print_list()功能上,它在打印第一个元素后停止。它在第一个元素之后说,head->next0。不应该指向第二个元素吗?

我想简单地打印整个列表。

#include<iostream>
#include<cstdlib>
using namespace std;    
struct node {
  int x;
  node *next;
};    
node* add_element(node*);
bool is_empty(node*);
void print_list(node*);
node* search(node*);

int main()
{
    node *head;
    head=NULL;
    node* current=head;
    for(int i=0;i<5;i=i+1)
    {
       if (current==NULL)
       { 
         current=add_element(current);
         head=current;
       }
       else{ 
          current=add_element(current);
       }
     }
     cout<<head->next<<endl;

     // DOUBT: head->next gives NULL value. It should give me pointer to 2nd node
     print_list(head);
}     
node* add_element(node* current)
{   
    node* temp;
    temp=new node;
    temp->next=NULL;
    cout<<"enter element"<<endl;
    cin>>temp->x;
    current=temp;
    return current; 
}      
bool is_empty(node* temp)
{
    return temp==NULL;      
}    
void print_list(node* temp)
{
    if (is_empty(temp)==false)
    {   
         cout<<"here temp(head)"<<temp->next<<endl;
         while(temp!=NULL)
         {
            cout<<temp->x<<endl;
            temp = temp->next;
         }
    }
}
4

4 回答 4

1

你的问题在这里:

node* add_element(node* current)
  {   
    node* temp;   //You created a new node
    temp=new node;  //You allocated it here
    temp->next=NULL;  //You set its next property to null
    cout<<"enter element"<<endl;  //
    cin>>temp->x;
    current=temp;   //This should be current->next = temp. You are overwriting it!
    return current; //And now you are returning essentially the temp object that
                    //You created and you set its next property to NULL
  }

您正在将创建的节点分配给temp = new node传入的当前节点。您要做的是将刚刚创建的节点分配给当前节点的 next 属性。它应该是current->next = temp

于 2013-08-24T15:26:31.593 回答
1

打印函数打印第一个元素,因为您在链接列表中只有一个节点!实际上错误存在于函数中,您用新节点add_element(node*) 覆盖节点的地址(因此存在内存泄漏),如下所示:head

  node* add_element(node* current)
  {   
    node* temp;         
    temp = new node;     <---" You allocated memory"
    temp->next = NULL;   <---" Set next NULL"
    cout<< "enter element" << endl;
    cin>> temp->x;       <---" Assign a value in new node"    

    // Replace below two line with suggested   
    current = temp;      <---"MISTAKE: Overwrite first node"    
                            "temp next is NULL so losing address of other nodes"

    return current;      <--- "return first node"
  }

新节点的下一个(所以第一个节点)是 NULL,因此打印函数只打印第一个节点的值。

建议:

您应该更正如下以将新节点添加为链表中的第一个节点:

temp -> next = current;  // new nodes next if present first node
return temp;             // new code becomes first node

注意current最初应该是NULL。

根据我在add_element()函数中的建议,还将 for 循环代码更改main()如下:

for(int i=0; i < 5; i = i + 1){
    current = add_element(current);
}
head = current;

并检查Codepade的工作代码(而不是用户输入,我使用y = 100变量添加了值)。

编辑追加新节点:

您需要检查新节点是否不是第一个节点(阅读评论)。

  // returns first node address in linked list = head 
  node* add_element(node* head){
    node *temp, *new_nd;

    // Create new node
    new_nd = new node;
    new_nd->next = NULL;
    cout<<"enter element"<<endl;
    cin>>new_nd->x;

    // Is new node is the first node?
    if(!head)  
      return new_nd;

    // move to last 
    temp = head; 
    while(temp->next) temp = temp->next;

    // add new node at last 
    temp->next = new_nd;

    // return old head
    return head;  
  }

也很简单 main() 如下:

int main(){
    node *head = NULL;
    for(int i = 0; i < 5; i = i + 1){
        head = add_element(head);
    }
    print_list(head);
}

检查这个工作代码

于 2013-08-24T15:26:51.600 回答
0
if (current==NULL)
                    { current=add_element(current);
                      head=current;
                    }
                    else
                    { current->next=add_element(current);
                      current=current->next;
                    }

正确的代码。你必须在循环中做一个小的修正。您必须添加一个新节点,然后使其指向当前节点的下一个节点。所以简化的代码是 current->next=add_element(current) 然后将 current 指向新的 current。

于 2013-08-24T15:53:33.817 回答
0

head->next 为 NULL,因为您在 add_element() 中如此设置。要有一个链表,你应该设置 current->next = temp。

当您使用 C++ 时,您可能会考虑使用 std::list 而不是实现自己的链表。

于 2013-08-24T15:26:57.393 回答