0

簡単に言えば、私は基本的なデータベースのための単一リンクリストの本当に原始的な実装を書いています。ユーザーがインデックスの下にリストされている要素をDB内の現在のレコード数よりも多く印刷するように要求すると、セグメンテーション違反が発生し続けますが、差が1の場合に限ります。数値が大きい場合は、そこに書き込んだエラーシステムがトリガーされます。

コードは次のとおりです。

void print_spec(List* head)
{
int index, i, is_correct=1;
List * current=NULL; //List is typedef'ed structure consisting variables for data and pointer assumed to be bound to next element in list
printf("\nInput the element index: ");
scanf("%d", &index);
if(head!=NULL) 
{
    current=head;
    for (i=0; i<index; i++) 
    {
        if(current==NULL) 
        {
            printf("There is no such element");
            is_correct=0;
            break;
        }
        else current=current->next;
        }
    if(is_correct!=0) print(current); //this function simply prints out variables from element
}
else printf("List is empty, can't print");
}

少しエラーがあると思いますが、トピックで述べたように、ループカウンターでの範囲超過の可能性を考慮して試行錯誤しながら2時間かけて探していますが、適切な結果が得られませんでした。 。

4

2 に答える 2

1

i==indexwhileが原因で、ループが終了する可能性がありますcurrent==NULLis_correctこの場合、が設定されることはなく、プログラムがNULLリスト要素を出力しようとすると失敗する可能性があります。コードを次のように変更することで、これを回避し、ループを単純化できます。

for (i=0; i<index && current!=NULL; i++) 
{
    current=current->next;
}
if (current != NULL)
    print(current);
于 2013-01-12T19:42:29.890 に答える
0

更新しました

上記の元のコードで、次を置き換えます。

if(is_correct!=0) print(current);

if(is_correct!=0 && current != NULL)
    print(current);
else
    printf("Trying to print null List entry\n");

リストに10個のエントリがあり、インデックスがたまたま11であるとします。
次に、i=10で何が起こるかを次に示します。

for (i=0; i<index; i++) // i(10) < index(11)
{
    if(current==NULL) // not true as you have a 10th element
    {
        printf("There is no such element");
        is_correct=0;
        break;
    }
    else current=current->next; // current is now NULL as there is no 11th element
}
if(is_correct!=0) print(current); // crash, trying to print NULL
于 2013-01-12T19:49:04.233 に答える