2014-03-29 2 views
0

여기 내 코드가 있는데, 그게 무슨 문제인지 모르겠다. 키보드 입력을 사용하여 목록의 항목을 "삭제"하면 다른 항목의 이름이 변경됩니다. 또한 목록에없는 이름을 입력하면 항목이 삭제됩니다. 그것을 고치는 방법?C에서 연결된 목록 삭제

 #include <stdio.h> 
    #include <conio.h> 
    #include <string.h> 
    #include <ctype.h> 
    #include <stdlib.h> 
    struct list 
    { 
char name[20]; 
int age; 
char gender[10]; 
    struct list *next; 
    }; 

    void main(void) 
    { 
    struct list *HEAD = NULL; 
    struct list *temp,*current, *trav; 
    struct list *prev; 

    char choice; 


while(1) 
{ 
    clrscr(); 
    printf("MENU\n"); 
    printf("A) ADD\n"); 
    printf("B) DISPLAY\n"); 
    printf("C) DELETE\n"); 
    printf("X) EXIT\n"); 

    scanf("%c", &choice); 
    switch(toupper(choice)) 
{ 
case 'A': 
      temp= (struct list*)malloc(sizeof(struct list)); 
      temp->next=NULL; 
      printf("Fill-Up the following:\n"); 
      printf("Name:"); 
      fflush(stdin); 
      gets(temp->name); 
      printf("Age:"); 
      fflush(stdin); 
      scanf("%d",&temp->age); 
      printf("Gender:"); 
      fflush(stdin); 
      gets(temp->gender); 


      if(HEAD == NULL) 
      { 
         HEAD = temp; 

      } 
      else if(HEAD!=NULL) 
      { 
       for(trav=HEAD; trav->next != NULL; trav= trav->next); 
       trav->next=temp; 
      } 
      else 
      { 
      printf("Not Enough Memory!\n"); 
      } 


break; 
case 'B': 

      if(HEAD==NULL) 
      { 
      printf("Linked List is Empty!\n"); 
      getch(); 
      } 
      else{ 
      for(trav=HEAD; trav != NULL; trav=trav->next) 
      { 

       printf("\nName: %s\n", trav->name); 
       printf("Age: %d\n", trav->age); 
       printf("Gender: %s\n\n", trav->gender); 
        } 
        getch(); 

      } 

break; 

case 'C' : 
    if(HEAD==NULL) 
    { 
    printf("No item to be delete. List is Empty!\n"); 
    getch(); 
     } 
    else { 
     printf("Enter The Name of the item you want to Delete: "); 
     fflush(stdin); 
     gets(temp->name); 
     current=HEAD; 

     if(strcmp(temp->name,current->name)== 0) 
     { 
      HEAD=HEAD->next; 
      free(current); 
      printf("Item has been successfully deleted from the list.\n"); 
      getch(); 
      } 
     else 
     { 
      for(prev=HEAD,trav=HEAD->next; strcmp(trav->name,temp->name)!=0 ; trav=trav->next,prev=prev->next); 
        if(trav==NULL) 
        { 
        printf("Name: %s not found!", temp->name); 
        getch(); 
        } 
        else{ 
       prev->next=trav->next; 
       free(trav); 
       printf("Item has been successfully deleted from the list.\n"); 
       getch(); 
       } 

      } 
     } 
    break; 
case 'X': 
if(HEAD!=NULL){free(HEAD); } 
if(trav!=NULL){ free(trav); } 
    if(temp!=NULL){ free(temp); } 
exit(1); 

break; 

} 

} 

}

+0

추가, 삭제, 인쇄와 같이 각 작업에 개별 기능을 작성하지 않으시겠습니까? – Shravan40

답변

0

하면 gets(temp->name);을 삭제하는 항목의 이름을 얻을 수 있습니다. 그러나 temp은 목록에 추가 한 마지막 항목을 가리 킵니다. 따라서 temp->name에서 이름을 읽을 때 마지막 항목의 이름이 변경됩니다.

동작을 수정하려면 새 항목을 할당하고 연결된 목록에 추가하십시오.

+0

아. 이제 괜찮아. 고마워,하지만 왜'if (trav == NULL)'문에서'temp-> name'을 출력하지 않는가? 그것은 "Name : (null) not Found"라고 말합니다. – JayrCastro