2010-12-04 2 views
1

私はこのプログラムがこのプログラムの新しいノードまたは "Player"構造体に値を挿入するのを、 。C++で、すべてを逆順で格納するのではなく、時系列で値を格納する単一リンクリストを作成しようとしています

これは機能main()内で起こります。私の教師は、本質的に「すべて」がそこにあり、私にそれを変えることができるので、できるだけ小さなコードを挿入するように私に要求します。ここで

は「のaddNew」内の古い値を入れながら、頭の中でそれぞれの新しい値を格納し、元のコードは次のとおりです。

Player * head = NULL; 

for(int i=0; i<100; i++) 
{ 
    Player * addNew = (Player *)malloc(sizeof(Player)); 
    if(head == NULL) 
    { 
     head->len = i; 

     Player * addNew = (Player *)malloc(sizeof(Player)); 

     head->next = NULL; 
    } 

    addNew->next = addNew; 
    addNew->len = i; 
} 

Player * p = head; 
//do this until 'p' has no address. 
for(int i=0; p!=0; i++) 
{ 
    printf("%s ", p->str); 
    p = p->next; 
} 

誰もがこれを解決する方法上の任意のアイデアを持っていますか? 重要:私の先生は、新しい変数やテールを追加しないようにしたいと思います。お願いしないでください。

更新:ここにいくつかの古いコードです:

//The head is the last one to hold a value. Therefore it gets pushed to the right. 
    Player * head = NULL; 

    Original Algorithm 
    for(int i=0; i<5; i++) 
    { 
     Player * addNew = (Player *)malloc(sizeof(Player)); 
     printf("Insert a string: "); 
     scanf("%s", addNew->str); 

     addNew->next = head; //assign head's current address to addNew->next 
     head = addNew; //assign all of addNew to head  
    } 

アップデート:ここでは動作しません新しい実装です。私は本当に他のforループがどこに行くべきか正確には分かりません。

addNew->ID = 1; 
     addNew->ID += i; 
     if(head == NULL) 
     { 
      head = addNew; 
      addNew->next = head; //assign head's current address to addNew->next 
      //head->next = addNew; 
     } 

     //head->next = addNew; 
     addNew->next = head; 
     //head = addNew; //assign all of addNew to head  
     printf("%d\n", addNew->ID); 
+1

さて、テールを使用することはできません。他にどんな制限がありますか?そして、どのような要件?明白な解決策は、パフォーマンスの面で悲惨な、すべてのインサートのリストを歩くことです。 – EboMike

+1

あなたの先生はあなたに問題を解決してもらいたいと思っています。ニース。また、それはC++ではなく、それらのmallocは恐ろしい漏れを求めています。あなたの先生があなたにCを学びたいと思ったように私に見えます。 – Puppy

答えて

0

リストの末尾にポインタを保存し、各ノードに次のアイテムを保存する代わりに、前のノードを保存します。

+0

まあ、ええ、あなたは答えを出すことができます:Pあなたは頭と尾を保管する必要があります。そうしなければ、リスト。 – EboMike

+0

真。 "(頭の代わりに)"私はそれを変更させるためにすべてではっきりしていないと思います。 – AlexJF

+0

残念ながら、私の先生は、「尾」のようなものは使用できないと指定しました。 –

0

今は、すべてをリストの先頭に追加しています。ただし、代わりにテールに追加する必要があります。

すでに頭部へのポインタがあります。それに加えて、テールへのポインタも必要です。あなたはそれを取得(および更新)する方法を考えることができますか?

+0

私は尾ができないと言っています。私は最後に追加するaddNewを使用しようとしています。 –

+0

さて、あなたはこの答えを投稿してからずっとそれを言っていました。まず、あなたの質問にあなたの要件を明確にしておくべきでした。いずれにせよ、ハンスは素晴らしい解決策を持っています。 – EboMike

0

これはオプションではないかもしれませんが、とにかくお勧めしたいと思いました。物を別の順序で格納するのではなく、物事をそのまま保存しておき、値を出力する方法を変更するだけです。これは実装が非常に簡単であるばかりでなく、リストの挿入時にも高速になります。

+0

簡単に私はそれを行うことができました(もし私が知っていれば)、私の先生は私に値をどのように保存するかを変更するように要求します。 –

1

シンプルなトリック:リスト*は常にリストの最後の要素を指します。最後の要素の次のポインタをリストの先頭に設定します。これで、リストの先頭と末尾の両方を常に1つのポインタで簡単に見つけることができます。開始はlist-> nextです。それをテールと呼ぶのではなく、単に「リスト」と呼んでください。

+0

私は構造体への別のポインタを持つことはできないと思います。 –

+0

追加ポインタはありません。アイデアは、 "head"の名前を "tail"に変更し、tailポインタのように扱います。つまり、ポインタを最後の要素に格納します。しかし、最後の要素の次のポインタがNULLを指し示す代わりに、それはFIRST要素(すなわち、「頭」)を指すことになる。そうすることで、最後に追加しますが、頭から反復することができます。明らかに、最後の要素に再び到達するときに停止する必要があります。ハンス、それはいい考えですよね? – EboMike

+0

あなたはそれを持っている@エボ –

関連する問題