2017-11-04 4 views
0

リンクリストプログラムの初めに簡単な挿入を作成できましたが、今はリンクリストの最後に挿入するのに苦労しています。リンクリストプログラムの最後に簡単な挿入をしようとしています。小さな問題が必要なヘルプ

プログラムはユーザーからの値を取ることができるようですが、出力リストは正しく表示されていません。私を助けてくれませんか?

可能であれば私は初心者であり、完全に異なる方法を理解することはできませんので、私のプログラムの行に沿ってください。

論理i- リストが空の場合は、最初に値を挿入します。リストが空でない場合は、次の値がNULLになるまでリストに沿って移動し、NULLの代わりに新しい値を入力します。

#include<iostream> 
using namespace std; 
struct node 
{ 
     int data; 
     node *next; 
}; 
node *start=NULL; 
void insertend(int x) 
{ 
    node* temp=new node; 
    if(start==NULL) 
     temp->data=x; 
    else 
    { 
      while(temp!=NULL) 
      { 
        temp=temp->next; 
      } 
      temp->next=x; 
    } 
} 
void display() 
{ 
     node* disp=new node; 
     while(disp!=NULL) 
     { 
       cout<<disp->data<<endl; 
     disp=disp->next; 
     } 
} 
int main() 
{ 
     int x; 
     char ch; 
     do 
     { 
       cout<<"Enter data";cin>>x; 
       cout<<endl; 
       insertend(x); 
       cout<<"Do you want to continue?(y/n)";cin>>ch; 
     cout<<endl; 
     }while(ch=='y'); 
cout<<"Your list:"<<endl; 
display(); 

} 
+1

あなたは、 'start'をリストの最初の要素に設定する' insertend() 'の正確な場所を指すことができます。また、あなたのプログラムで、リストが空でなければ 'data'を初期化する正確な場所を指すことができます。これらの質問に答えることができれば、コードを修正するために知る必要があることをすべて知っておく必要があります。あなたがこれを理解しようとしている間、コンピュータプログラミングのルール#1を覚えておいてください。コンピュータは、あなたが何をしたいのではなく、あなたがすることを常に正確に行います。 「使用したロジック」は、コードが実際に行うものと一致しません。 –

+0

コンピュータプログラミングのルール#2:コンパイラからの警告メッセージを無視しないでください。コンパイラがメッセージを表示する方法を知っているかどうかを確認したいからではなく、その理由があるため、コンパイラは警告メッセージを発行します。コンパイラがまだプログラムをコンパイルしてしまったからといって、プログラムが正しいとは限りません。あなたのコンパイラからの警告メッセージには理由があります。 –

+0

スタックオーバーフローは学生自宅の仕事を解決するサイトではありません。 – Oliv

答えて

0

リストのエントリポイントは、変数startです。しかし、あなたは決してそれを設定しません。たとえば、ユーザーが入力する最初の項目を取ります。 insertend()に電話すると、start == NULLがチェックされますが、それでもstartは設定されません。 start = tempまたは類似のものを設定する必要があります。 elseセクションに同じ問題があります。tempで始まるノードをループしますが、最初はstartで始める必要があります。また関数display()では、ノードへのポインタを作成してループを開始しますが、データはありません。startをループの開始点として使用する必要があります。

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

node *first = NULL, *last = NULL; 

void insert(int x){ 
    if(first == NULL){ 
     first = new node; 
     first->data = x; 
     first->next = NULL; 
    }else if(last == NULL){ 
     last = new node; 
     last->data = x; 
     first->next = last; 
     last->next = NULL; 
    }else{ 
     node *n = new node; 
     n->data = x; 
     n->next = NULL; 
     last->next = n; 
     last = n; 
    } 
} 

私は、リストの最初と最後のノードを追跡しています。 Insert機能は、リストにif(first == NULL)の部分があるかどうかをチェックします。存在しない場合は、最初のノードが作成されます。似たようなことがelseで起こります。最後に、elseブロックでデータxを持つ新しいノードを作成します。次に変数lastに格納されたノードを新しいノードに向け、最後にそのノードに設定します。ここ は、表示機能である:

void display() 
{ 
    node *disp =first; 

    while(disp->next != NULL){ 
     cout << disp->data << " "; 
     disp = disp->next; 
    } 

    cout << disp->data; 
} 

私はまた、あなたのプログラムは、あなたが新しいノードを作成しているため、実行が終了した後、あなたはクリーンアップを行うことをお勧めします。

void cleanup(node* n) 
{ 
    if(n->next == NULL)return delete n; 
    cleanup(n->next); 
    delete n; 
} 

は、その後、メイン・コールcleanup(first)

希望の最後に、これは意味が素敵な一日を:)になります!

関連する問題