在返回语句C

问题描述:

SegFault我与这段代码的问题是,当我试图返回第一次迭代addTrash函数内的结构节点*头。我怀疑这可能是堆栈腐败,但我不知道确切的,我不知道我究竟如何找出错误是在我给你的代码内。在返回语句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

你在调试器上试过你的程序吗?这可能会突出显示可能是Segmentation故障的原因。 –

+0

我没有这台计算机上的调试器,并且无法使用此学校计算机获得一个 –

+0

main()在哪里?我想在我的电脑上运行它。 –

在你的代码,

while(i != link2Delete){ 

    curr = curr -> next; 
} 

是一个无限循环,如果link2Delete!=0

而且,在head case没有释放。

由于循环是无限的,curr = curr->next将继续重复,它会指向一些垃圾指针(如果循环条件为真)。然后,它有未定义的行为。你可能会得到SEGFAULT。

+0

好吧,看起来像解决了这个问题。现在我只是在其他地方发生段错误,但在我看来,他们可能只是逻辑错误,但我还不确定。谢谢 –