これを説明するのは少し難しいですが、とにかくやってみます。0 で終わり、途中に 0 があるリストを取得するプログラムを作成しようとしています。プログラムは、各ゼロの間の最小値が誰であるかをチェックします (たとえば、 list6 -> 3 -> 15 -> 0 -> 1 ->2 ->0
の場合、最小値は3 と 1) 、それらをリストから削除し、別のリストに挿入します。
たとえば、list1 が6 -> 3 -> 15 -> 0 -> 1 ->2 ->0
の場合、プログラムを実行すると、list1 は になり6 -> 15 -> 0 -> 2 ->0
、list2 は になります3->1
。
コードを実行すると、アクセス違反のエラーが発生します。これが私のコードです:
list* essay(list* anchor1)
{
list* prev_to_min,*runner,*prev_to_runner,*result,*result_temp;
int min;
prev_to_min=prev_to_runner=anchor1;
result=allocate_list();
result_temp=result;
runner=prev_to_runner->address_to_next;
min=runner->number;
while(runner!=NULL)
{
while(runner->number!=0)
{
if(min>=runner->number)
{
min=runner->number;
prev_to_min=prev_to_runner;
}
prev_to_runner=runner;
runner=runner->address_to_next;
}
remove_item(prev_to_min);
result_temp=insert_item(result_temp,min);
prev_to_runner=runner;
runner=runner->address_to_next;
if(runner!=NULL)
min=runner->number;
}
return result;
}
非常に多くの変数があるため、簡単な説明: result は list2 (最小値のリスト) のアンカーへのポインター、result_temp は list2 の現在の最後の項目へのポインター、runner は list1 を反復処理するために使用するポインターです。 、prev_to_runner はリストのランナーの前の項目を指し、prev_to_min は list1 の最小値の前の項目を指します。たとえば6 -> 3 -> 15 -> 0
、3 が最小値であるため、prev_to_min は 6 のアドレスです。
私は一枚の紙でそれを実行しようとし、頭の中でプログラムを実行しましたが、必要な結果が得られました。しかし、それをコンパイルしてコンピューターで実行すると、「more lists.exe の 0x5557700c (msvcr100d.dll) で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0xfffffffc」というエラーが表示されます。
これは、アイテムを挿入およびアイテムを削除するためのコードです。
void remove_item(list* prev_position)
{
list* deleted;
deleted=prev_position->address_to_next;
prev_position->address_to_next=deleted->address_to_next;
free(*deleted);
}
list* insert_item(list* position,listdata x)
{
list* temp=(list*)malloc(sizeof(list));
temp->number=x;
temp->address_to_next=position->address_to_next;
position->address_to_next=temp;
return temp;
}