2011-09-11 4 views
0

Cでリンクリストを作成したばかりです。returnLastNodeのコードでランタイムエラーが発生しました。どのように私は知っていますか?コメントアウトしたときにうまく動作します。リンクリストの問題

質問#1私は間違っていますか?私returnLastNode関数の

コードを使用struct秒の

struct Node* returnLastNode(struct LinkedList *ll) { 
    struct Node *n = ll->first; 
    struct Node *result; 
    while(1) { 
     if(n->next == NULL) { 
      result = n; 
      break; 
     } else { 
      n = n->next; 
     } 
    } 
    return result; 
} 

定義。

struct Node { 
    int val; 
    struct Node *next; 
}; 

struct LinkedList { 
    struct Node *first; 
}; 

LinkedList.hここでは、必要に応じて/関心があります。

https://github.com/MoonStruckHorrors/LinkedListC/blob/master/LinkedList.h

質問#初心者は、ランタイムエラーをデバッグする必要がありますどのように2

また、他の提案もありがとうございます。 :)

答えて

2

逆参照する前にnNULLであるかどうかを決して確認しないでください。これは、空のリストで使用するとコードがクラッシュすることを意味します。また、変数resultを取り除き、if (n->next == NULL)部分のreturn n;を取り除くこともできます。だからあなたのコードの改良版は、次のようになります。

struct Node* returnLastNode(struct LinkedList *ll) { 
    struct Node *n = ll->first; 

    // checking if n is NULL here 
    while(n) { 
     if(n->next == NULL) 
      return n; 

     n = n->next; 
    } 

    return NULL; // n was NULL immediately so there is no end node 
} 

ランタイムエラーをデバッグするためとして、あなたはデータがシンプルなもののためであるかどうか確認するためにprintfを使用することができ、そしてより複雑なもののためにあなたがgdbのようなデバッガを使用することができます(または、IDE(Visual Studioなど)に統合デバッガが付属していることがあります)。ずっといいだろう

 returnLastNode(SomeLinkedList.first); 

Node* returnLastNode(Node *p) { 
    while (p && p->next) p=p->next; 
    return p; 
} 

...デバッグ機能を使用すると、時間とともに獲得何か、との唯一の方法である:

+1

ヒントをお願いします。私は、リンクリストが空でない場合にのみ 'returnLastNode'を使用する私の挿入関数で空のリストをチェックしていました。しかし、空のリストをチェックしても、最初のノードを初期化するのを忘れてしまったので、NULLで動作していました。 – MoonStruckHorrors

2
struct Node* returnLastNode(struct LinkedList *ll) { 
    struct Node *n = ll->first; 
    struct Node *result = n; 
    while(n != NULL) 
    { 
     result = n; 
     n = n -> next; 
    } 
    return result; 
} 

いいでしょう。デバッグに関しては、それは練習です。

1
typedef struct Node_t { 
    int val; 
    struct Node *next; 
}Node; 

typedef struct LinkedList_t { 
    struct Node *first; 
}LinkedList; 

ことによってそれを呼び出しをデバッグするためにかなりクールですそれはあなたがより良くデバッグするのを知っている人の隣に座って、彼から学びます。おそらくより良い方法は、おそらくより遅く、ただ狂ったようにデバッグし、自分で良くなるようにすることです。 とにかくgoodluck :)

関連する問題