2017-04-14 8 views
0

このコードで問題が発生したのは、最初の繰り返しでaddTrash関数内でstruct node * headを返そうとしたときです。私はそれがスタックの破損かもしれないと思うが、私は確かにわからないし、私はあなたが与えたコード内のエラーが何であるかを正確に把握する方法を知らない。SegFault on returnステートメントC

これは、データが保持する唯一のデータとして値を持つ、二重リンクされたリンクリストです。あなたのコードで

struct node * modifyMainList(struct node *head, int link2Delete){ 

    struct node * curr = head; 
    struct node * temp; 
    int i = 0; 

    //traverse list link2Delete amount of times 
    while(i != link2Delete){ 

     curr = curr -> next; 
    } 


    //head case 
    if(curr -> previous == NULL){ 

     curr = curr -> next;    

     head = curr; 
     return head; 
    } 

    //tail case 
    if(curr -> next == NULL){ 

     temp = curr;  
     curr = curr -> previous; 

     curr -> next = NULL; 
     temp -> previous = NULL; 
     temp -> next = NULL; 

     free(temp); 
     return head; 
    } 

    curr -> previous -> next = curr -> next; 
    curr -> next -> previous = curr -> previous;    


    curr -> previous = NULL; 
    curr -> next = NULL; 
    free(curr); 
    return head; 
} 



struct node * addTrash(struct node *mainHead, int link2Delete){ 

    struct node * head = NULL; 
    struct node * curr = mainHead; 
    struct node * trashCurr = NULL;; 
    struct node * temp = NULL; 
    int i = 0; 

    printf("im in trash before loop\n\n"); 
    for(i = 0; i < link2Delete; i++){ 

     curr = curr -> next; 
    } 

    printf("im in trash before head size check\n\n"); 
    if(head == NULL){ 

     printf("im in trash with head == null\n\n"); 
     //head of main list 
     if(link2Delete == 0){ 

      printf("im in trash link2delete == null\n\n"); 
      curr = curr -> previous; 
      head = curr; 

      curr = curr -> next; 
      curr -> previous = NULL; 
      curr -> next = NULL; 
      return head; 
     } 

     printf("im in trash before tail case\n\n"); 
     //tail of main list 
     if(curr -> next == NULL){ 


      printf("im in trash with tail case\n\n"); 
      head = curr; 

      head -> previous = NULL; 
      return head; 
     } 

     printf("im in trash before after tail case\n\n"); 

     //every other case 

     //printf("this is the head value: %d\n\n", head -> value); 
     head = curr; 
     //printf("im in trash after head = curr\n\n"); 

     head -> previous = NULL; 
     //printf("im in trash after head -> previous\n\n"); 

     head -> next = NULL; 
     printf("im in trash after head -> next\n\n"); 

     printf("this is the head value: %d\n\n", head -> value); 
     return head; 

    }else{ 

     printf("im in trash inside else\n\n"); 
     trashCurr = head; 
     while(trashCurr -> next != NULL){ 

      trashCurr = trashCurr -> next; 
     } 

     if(link2Delete == 0){ 

      temp = curr; 
      trashCurr -> next = temp; 

      temp -> previous = trashCurr; 
      trashCurr = temp; 
      trashCurr -> next = NULL; 
      return head; 
     } 

     //tail of main list 
     if(curr -> next == NULL){ 

      temp = curr; 
      trashCurr = temp; 

      temp -> previous = trashCurr;   
      temp -> next = NULL; 
      trashCurr -> next = temp; 

      return head; 
     } 

     //every other case 

     temp = curr;  
     temp -> previous = trashCurr; 

     trashCurr -> next = temp; 
     trashCurr = temp; 
     trashCurr -> next = NULL; 
     return head; 

    } 


} 


void generateRandom(struct node *mainHead, int size){ 
    int i = 0; 
    int link2Delete = 0; 
    struct node *head = NULL; 
    srand (time(NULL)); 
    int number2Delete = rand() % size + 1; 


    printf("this is the rand number: %d\n", rand());  

    printf("this is the number of nodes to be deleted: %d\n", number2Delete); 

    for (i = 0; i < number2Delete; i++) { 
     // Pick a random node (payload) to delete. 
     link2Delete = (rand() % size); 
     printf("this is the number of nodes in the list: %d\n", size); 
     printf("this is the node to be deleted: %d\n", link2Delete); 
     size--; 

     if(link2Delete == 0){ 
      mainHead = modifyMainList(mainHead, link2Delete); 
      //printf("this is the call return: %d\n\n", addTrash(mainHead, link2Delete) -> value); 
      head = addTrash (mainHead, link2Delete); 

     }else{ 

      head = addTrash (mainHead, link2Delete); 
      mainHead = modifyMainList(mainHead, link2Delete); 
     } 

    } 
    return; 
} 
+1

デバッガでプログラムを試しましたか?セグメンテーション違反の原因となる可能性があることが強調される可能性があります。 –

+0

私はこのコンピュータにデバッガを持っておらず、この学校コンピュータでデバッガを入手できません –

+0

ここでmain()は何ですか?私は自分のコンピュータでそれを実行したい。 –

答えて

1

link2Delete!=0場合、

while(i != link2Delete){ 

    curr = curr -> next; 
} 

は無限ループです。

また、head caseで解放しないでください。

ループが無限であるため、curr = curr->nextは繰り返し処理を継続し、(ループ条件が真ならば)ガベージポインタを指します。そして、未定義の振る舞いをします。そしてあなたはセガファルトになるかもしれません。

+0

これは問題を修正したようです。今、私はちょうどsegfaultsを他のところに持っていますが、私には論理的なエラーかもしれませんが、私はまだ分かりません。ありがとうございました –