2012-03-13 7 views
2

次のCコードは、私自身のプリミティブリンクリストを書く方法です。これはlnodeという構造体を使用します。私はこれが最高の/最も効率的な方法ではないことを知っているが、私のアイデアはこれです:ベースノードを作成し、リスト内の最後のノードを指し示す "iterator"ポインタ(ここではq)を使い、 。C LinkedListの例がコンパイルされない

次のコードはコンパイルされません。私は原因を見つけることができませんが、この行が嫌いです

struct lnode *q= malloc(sizeof(struct lnode)); 

このアイデアを作るためのアドバイスはありますか?前もって感謝します。

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

struct lnode{ 
    int value; 
    struct lnode *nextnode; 

}; 

int main(){ 

    struct lnode *startnode = malloc(sizeof(struct lnode)); 
    startnode->value=0; 
    startnode->nextnode=NULL; 

    struct lnode *q= malloc(sizeof(struct lnode)); 

    int i = 0; 

    for(i=0;i<10;i++){ 

     struct lnode *p = malloc(sizeof(struct lnode)); 
     p= q->nextnode; 
     p->value=i; 
     p->nextnode=NULL; 
     q=p; 


    } 


return 0; 


} 

私は初心者だと指摘したいと思います。私はWatcomコンパイラを使用しています(なぜですか?私のコンピュータは古く、これらすべての練習用ポログラムに必要です)。ログ出力は

structure1.c(17)です。 E1063:欠落しているオペランドstructure1.c(17):

警告! W111:意味のない式の使用structure1.c(17):

エラー! E1009:期待する ';' 'struct' structure1.c(17)が見つかりました:

エラー! E1011:シンボル 'lnode'は宣言されていません。structure1.c(17):

エラー! E1011:シンボル 'q'は宣言されていません。structure1.c(17):

エラー! E1014:左オペランドは「左辺値」structure1.c(19)でなければなりません:

私は与えられたアドバイスに従って、新しいコードはこれですコードを変更:

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

struct lnode{ 
    int value; 
    struct lnode *nextnode; 

}; 

int main(){ 

    struct lnode *startnode = (struct lnode *)malloc(sizeof(struct lnode)); 
    struct lnode *q; 
    startnode->value=0; 
    startnode->nextnode=NULL; 

    q = malloc(sizeof(struct lnode)); 


    doLoop(q); 

return 0; 


} 

void doLoop(struct lnode *q){ 

    int i = 0; 

    for(i=0;i<10;i++){ 

     struct lnode *p = (struct lnode *)malloc(sizeof(struct lnode)); 
     q->nextnode=p; 
     p->value=i; 
     p->nextnode=NULL; 
     printf("%i, %i\n",p->value,q->value); 
     q=p; 

    } 
} 

私は「値を印刷リスト内の各ノードの値を以前の値とともに更新します。それは奇妙な出力を与える最初の反復を除いて動作します。

+1

あなたは、コンパイラから取得するエラーメッセージは何ですか:

p = q->next_node; /* here you set p to an undefined area. * q->next_node is not malloc'd */ p->value = i; /* here you cause undefined/erronous behaviour * Most probably a SIGSEGV */ 

ので、おそらく何かのように、それを合計するには? – Jesper

+1

それはGCCで私のためにうまくコンパイルします –

+0

malloc()の戻り値をキャストしてイエスの愛のためにしないでください! –

答えて

4

コンパイラ(たとえばMicrosoftコンパイラ)はC89標準のみをサポートしていると思われますが、これはコードと宣言の混在を許しません。スコープのトップへqの宣言を移動します: - http://ideone.com/j6fGe -

int main(){ 

    struct lnode *startnode = (struct lnode *)malloc(sizeof(struct lnode)); 
    struct lnode *q 
    startnode->value=0; 
    startnode->nextnode=NULL; 

    q = malloc(sizeof(struct lnode)); 
1

コードはコンパイルが、ロジックが間違っている:

struct lnode *p = (struct lnode *)malloc(sizeof(struct lnode)); 
p= q->nextnode; 

あなたがメモリリークを持っているという事実に加えて、私はこの確信していますあなたが意図したものではありません。

q->nextnodeは、有効なノードを指していません。ランダムなメモリです。次に、p->value=i;で上書きしようとします。

+0

これを修正することをどのようにお勧めしますか?私はこれをK&Rのtnode構造体の例の上に少し置くようにしています。 –

+1

@JJG私はあなたが達成しようとしていることを知らないので、私は知らない。私が言っていることは、あなたがコンパイラエラーを経験した後、あなたはこれにぶつかるでしょう。あなたがこれに到達すると、別の質問を投稿する方が良い。 –

1

エラーメッセージは、コードと宣言の混在によるものです。

さらに、 forループでpとqを切り替えます。

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

struct lnode{ 
    int value; 
    struct lnode *nextnode; 
}; 

int main(void) 
{ 

    struct lnode *startnode; 
    struct lnode *p; 
    size_t z; 
    int i; 

    z = sizeof(struct lnode); 

    if ((startnode = malloc(z)) == NULL) { 
     fprintf(stderr, "Unable to malloc %d bytes.\n", z); 
     return 1; 
    } 

    /* Fill list */ 
    p = startnode; 
    for (i = 0; i < 10; i++) { 
     if ((p->nextnode = malloc(z)) == NULL) { 
      fprintf(stderr, "Unable to malloc %d bytes.\n", z); 
      return 1; 
     } 

     p->value = i; 
     p = p->nextnode; 
     p->nextnode = NULL; 
    } 

    /* Print values */  
    p = startnode; 
    while (p->nextnode != NULL) { 
     printf("value: %2d\n", p->value); 
     p = p->nextnode; 
    } 

    /* Free */ 
    p = startnode; 
    while (p != NULL) { 
     p = p->nextnode; 
     free(startnode); 
     startnode = p; 
    } 

    return 0; 
} 
関連する問題