2013-07-29 4 views
1

아래 제공된이 프로그램을 참조하십시오. delete_node 함수의 끝에 충돌합니다. 나에게 무슨 일이 일어나는지 알려주세요. delete_node (5) 호출이 끝날 때 충돌이 발생합니다. delete_node 호출 후 printf 문이 실행되지 않습니다.연결된 목록이있는 세그먼트 오류

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include<stdbool.h> 

typedef struct _list{ 
    int data; 
    struct _list *next; 
}list; 

list* create_list(int val); 
list* add_list(int val, bool ad_end); 
int delete_node(int val); 
void print_list(void); 
list* head = NULL; 
list* curr = NULL; 

int main() 
{ 
    int val = 10; 
    list* mylist; 
    mylist = create_list(5); 
    add_list(val, true); 
    add_list(20, true); 
    add_list(30, true); 
    add_list(25, true); 
    print_list(); 
    delete_node(5); 
    printf("\n I am here in main \n"); 
    print_list(); 
    return 0; 
} 

list* create_list(int val) 
{ 
    list* ptr =(list*) malloc(sizeof(list)); 
    head = curr = ptr; 
    ptr->data = val; 
    ptr->next = NULL; 
    return ptr; 
} 

list* add_list(int val, bool add_end) 
{ 
    list* ptr =(list*) malloc(sizeof(list)); 
    ptr->data = val; 
    ptr->next = NULL; 
    if(add_end) { 
     curr->next = ptr; 
     curr = ptr; 
    } else { 
     ptr->next = head; 
     head = ptr; 
    } 
    return ptr; 
} 

int delete_node(int val) 
{ 
    list* tmp = NULL; 
    list* prev; 

    tmp = head; 
    while(tmp){ 
     if(tmp->data == val) { 
      printf(" Found the node to be deleted\n"); 
      prev->next = tmp->next; 
      if(tmp == head) { 
       head = tmp->next; 
      } 
      free(tmp); 
      printf(" Head data is %d \t head %p\t add-nxt %p\n", head->data, head, head->next); 
      break; 
     } else { 
      prev = tmp; 
      tmp = tmp->next; 
     } 
     printf("Node to be deleted not found \n"); 
    } 
    return 1; 
} 

void print_list(void) 
{ 
    list* tmp = head; 
    while(tmp != NULL) { 
     printf("addr %p\t addr next %p\n", tmp, tmp->next); 
     printf(" Data is %d \n", tmp->data); 
     tmp = tmp->next; 
    } 
    printf("\n"); 
} 
+1

당신이 디버거에서 코드를 실행하려고 했이 연결되어 이해하기가 훨씬 더 간단 할 것으로 예상 나에 의해 구현 목록 및 코드를 통해 이동? 그러면 다른 사람들에게 디버깅을 요청하는 것보다 훨씬 빨리 문제를 찾을 수 있습니다. –

+2

'prev'는'delete_node'에서 첫 번째 요소를 제거하려고 시도 할 때 설정되지 않습니다. – BLUEPIXY

+2

이것은 오류가 아니지만 prev-> next = tmp-> next입니다. prev가 초기화되지 않은 경우 (즉, data == val이 첫 번째 값에 대해 true 인 경우) segfaults의 소스가됩니다. – LostBoy

답변

1

delete_node(int val)에서 prev 포인터가 초기화되지 않습니다. 문 prev->next = tmp->next;은 정의되지 않은 동작을 제공합니다. 포인터를 초기화하십시오.

list * prev = head; 

또한 printf 문은 free(tmp); 문 뒤에옵니다. printf는 이미 할당 해제 된 메모리에 변수를 출력하고있다. 무료 호출은 printf 문 뒤에 와야합니다.

printf(" Head data is %d \t head %p\t add-nxt %p\n", head->data, head, head->next); 
free(tmp); 
1

delete_node에서는 변수 prev 선언,하지만 당신은 그것에 값 할당하지 않습니다 필요한 값으로

list* prev; 

을 (5) 첫 번째 목록 요소에,이 실행됩니다 문 : prev 정의되지 않은, 따라서 해방 SegmentFault와

prev->next = tmp->next; 

.

그게 오류의 원인입니다.

