0

C の LinkedList に問題があります。リストに含まれるノードの数を数えると、常に 1 になります。

LLカウント:1

これは、リスト コードの追加、カウント、および取得の最後の要素です。

void addLL(LL * head)
{
LL *newNode;
LL *tail = getLastNode(head);

newNode = malloc(sizeof(LL));
if(newNode != DEF_NULL)
{
    newNode->ID=-1;
    newNode->TCB=-1;
    newNode->next = DEF_NULL;

    if(!head) head = newNode;
    else tail->next = newNode;      
}   
}

LL * getLastNode(LL * head)
{
    LL *temp = head;
    while(temp->next != DEF_NULL)
    {
        temp = temp->next;
    }
    return temp;
}

CPU_INT32U countLL(LL * head)
{
    CPU_INT32U elements = 0;
    LL * temp = head;
    while(temp->next != DEF_NULL)
    {
        temp = temp->next;
        elements++;
    }
    return elements;
}

これは次のように呼び出されます。

addLL(list);
temp = countLL(list);       
Debug_LOG("LL count: %i", temp);

どこで LL * リスト; はグローバル変数であり、temp はローカル スコープにあります。私がどこで間違ったのか誰かがわかるといいのですが

ごきげんよう、シャークとゲリット

4

4 に答える 4

0

CPU_INT32U countLL(LL * head){CPU_INT32U elements = 0;LL * temp = head;while(temp->next != DEF_NULL){temp = temp->next;elements++;}return elements;}

この関数では、要素変数を auto として宣言しているため、関数が終了するとすぐにストレージの割り当てが解除されます。これは、メモリが別の変数に自由に割り当てられるようになったため、上書きされる可能性があるため、以前の cvalue が失われる可能性があるためです。

これを回避するには、変数の宣言に static を使用してください..... 静的変数のメモリは、プログラム全体の実行後にのみ割り当てが解除されるため、試してください....

于 2012-04-25T10:54:19.987 に答える
0
void addLL(LL * head)
{
LL *newNode;
LL *tail = getLastNode(head);

ここで問題があります。(グローバル) ヘッドがたまたま NULL の場合、getLastNode() 関数によって逆参照されます。

LL * getLastNode(LL * head)
{
    LL *temp = head;
    while(temp->next != DEF_NULL)

ここでtemp->next != ...temp が逆参照されます。temp が NULL の場合、NULL ポインターの逆参照が発生します。(挿入関数による呼び出しのように。追加のテストを追加できます(または、よりクリーンなポインターへのポインターを使用します):

while(temp && temp->next != DEF_NULL)

更新 (ポインター バージョンへのポインターがよりクリーンであることを示すため)

#include <stdlib.h>
#include <stdio.h>
#define DEF_NULL NULL
#define CPU_INT32U unsigned

typedef struct link {
        struct link *next;
        } LL;

LL *globhead=NULL;
LL **getTailPP(LL **ppHead);
CPU_INT32U countLL(LL * ptr);
void addLL(LL **ppHead);

void addLL(LL **ppHead)
{
ppHead = getTailPP(ppHead);

*ppHead = malloc(sizeof **ppHead);
    if(*ppHead != DEF_NULL)
    {
        // newNode->ID=-1;
        // newNode->TCB=-1;
        (*ppHead)->next = DEF_NULL;
    }
}

LL **getTailPP(LL **ppHead)
{
    for( ; *ppHead; ppHead = &(*ppHead)->next ) {;}
    return ppHead;
}

CPU_INT32U countLL(LL * ptr)
{
    CPU_INT32U elements = 0;
    for(; ptr != DEF_NULL; ptr=ptr->next) { elements++; }
    return elements;
}

int main()
{
unsigned count;

addLL( &globhead);
count = countLL (globhead);
printf("count = %u\n", count);

addLL( &globhead);
count = countLL (globhead);
printf("count = %u\n", count);

return 0;
}
于 2012-04-25T10:54:43.013 に答える
0

Windowsでは、この機能に問題はありません-奇妙な...

ideone も良好な出力を示します。

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

typedef struct LL{
    struct LL *next;
}LL;

LL * getLastNode(LL * head)
{
    LL *temp = head;
    while(temp->next != NULL)
    {
        temp = temp->next;
    }
    return temp;
}

void addLL(LL * head)
{
LL *newNode;
LL *tail = getLastNode(head);

newNode = malloc(sizeof(LL));
if(newNode != NULL)
{
    newNode->next = NULL;

    if(!head) head = newNode;
    else tail->next = newNode;      
}   
}

int countLL(LL * head)
{
    int elements = 0;
    LL * temp = head;
    while(temp->next != NULL)
    {
        temp = temp->next;
        elements++;
    }
    return elements;
}

int main() {
    LL *h = malloc(sizeof(*h));
    addLL(h);
    addLL(h);
    addLL(h);
    printf("%d\n", countLL(h)); // prints 3 as expected
}
于 2012-04-25T10:43:03.580 に答える
0

コードにいくつかの問題があります。

  • リスト ポインターが有効かどうか(つまり、null でないかどうか)をテストして、リンクされたリスト操作を常に保護する必要があります。
  • 最初の新しいアイテムを割り当てる方法が原因で、空のリストに最初のアイテムを割り当てることはできません。変更headしても、変更は関数の外部に伝播されません。「 a のアドレス」に相当する「リスト ポインタへのポインタ」 (つまり a ) を渡す必要があります。どのように呼び出し、そのプロトタイプと割り当てをどのように変更したかを確認してくださいLL**LL*addLL()head
  • リストが 1 ブロックの長さしかない場合は、後継者がある場合にのみカウントされるため、カウントされません。do / while 条件の順序をどのように変更したかを確認してください。

1、2、または任意のリストの長さで機能する修正されたコードを提案します ( MinGW ですばやくコンパイルするように変更したところです。型定義することもできます) CPU_INT32Uint

#include <stdio.h>

#define DEF_NULL 0

typedef struct tagL {
    int ID;
    int TCB;
    struct tagL *next;
} LL;

void addLL(LL ** head);
LL * getLastNode(LL * head);
int countLL(LL * head);

void addLL(LL ** head)
{
    LL *newNode;
    LL *tail = getLastNode(*head);

    newNode = malloc(sizeof(LL));
    if(newNode != DEF_NULL)
    {
        newNode->ID=-1;
        newNode->TCB=-1;
        newNode->next = DEF_NULL;

        if(!*head) 
            *head = newNode;
        else 
            tail->next = newNode;      
    }   
}

LL * getLastNode(LL * head)
{
    LL *temp = head;
    if (head){
        while(temp->next != DEF_NULL)
        {
            temp = temp->next;
        }
    }
    return temp;
}

int countLL(LL * head)
{
    int elements = 0;
    LL * temp = head;
    if (head){
        do {
            temp = temp->next;
            elements++;
        } while(temp != DEF_NULL);
    }
    return elements;
}

int main(int argc, char *argv[]){
    LL *list = 0;

    printf("LL test\n");
    addLL(&list);
    printf("length = %d\n", countLL(list));
    addLL(&list);
    printf("length = %d\n", countLL(list));
    addLL(&list);
    printf("length = %d\n", countLL(list));
}

出力:

LL test
length = 1
length = 2
length = 3
于 2012-04-25T11:00:08.080 に答える