0

次のコードは、最初の要素のみを出力します。関数ではprint_list()、最初の要素を出力した後に停止します。最初の要素の後にhead->nextisと書かれてい0ます。2番目の要素を指すべきではありませんか?

リスト全体を単純に印刷したい。

#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ノードを、渡された現在のノードに割り当てています。作成したばかりのノードを、現在のノードの次のプロパティに割り当てます。そのはずcurrent->next = temp

于 2013-08-24T15:26:31.593 に答える
1

Linked List にはノードが 1 つしかないため、Print 関数は最初の要素を出力します。実際には関数に間違いがあります。以下にマークしたように、ノードのアドレスを新しいノードで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 であるため、print 関数は最初のノードの値のみを出力します。

提案:

リンクされたリストの最初のノードとして新しいノードを追加するには、次のように修正する必要があります。

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た)。

編集新しいノードを追加するには:

新しいノードがnotの最初のノードであるかどうかを確認する必要があります(コメントを読んでください)。

  // 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) であり、現在のポイントを新しい現在のポイントにします。

于 2013-08-24T15:53:33.817 に答える
0

add_element() で設定したため、head->next は NULL です。リンクされたリストを作成するには、current->next = temp を設定する必要があります。

C++ を使用しているため、独自のリンク リストを実装する代わりに std::list の使用を検討することもできます。

于 2013-08-24T15:26:57.393 に答える