... 
int delete_node(int val) 
{ 
    list* tmp = NULL; 
    list* prev = NULL; 

    tmp = head; 
    while(tmp){ 
     if(tmp->data == val) { 
      printf(" Found the node to be deleted\n"); 
     if (prev) { 
      prev->next = tmp->next; 
     } 
     ... 

또한 일을 고려해야합니다

가장 간단한 해결책은 요소 선언에 NULL로 prev를 설정하고 while 루프에서 NULL 인 경우 확인하여 처음이다 싶었다 때 단지 사건을 처리하는 것입니다 그것은 전역 변수가 없다.

3

수정 된 코드는 링크 된 목록을 만드는 좋은 방법이 아닌 방식으로 지금은 아무 문제없이 작동합니다.

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include<stdbool.h> 

typedef struct _list{ 
    int data; 
    struct _list *next; 
}list; 

list* create_list(int val); 
list* add_list(int val, bool ad_end); 
int delete_node(int val); 
void print_list(void); 
list* head = NULL; 
list* curr = NULL; 

int main() 
{ 
    int val = 10; 
    list* mylist; 
    mylist = create_list(5); 
    add_list(val, true); 
    add_list(20, true); 
    add_list(30, true); 
    add_list(25, true); 
    print_list(); 
    delete_node(5); 
    printf("\n I am here in main \n"); 
    print_list(); 
    return 0; 
} 

list* create_list(int val) 
{ 
    list* ptr =(list*) malloc(sizeof(list)); 
    head = curr = ptr; 
    ptr->data = val; 
    ptr->next = NULL; 
    return ptr; 
} 

list* add_list(int val, bool add_end) 
{ 
    list* ptr =(list*) malloc(sizeof(list)); 
    ptr->data = val; 
    ptr->next = NULL; 
    if(add_end&&head!=NULL) { 

      while(curr->next!=NULL){ 
       curr= curr->next; 

       } 
     curr->next=ptr; 
     curr = ptr; 
    } else { 
     ptr->next = head; 
     head = ptr; 
    } 
    return ptr; 
} 

int delete_node(int val) 
{ 
    list* tmp = NULL; 
    list* prev; 

    tmp = head; 
    while(tmp->next!=NULL){ 
     prev=tmp; 

      if(tmp == head&&head->next!=NULL) { 
       head = tmp->next; 

      free(tmp); 
      printf(" Head data is %d \t head %p\t add-nxt %p\n", head->data, head, head->next); 
      break; 
      } 

      if(tmp->data == val) { 
      printf(" Found the node to be deleted\n"); 
       tmp=tmp->next; 
      prev->next=tmp->next; 
      free(tmp); 
      printf(" Head data is %d \t head %p\t add-nxt %p\n", head->data, head, head->next); 
      break; 

     } else{ 
     printf("Node to be deleted not found \n"); 
} 
    } 
    return 1; 
} 

void print_list(void) 
{ 
    list* tmp = head; 
    while(tmp != NULL) { 
     printf("addr %p\t addr next %p\n", tmp, tmp->next); 
     printf(" Data is %d \n", tmp->data); 
     tmp = tmp->next; 
    } 
    printf("\n"); 
} 

친절

#include<stdio.h> 
#include<malloc.h> 
#include<stdlib.h> 


    struct node{ 

     char data; 
     struct node *next; 
     }; 

    struct node *head=NULL; 



    void printMenu(); 
    void getUserSelection(int *); 
    void performOperation(int); 
    void display(void); 
    void addNodeAtBeginning(void); 
    struct node* createNode(void); 
    void displayLinkedList(void); 
    void addNodeAtEnd(void); 
    void getDataFromUser(char*); 
    void addAtuserSpecificLocation(void); 
    int getLocationFromUser(void); 
    void deleteFirstNode(void); 
    void deleteLastNode(void); 
    void deleteFromAspecificPosition(void); 
    void deleteEntireList(void); 

int main(){ 


    int option=0; 


    while(9!=option){ 
        printMenu(); 
        getUserSelection(&option); 
        performOperation(option); 
    } 


    getchar(); 

    return 0; 


} 

void printMenu(){ 


     printf("\n"); 
     printf("\n***********MENU***************\n"); 
     printf("1) Add a node at the beginning\n"); 
     printf("2) Add a node at the end\n"); 
     printf("3) Add a node at a user selected position\n"); 
     printf("4) Delete first Node\n"); 
     printf("5) Delete last Node\n"); 
     printf("6) Delete node at a user selected position\n"); 
     printf("7) Display\n"); 
     printf("8) Delete entire list\n"); 
     printf("9) Exit"); 

     } 

void getUserSelection(int *number){ 

     printf("\nSelect an option: "); 
     scanf("%d",number); 

     } 

void performOperation(int option){ 

     switch(option){ 
        case 1: 
          addNodeAtBeginning(); 
          break; 

        case 2: 
          addNodeAtEnd(); 
          break; 

        case 3: 
          addAtuserSpecificLocation(); 
          break; 

        case 4: 
          deleteFirstNode(); 
          break; 

        case 5: 
          deleteLastNode(); 
          break; 

        case 6: 
          deleteFromAspecificPosition(); 
          break; 

        case 7: 
          displayLinkedList(); 
          break; 

        case 8: 
          deleteEntireList(); 
          break; 

        case 9: 
          exit(0); 
          break; 

          default: 
            printf("\n\n********Invalid option**************\n\n"); 
            break; 



       } 



     } 



     void addNodeAtBeginning(void){ 

        struct node *tempNode=NULL; 
        if(NULL==head) { 

            head= createNode(); 
            }else{ 
              tempNode=createNode(); 
              tempNode->next=head; 
              head=tempNode; 


              } 


          }  


    void addNodeAtEnd(){ 
       struct node*tempNode=NULL; 

        if(NULL==head) { 
            head=createNode(); 
            }else{ 
             tempNode=head; 
             while(NULL!=tempNode->next){ 
                tempNode=tempNode->next;    

                    } 

                    tempNode->next=createNode(); 



             } 

       }    

    struct node* createNode(){ 
      struct node *tempNode; 

      tempNode= (struct node*)malloc(sizeof(struct node)); 
      getDataFromUser(&tempNode->data); 
      tempNode->next=NULL; 
      return tempNode; 

      } 

void displayLinkedList(){ 
        struct node *tempNode; 
        printf("\n\n********************LINKED_LIST_DOUBLY*******************************\n\n\n"); 

        tempNode=head; 

        printf("[head]-->"); 
        while(NULL!=tempNode->next){ 

              printf("[%c]", tempNode-> data); 
              printf("--->"); 
              tempNode=tempNode->next;  


        } 
        printf("[%c]", tempNode->data); 
        printf("-->[X]"); 
        printf("\n\n********************LINKED_LIST_DOUBLY*******************************\n\n\n"); 


        } 


void getDataFromUser(char * data){ 

       fflush(stdin); 
       printf("Enter data: "); 
       scanf("%c",data); 

        } 

void addAtuserSpecificLocation(void){ 

    int location; 
    struct node *tempNode=NULL; 
    struct node *tempUserNode=NULL; 
    tempNode=head; 
    location=getLocationFromUser(); 

    int i; 
    for(i=1;i<location-1;i++){ 
      tempNode=tempNode->next; 

      } 

    tempUserNode=createNode(); 
    tempUserNode->next=tempNode->next; 
    tempNode->next=tempUserNode; 

    } 

int getLocationFromUser(void){ 
    int location; 
    int linkedListLength; 
    linkedListLength=getLengthOfLinkedList(); 
    while(location<0||location>linkedListLength){ 
    printf("\n\nEnter a valid location: "); 
    scanf("%d",&location); 
    } 

    return location; 



} 

int getLengthOfLinkedList(){ 
    struct node *temp; 
    int length=1; 
    if(NULL==head){ 
        printf("\n\nLinked list is empty cannot perform operation\n\n"); 
        }else{ 
        temp=head; 


    while(temp->next!=NULL){ 
        length++; 
        temp=temp->next;  
          } 
          } 
    return length; 


    } 

    void deleteFirstNode(void){ 

     struct node *tempNode=NULL; 

     if(NULL!=head){ 
         tempNode=head; 
         head=head->next; 
         free(tempNode); 

         }else{ 

          printf("\n\nThere is no node to delete\n\n"); 

          } 

     } 

void deleteLastNode(void){ 

    struct node *tempNode; 

    if(NULL!=head){ 
       tempNode=head; 

       while(NULL!=tempNode->next){ 
             tempNode=tempNode->next; 
              } 

              free(tempNode); 


        }else{ 

          printf("\n\nThere is no node to delete\n\n"); 
          } 


    } 

    void deleteFromAspecificPosition(void){ 

    int location; 
    struct node *tempNode; 

    if(NULL!=head){ 
       tempNode=head; 
        location = getLocationFromUser(); 
        int listIterator=0; 
        for(listIterator=0; listIterator<location-1;listIterator++){ 
          tempNode=tempNode->next; 

            } 

            free(tempNode); 

            } 
} 

void deleteEntireList(void){ 

     struct node* tempNode; 
     struct node* tempNode2; 
     if(NULL==head){ 
        printf("\n\nList is already empty\n\n"); 


        }else{ 
          tempNode=head; 

          while(tempNode->next!=NULL){ 
           tempNode2=tempNode->next; 
           free(tempNode); 
           tempNode=tempNode->next; 

               } 
               free(tempNode2); 
               head=NULL; 
          printf("\n\nList Deleted\n\n"); 

          } 


     } 
+0

대단히 감사합니다 – stev

+0

:) 당신은 환영합니다. –