2016-04-17 6 views
0

リンクリストを使用して20までカウントしようとしています。私は2つの機能を持つコードを書きました。リンクされたリストにノードを追加する関数と、全体を印刷する関数。しかし、それは無限ループであり、私はなぜそれがわからないのですか?20にカウントされたリンクリスト

私は何回もデバッグを試みましたが、その機能を追加しても、おそらくプリントリストは決してヌルにならず、それでは終わりなく印刷されていると思いますか?私は、追加機能は、ノードを正しく実装していないと思うが、私はどのように修正するか分からない。

struct node 
{ 
int number; 
struct node *next; 
}; 
typedef struct node NODE; 

これがメインで、機能が追加callesとI(0-20)のリストと一緒にそれを渡します。

は、これが私の構造体です。

int main(){ 

int i, size=20; 
struct node* mylist = malloc(sizeof(struct node)); 
mylist->number = NULL; 
mylist->next = NULL; 


for(i=0;i<size;i++){ 
    mylist = add(mylist,i); 
    } 
    printList(mylist); 


return 0; 
} 

add関数は、渡されたデータとしてtempを取り込み、最後にリンクされたリストを反復処理します。私は、whileループで(& & iter->ネクスト>数<数)を奪うとき、それはそれでしか出力しない、それは無限ループを持っている

struct node* add(struct node *first, int number){ 
    struct node* temp; 
    struct node* iter; 

    temp= malloc(sizeof(struct node)); 
    temp->number=number; 
    temp->next=NULL; 

    if(first==NULL) 
    return temp; 

    iter=first; 
    while(iter->next!=NULL && iter->next->number < number){ 
    iter=iter->next;} 

    temp->next=iter->next; 
    iter->next=temp; 

    return first; 
} 

これは私がprintlist機能です信じて正しいですが、私は問題がノードの追加機能にあると思う。

struct node* printList(struct node *mylist){ 

struct node *helpptr; 
helpptr = mylist; 

while (helpptr != NULL){ 
printf("%d", helpptr->number); 
helpptr = helpptr->next; 
         } 
return 0; 
} 

はあなたが malloc()経由で割り当てられ、初期化されていないバッファ内の値を使用して 未定義の動作を呼び出し、事前

+1

印刷ループのwhile条件を 'helpptr-> next!= NULL'から' helpptr!= NULL'に変更してください。それ以外の場合、リスト内の最後の項目の番号は印刷されません。関数のパラメータは参照ではなく値によって呼び出されるため、新しいポインタ変数を作成する代わりに 'myList'を使用することができます。 – jboockmann

+0

ありがとう、ありがとう!私は一度だけそれ以上の印刷を得ることを修正します – Kris

+0

あなたのメイン関数のintにNULLを割り当てることはできません。コンパイルの警告が表示されます。これに関する修正については、私の答えを参照してください;-) – jboockmann

答えて

1

にご協力いただきありがとうございます。

mylistmalloc()から返されるものではなく、NULLmain()に初期化する必要があります。

+0

それは無限ループを固定しました、ありがとう!しかし、今は私がそれを実行すると、リンクされたリストの先頭を提供し、0だけを出力すると、次のノードを正しく追加していないようです。 – Kris

+0

@Kris [あなたの新しいコード](http://melpon.org/wandbox/permlink/E6MnLqrtxVhG7ho4)と[私が提案した変更のコード](http://melpon.org/wandbox/permlink/)の両方で再現できませんでした。 1bgdMe3b3Psmox6w)。 – MikeCAT

0

構造体の定義は大丈夫ですが、後で使用しないためtypedefを省略することもできます。

struct node 
{ 
    int number; 
    struct node *next; 
}; 
// typedef struct node NODE; 

あなたはあなたのプログラムの主な部分で2つの間違いを犯しました。まず、@MikeCATで既に述べたように、未定義の動作を避けるために、mallocを使って作成した構造体を変更する必要があります。あなたのadd関数はそれを見回すので、単にmyListをNULLに設定することでこれを行うことができます。項目0-20を追加するには、forループの条件をi<=sizeに適合させる必要があります。

int main(void){ 
    int i, size=20; 
    struct node* mylist = NULL; 
    for(i=0;i=<size;i++){ 
     mylist = add(mylist,i); 
    } 
    printList(mylist); 
    return 0; 
} 

あなたの追加機能は問題ありません。ここで変更する必要はありません。

printList関数も問題ありません。この関数はこれまでの意味のある情報を返さないので、戻り値の型をvoidに変更したいかもしれません。実際には、Cのパラメータが値によって呼び出されるため、新しいポインタ変数helpptrを作成する必要はありません。したがって、myListパラメータを変更しても、main関数の値は変更されません。

void printList(struct node *mylist){ 
    while (mylist != NULL){ 
     printf("%d, ", mylist->number); 
     mylist = mylist->next; 
    } 
} 
+0

こんにちはpytheos、ありがとうございます。あなたが提案した変更を加えたが、私はまだ同じ出力を得ている。ここからスクリーンキャップがあります:http://postimg.org/image/bcnaupm4t/ループ出口ステートメントは、printListコールの前にmainの後にあります。 – Kris

+0

https://gist.github.com/pytheos/ca86ea759dfd01d63fb3393e7625ed9d あなたのバージョンに? – jboockmann

関連する問題