2012-04-06 7 views
3

私の割り当てでは、引数として "LNode"構造体と整数引数へのポインタをとる関数を記述する必要があります。次に、その整数をリンクリストに追加するだけでなく、リストが適切な昇順になるように配置する必要があります。私はこれでいくつかのさまざまな試みを試みました。これは投稿時のコードです。私はそれを実行し、5その後、3を言う挿入しようとするとCでのリンクリストの追加とソート

LNode* AddItem(LNode *headPtr, int newItem) 
{ 
    auto LNode *ptr = headPtr; 

    ptr = malloc(sizeof(LNode)); 

    if (headPtr == NULL) 
    { 
     ptr->value = newItem; 
     ptr->next = headPtr; 
     return ptr; 
    } 
    else 
    { 

     while (headPtr->value > newItem || ptr->next != NULL) 
     { 
      printf("While\n"); // This is simply to let me know how many times the loop runs 
      headPtr = headPtr->next; 
     } 
     ptr->value = newItem; 
     ptr->next = headPtr; 
     return ptr; 
    } 

} // end of "AddItem" 

、5が挿入されたが、その後whileループは一度実行され、私はセグメンテーションフォールトを取得します。

また、このプロジェクトのスケルトンコードの一部として、引数を変更することはできません。助けることができる誰にも感謝します。

それは、これが

typedef struct LNode 
{ 
    int     value; 
    struct LNode  *next; 

} LNode; 
+0

まだgdbでの経験はありますか?プログラムが実行されている間、すべての変数が何をしているのかを見ることは有益です。 – gcbenison

+0

はあなたのヘッドノードとptr新しいノードのheadPtrですか? –

答えて

2

あなたのwhileループ条件が間違っているような構造が見えるものであることができます場合。 ptr->nextは決して設定しませんが、ptr->next!=NULLをチェックすると、headPtr=headPtr->nextはループ内でワイルドになります。その値を設定したら、ptr->next=NULLを設定する必要があります。

また、アウトこれらの行を取ると上部にそれを置くことができます。

LNode* AddItem(LNode *headPtr, int newItem) 
{ 
    auto LNode *ptr, *temp, *orghead; 
    orghead = headPtr; 
    int fl=0; 
    ptr = malloc(sizeof(LNode)); 
    ptr->value = newItem; 
    ptr->next = NULL; 
    temp = ptr; 

    if (headPtr == NULL) 
     return ptr; 
    else 
     { 

     while(headPtr != NULL && headPtr->value < newItem) 
      { 
      printf("While\n"); 
      fl =1; 
      temp = headPtr; 
      headPtr = headPtr->next; 
      } 
     temp->next = ptr; 
     ptr->next = headPtr; 
     if(fl) return orghead; 
     else return temp; 
     } 

} // end of "AddItem" 
+0

それでもやっていること。私はそれを理解しようとする記憶場所の写真を描こうとしています。表示機能はリンクされたリストを単に通過するので、私はそれがそれと何かを疑う。たとえそれがあったとしても、私はその機能をどうにか変更できなかった。 – user1202963

0

あなたのwhileループがあなたのリンクリストの最後まで行くと、あなたの最後:

ptr->value = newItem; 
    ptr->next = headPtr; 

はこれを試してみてください要素はnullです。したがって、あなたのwhile状態では、ヌルノード(headPtr)を逆参照しています。このようにしてセグメンテーション違反が発生します。私はあなたのノードがこれを好きnullであるかどうかをチェックする必要があると思う:

while (headPtr != NULL && (headPtr->value > newItem || ptr->next != NULL)) 
+0

ダニエルフィッシャーさんの方が良い答えがあります。 :) – ervinbosenbacher

3

あなたのループでは

while (headPtr->value > newItem || ptr->next != NULL) 
    { 
    printf("While\n"); // This is simply to let me know how many times the loop runs 
    headPtr = headPtr->next; 

あなたは初期化されていないptr->nextNULL(ない)であるかどうかを確認してください。あなたが||という条件を持っているので、これは賢明ではなく、ptrの部分のビットパターンがNULLポインタのビットパターンではない場合は混乱を招く可能性があります。ループ条件は常にtrueであり、リスト。

とにかく&&が必要です。両方の条件が成り立つ必要があります。何かがNULLではなく、値の間の関係が成り立つ必要があります。

リストを昇順にする必要があるため、リスト内の値がより小さい値を挿入する値である間にリストをトラバースする必要があります。

ただし、新しい値を挿入したノードのnextポインターを変更する必要があるため、ポインティング先の値が新しい値以上になる前に停止する必要があります。

if (headPtr->value >= newItem) { 
    ptr->value = newItem; 
    ptr->next = headPtr; 
    return ptr; 
} 
while(headPtr->next != NULL && headPtr->next->value < newItem) { 
    headPtr = headPtr->next; 
} 
// Now headPtr is the node behind which the new item is to be inserted 
ptr->value = newItem; 
ptr->next = headPtr->next; 
headPtr->next = ptr; 
return ?? 

あなたはどのようなポインタを返しますか?新しいItemがリストの最初のものである場合は、最初のノードへのポインタを返します。新しいアイテムが後で挿入された場合でもそれを実行したい場合は、オリジナルのheadPtrを保持して返す必要があります。

0

からその真のすべてのあなたは、この時点でしばらく

内部headPtrにnull状態を確認していない

while (headPtr->value > newItem || ptr->next != NULL) 
     { 
      printf("While\n"); // This is simply to let me know how many times the loop runs 
      headPtr = headPtr->next; 
     } 

上記

headPtr = headPtr->next; 

headPtr->次は作るどのnullにすることができますあなたのプログラムはクラッシュする

ビットmore

LNode* AddItem(LNode *headPtr, int newItem) 
{ 

auto LNode *ptr = headPtr; ? 

    ptr = malloc(sizeof(LNode)); 

    if (headPtr == NULL) 
    { 
     ptr->value = newItem; 
     ptr->next = headPtr; 
     return ptr; 
    } 

がheadPtrがNULLでない考えるptrは今、いくつかのmallocを指している、ヒープ ptr->次の月またはケース

while (headPtr->value > newItem || ptr->next != NULL) 

insuch NULLではないかもしれないがun-予測可能

になりますあなたのロジックをもう少し見る必要があるかもしれません。

LNode* add_time(LNode *headptr , data){ 

    LNode *ptr = headptr, *temp;   

    temp = malloc(sizeof(LNode)); 

    if(!temp) 
     return ptr; 

    temp->next = NULL; 
    temp->value= data; 

    if(ptr == NULL){ 
     /** There is no list**/ 
     ptr = temp; 
     return ptr; 
    } 

    /* go to last node*/ 
    while(ptr->next) 
     ptr = ptr->next; 

    ptr->next = temp; 

    return ptr; 

} 
関連する問題