3

私の課題では、"LNode" 構造体へのポインターと整数引数を引数として受け取る関数を作成する必要があります。次に、その整数を連結リストに追加するだけでなく、リストが適切な昇順になるように配置する必要があります。これについていくつかのさまざまな試みを試みましたが、これは投稿時の私のコードです。

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 を挿入してから 3 を挿入しようとすると、5 が挿入されますが、while ループが 1 回実行され、セグメンテーション違反が発生します。

また、このプロジェクトの骨格コードの一部であるため、引数を変更することはできません。助けてくれる人に感謝します。

それが役立つ場合、これは構造がどのように見えるかです

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

} LNode;
4

4 に答える 4

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;

uninitializedptr->nextが (not)かどうかを確認しますNULLptrそれは賢明ではなく、条件にNULLがあるため、その部分のビットパターンがポインターのパターンではない場合、大混乱を引き起こす可能性があり||ます。ループ条件は常に真であり、リストの最後から実行されます。

||いずれにせよ は間違っています。 が必要です。&&両方の条件が満たされなければならず、何かがそうではなく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 ??

しかし、どのポインターを返しますか? 新しいアイテムがリストの最初の場合、最初のノードへのポインターを返します。新しいアイテムが後で挿入された場合にもそれを行いたい場合は、元のアイテム (のコピー) を保持し、headPtrそれを返す必要があります。

于 2012-04-06T23:45:36.687 に答える
2

while ループの条件が間違っています。設定することはありませんが、それを使用して、どの手段がループでワイルドになるptr->nextかを確認します。したがって、値を設定したら、次を設定する必要があります。ptr->next!=NULLheadPtr=headPtr->nextptr->next=NULL

これらの行を取り出して、一番上に置くこともできます:

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

これを試して:

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"
于 2012-04-06T23:35:44.940 に答える
0

while ループはリンクされたリストの最後まで続き、最後の要素は null です。したがって、while 条件では、null ノード (headPtr) を逆参照しているため、この方法でセグメンテーション違反が発生します。次のように、ノードが null かどうかを確認する必要があると思います。

while (headPtr != NULL && (headPtr->value > newItem || ptr->next != NULL))
于 2012-04-06T23:44:41.103 に答える