2013-05-07 2 views
0

이 코드를 제대로 작동 시키려면 약 5 시간이 걸렸으므로 코드는 인터넷 조사 시간을 기준으로 작성되었습니다. 여러 번 수정했는데 모두 세분화 오류가 발생했습니다. 따라서이 버전 만 실행됩니다. 무슨 일이 일어나고 있는지, 코드가 순환하고 제거하려는 요소뿐만 아니라 그 앞에있는 모든 요소를 ​​삭제한다는 것입니다. 따라서 마지막 요소를 삭제하려면 목록의 모든 항목이 삭제됩니다. 또는 두 번째 요소를 삭제하려는 경우 첫 번째 및 두 번째 요소를 삭제하는 등의 작업을 수행 할 수 있습니다. 입력 한 모든 이름이 어떤 이유로 최상위 이름이라고 생각합니다.이중 연결 목록에서 요소를 삭제하는 데 문제가 있습니다.

static void menu_delete_employee(void) 
{ 
    char deletename[MAX_NAME_LENGTH+1]; 
    char namecheck[MAX_NAME_LENGTH+1]; 
    int errorcheck = 0; 
    int foundit = 0; 
    fprintf(stderr, "Enter the name of the employee you wish to delete\n"); 
    gets(deletename); 
    employee_list = top; 
    employee_list->name; 

    do 
    { 
    strcpy (namecheck, employee_list->name); 
    printf("namecheck = %s\n", namecheck); 
    errorcheck = (strcmp (namecheck, deletename)); 
    printf("errorcheck = %i\n", errorcheck); 

    switch (errorcheck) 
    { 
     case 0: 
     { 
      printf("This is the right name\n"); 
      foundit = 1; 
      if (employee_list->prev == NULL) 
      { 
      printf("top name\n"); 
      top = employee_list->next; 
      } 
      else 
      { 
      if (employee_list->next == NULL) 
      { 
       printf("last one\n"); 
       temp = employee_list->prev; 
       temp-> next = NULL; 
       free (employee_list); 
      } 
      else 
      { 
       printf("somewhere in the middle"); 
       temp = employee_list->prev; 
       temp->next = employee_list->next; 
       employee_list->next->prev = temp; 
       free (employee_list); 
      } 
      } 
      printf("delete successful\n"); 
      break; 
     } 
     default: 
     { 
      printf("not this one\n"); 
      errorcheck = 0; 
      employee_list = employee_list->next; 
      break; 
     } 
    } 
    } 
    while (foundit == 0); 
    if (foundit == 0) 
    printf("Name not recognised\n."); 
    return;  
} 

모든 도움을 주시면 감사하겠습니다.

+0

아마도 당신이 묻는 문제와 관련이 없지만 여전히 중요한 포인트입니다 : 절대 안전하지 않기 때문에 ** 결코 ** 사용하지 마십시오. 'char * fgets (char * s, int size, FILE * stream)'을 사용하십시오. – hlovdal

+0

언뜻보기에 최상위 노드가 일치하면 해제되지 않습니다. 마지막 노드에 도달하면 종료해야합니다. 이것 저쪽에, 나는 삭제 부분 안에 무엇이든을 발견한다. 더 나은 링크가 생성 된 부분을 잘못된 출력으로 보냈습니다. – VoidPointer

+0

구조를 만드는 소스 코드를 의미합니까? – user2358231

답변

0

아마도 이중 연결 목록은 사용자가 생각하는 방식대로 작성되지 않았을 수 있습니다. 먼저 점검해야합니다.

이 코드로 여전히 토폴로지가 올바른지 문제의 부부가되어 가정 :

employee_list->name; (바로 do 루프 위) :이 무엇인가?

strcpy (namecheck, employee_list->name); : 복사 할 필요가 없습니다. 이는 단지 축약 문자이므로 namecheck은 (const) 문자열 포인터가 될 수 있습니다.

switch (errorcheck) : 여기에는 2 개의 팔만 있습니다. if을 사용하지 않으시겠습니까?

if (employee_list->prev == NULL) ... : 여기에 top 포인터를 이동하지만 최상위 항목을 삭제하지 않으면 메모리 누수가 발생합니다. 또한 다음 항목의 prev 포인터를 NULL으로 설정하지 마십시오.

"어딘가에있는 가운데"부분에서 : employee_list은 현재 위치 포인터입니다. 처리 할 다음 항목은 temp->next이어야합니다. 맞습니까? 현재 포인터를 따라 움직이지 않기 때문에 이것은 아마 문제 일 것입니다. 또한 명시 적으로 tobedeleted이라는 포인터를 삭제할 항목으로 설정하는 것이 좋습니다. 목록 (목록의 employee_list)을 반복하는 데 사용 된 포인터가 적절히 이동되었는지 확인하고 *tobedeleted이 이중에서 적절하게 분리되어 있는지 확인하십시오 그런 다음 free(tobedeleted) 명령을 실행하십시오.

employee_list = employee_list->next; : 마지막 항목에서 NULL로 변환되는 employee_list을 확인하고 루프를 종료해야합니다. 그렇지 않으면 나쁜 일이 일어날 것입니다.

최종 조언 : 실제로 좋은 C 서적을 참고해야합니다 ... Kernighan and Ritchie 예를 들어. "인터넷 연구"보다 나은 방법.

+0

감사합니다, 그것을 변경하려고합니다. – user2358231

+0

일부 C 책을 보았습니다. 그러나 대부분은 링크 된 목록에서 삭제하는 것에 대해 많은 것을 담고 있지 않습니다. – user2358231

관련 문제