이것은 약간 까다 롭습니다. 그러나 나는 어쨌든 시도 할 것입니다. 0으로 끝나는 목록을 얻고 중간에 0을 갖는 프로그램을 만들려고합니다. 프로그램은 각 0 사이의 최소값을 확인합니다 (예 : 목록의 경우 6 -> 3 -> 15 -> 0 -> 1 ->2 ->0
, 최소 값은 3과 1) 목록에서 삭제하고 다른 목록에 삽입합니다.C 언어로 나열합니다. 액세스 위반
예를 들어, 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;
}
많은 변수가 주변에 있기 때문에 작은 설명 : 여기에 내 코드의 결과는리스트 2의 앵커 (최소의 목록)에 대한 포인터를 result_temp은리스트 2의 현재 마지막 항목에 대한 포인터이며, runner는 list1을 반복 할 때 사용하는 포인터입니다. prev_to_runner는 목록에서 주자보다 먼저 항목을 가리키고, prev_to_min은 list1에서 최소값보다 먼저 항목을 가리 킵니다. 예를 들어 6 -> 3 -> 15 -> 0
이면 3이 최소이므로 prev_to_min은 6의 주소입니다.
필자는 종이로 실행하여 내 머리 속에 프로그램을 실행하려고했지만 필요한 결과를 얻었습니다. 하지만 내가 그것을 컴파일하고 컴퓨터가 실행될 때, 나는 "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;
}
당신이 32 비트 정수의 크기에 의해 백업 된 NULL 포인터를 가지고 꽤 좋은 단서의