2012-04-27 24 views
0

逆リンクリストを印刷しようとしています。しかし、私はただ一つの価値しか得ていません。どこが間違っていますか?あなたが最後の要素にループをあなたのhead(一度だけ更新されたとの最初の要素が追加されたときに)ポイントを終了すると、私はC.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; 
} 
+0

これは、C++、Cではないです。これが当てはまるので、新しいmallocを使うのはどうですか? –

+2

@ RichardJ.RossIII:コードに 'typedef'があります。 – dirkgently

+1

@dirkgently本当ですが、彼はそれを使用しません。 –

答えて

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; 
} 
0

に新しいですと私と一緒にご負担願います。

0

問題があり、その最初の反復では、あなたは現在の項目の次の要素を割り当てるとき:

curr->next=tail; 

尾の値がNULLであるので、あなたのリストの先頭には到達することはできません残りの部分

1

頭からではなく、尾からリストを印刷し始めるようです。

curr = tail; 
1

変更

curr=head; 

変更curr=headcurr=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; 
} 
+0

curr = headをcurr = tailに変更しても、9から1までのすべての値が得られますが、1から9までが必要です。 – Teja

+0

@Vutukuri逆順ではなく値を順番に欲しいですか?あなたがやっていることは、リストの先頭に追加することです。他の方向にリストを取得するには、add to backを実行する必要があります。 – twain249

+0

ええ、私はそれらを昇順にしたい。 – Teja

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; 
} 
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で始まります。リストの先頭に新しいノードを挿入し、リストの現在の先頭にポインタnextを設定してから、新しいノードを指すようにリストの先頭を設定します。

1

あなたはまったく尾を必要とするが、唯一の再帰関数を必要としません。この関数は、printfの前に単独で次の点を指しています。あなたは `構造体itemlist`としてITEMLISTを参照しないよう

void print_reverse(Itemlist *it){ 
    if(it !=NULL){ 
     print_reverse(it->next); 
     printf("Current value is:%d\n",it->value); 
    } 
}