0

逆リンクリストを印刷しようとしています。しかし、私は1つの値しか取得していません。どこが間違っているのですか?私はCに不慣れなので、我慢してください。

#include<stdio.h>
#include<stdlib.h>

struct itemlist {
    int value;
    struct itemlist *next;
};

typedef struct itemlist item;

int main(void) {
    itemlist *curr,*head,*tail;

    head=NULL;
    tail=NULL;

    for (int i = 1; i < 10; i++) {
        curr=(itemlist *)malloc(sizeof(itemlist));
        curr->value=i;
        curr->next=tail;
        tail=curr;
        if (!head)
            head=curr;
    }

    curr=head;

    while (curr) {
        printf("Curr value is:%d\n",curr->value);
        curr=curr->next;
    }

    return 0;
}
4

8 に答える 8

1

頭からではなく、尾からリストの印刷を開始する必要があるようです。

変化する

curr=head;

curr = tail;
于 2012-04-27T19:58:21.380 に答える
1

このコードは 1 から 9 を出力します

#include<stdio.h>
#include<stdlib.h>

struct itemlist
{
        int value;
        struct itemlist *next;
};

typedef struct itemlist item;

int main(void)
{
        itemlist *curr,*head,*prev;

        head=NULL;
        curr=NULL;
        prev=NULL;

        for(int i=1;i<10;i++)
        {
                curr = new itemlist;
                curr->value = i;
                curr->next = NULL;

                if (head == NULL)
                   head = curr;
                if(prev != NULL)
                   prev->next = curr;

                prev = curr;
        }

        curr=head;

        while(curr)
        {
                printf("Curr value is:%d\n",curr->value);
                curr=curr->next;
        }
        return 0;
}
于 2012-04-27T20:12:07.093 に答える
1

curr=headに変更curr=tail

以下は、双方向リンク リストを示す簡単な例であり、リンク リストを理解する上で役立つはずです。

#include<stdio.h>
#include<stdlib.h>

typedef struct
{
        int value;
        struct itemlist *next;
        struct itemlist *prev;
}itemlist;

void forward(itemlist *head)
{
    itemlist *curr = head;
    while(curr)
    {
        printf("Curr value is: %d\n", curr->value);
        curr = curr->next;
    }
}

void backward(itemlist *tail)
{
    itemlist *curr = tail;
    while(curr)
    {
        printf("Curr value is: %d\n", curr->value);
        curr = curr->prev;
    }
}

int main(void)
{
        itemlist *curr,*head,*tail;

        head=NULL;
        tail=NULL;

        for(int i=1;i<10;i++)
        {
                curr=(itemlist *)malloc(sizeof(itemlist));
                curr->value=i;
                curr->next = NULL;
                if(tail)
                {
                    curr->prev = tail;
                    tail->next = curr;
                }
                tail=curr;
                if(!head)
                    head=curr;
        }

        printf("Forwards\n");
        forward(head);
        printf("Backwards\n");
        backward(tail);

        return 0;
}
于 2012-04-27T19:58:56.477 に答える
0

問題は、最初の繰り返しで、現在のアイテムの次の要素を割り当てるときに次のようになることです。

curr->next=tail;

tail の値が NULL であるため、リストの先頭は残りの部分に到達できません

于 2012-04-27T19:57:38.383 に答える
0

ループを終了すると、head(最初の要素が追加されたときに一度だけ更新された) は最後の要素を指します。

于 2012-04-27T19:55:28.927 に答える
0

あなたは混同されてheadいます:tail

最初のノード (ノード 0):

Value = 1
next = tail = NULL;
tail = Node 0
head = Node 0 

2 番目のノード (ノード 1):

Value = 2
next = tail = Node 0 
tail = Node 1 
head = Node 0 

今、あなたは持っています

Node 1-> Node 0->NULLhead=Node 0tail=Node 1

したがって、印刷するときはノード 0 から開始します (「頭」ですが、実際には尾です)。最初のノードを印刷してから終了します。

正しい名前になるように頭と尾を切り替えるか、次のコマンドで印刷を開始する必要がありますtail

編集:あなたはそれらを順番に欲しいと言っているので、これを行うことができます:

int main(void)
{
   itemlist *curr,*head,*tail;

   head=NULL;
   tail=NULL;

   for(int i=1;i<10;i++)
   {
       curr=(itemlist *)malloc(sizeof(itemlist));
       curr->value=i;
       curr->next = NULL;

       //if there is something in the list add the current node after it              
       if(tail) 
          tail->next = curr;

       //Update the tails so it's pointing to the current last node         
       tail = curr;

       //Set the head ONCE
       //this will happened the first time when if(tail) fails
       if(!head)
         head=curr;
  }

  //start at the head
  curr=head;

  while(curr)
  {
       printf("Curr value is:%d\n",curr->value);
       curr=curr->next;
  }
  return 0;
}
于 2012-04-27T19:59:34.010 に答える
0

少なくとも私が理解しているように、あなたの計画はリンクされたリストを逆の順序で作成し、その内容を印刷することです。もしそうなら、おそらく次のようなものが欲しいでしょう:

#include <stdlib.h>
#include <stdio.h>

struct itemlist {
    int value;
    struct itemlist *next;
};

int main() { 

    struct itemlist *head = NULL;
    struct itemlist *pos;
    int i;

    for (i=0; i<10; i++) {
        struct itemlist *node = malloc(sizeof(*node));
        node->value = i;
        node->next = head;
        head = node;
    }

    for (pos=head; NULL != pos; pos = pos->next)
        printf("%d\n", pos->value);
    return 0;
}

「テール」へのポインターは必要ないことに注意してください。基本的な考え方は非常に単純です。head空のリスト (つまり、null ポインター) から始めます。nextポインターをリストの現在の先頭に設定し、リストの先頭を新しいノードを指すように設定して、リストの先頭に各新しいノードを挿入します。

于 2012-04-27T20:06:38.250 に答える