1

私は最初のリンクリストを作成しようとしていますが、基本的な紹介を読んだ後、次のことを行いました。まず、リンクリストノードを次のように宣言します。

struct errorNode {
    uint8 error;
    struct errorNode* next;
};

次に、最初のノードをグローバルに次のように定義します。

struct errorNode errorList = {0, NULL};

これは、現在のプロジェクトを構成する各ライブラリがエラーを共通リストに挿入できるようにするために行われました。これを行うための関数は次のとおりです。

void errorListWrite(uint8 error) {
    struct errorNode* newNode = malloc(sizeof(struct errorNode));

    newNode->error = error;

    newNode->next = &errorList;
    errorList = *newNode;
}

これはエラーなしでコンパイルされますが、期待どおりに機能しません。問題はリスト書き込み関数の最後の2つのステートメントにあると思いますが、よくわかりません。私が間違っていることについてのヒントをいただければ幸いです。

4

4 に答える 4

2

問題は、循環リストを作成することです。

newNode->next = &errorList;

したがってnewNode、グローバルノードにリンクします。

errorList = *newNode;

これはと同等errorList.error = newNode->error; errorList.next = newNode->next;です。これerrorListで、グローバルノードにリンクします。おっと。

代わりにできることは、リストのグローバルノードの後に​​新しいノードを挿入することです。

newNode->next = errorList.next;
errorList.next = newNode;

これは、グローバルノードが必要であることを前提としています。そうでない場合は、から始めてstruct errorNode *errorList = 0;、次のような新しいノードを追加できます。

newNode->next = errorList;
errorList = newNode;

リストを使用するようになると、リストトラバーサルは少し異なって見える場合があります。グローバルポインタからノードへのポインタは、最初のノードへのポインタから始めます。これを使用する前に、nullをチェックする必要があります。グローバルノードでは、確実に存在するが、次のポインタがnullになる可能性があるノードから開始します。

于 2012-10-11T21:36:54.070 に答える
1

問題は最後の行にあります。古いエラーノードのデータを上書きしているだけです。

おそらく必要なのは、最初のノード自体ではなく、ヘッド(最初のノードへのポインター)にグローバルにアクセスできるようにすることです。このように、リストに偽のエントリは必要ありません。

(コードはスレッドセーフではないことに注意してください。)

コード:

errorNode* pGlobalErrorList = NULL;

// in errorListWrite
newNode->next = pGlobalErrorList;
pGlobalErrorList = newNode;
于 2012-10-11T21:34:40.077 に答える
1

ヘッド(errorList)はポインターである必要があり、値が0のノードの初期エントリが必要でない限り、NULLに初期化する必要があります。

struct errorNode* errorList = NULL;

次に、関数はerrorListを適切に再割り当てする必要があります。

void errorListWrite(uint8 error) { 
    struct errorNode* newNode = malloc(sizeof(struct errorNode)); 

    newNode->error = error; 
    newNode->next = errorList;

    errorList = newNode; 
} 

これはすべて、新しいノードがリストの新しい先頭であり、新しい末尾ではないことを前提としています。

于 2012-10-11T21:44:08.647 に答える
0

errorListは、(最初​​のノードではなく)最初のノードへのポインターである必要があります

また、これが変更される最後のノードが何であるかを知る必要があります。リストの先頭は変更されません。リストの最初から移動する場合にのみ使用されます。

于 2012-10-11T21:34:05.793 に答える