Код после завершения цикла не запускается - PullRequest
0 голосов
/ 18 мая 2019

Я пишу алгоритм, который будет сортировать связанный список.Однако я сталкиваюсь с проблемами, когда кажется, что цикл while завершился, но ни один из следующего кода не запустился.Я вполне могу ошибаться по поводу завершения цикла while, но согласно моим распечаткам условие для цикла while (cur! = NULL) выполнено.

void LL_sort (struct node **headpp){
//if list is null or size 1
if((*headpp)==NULL || (*headpp)->next ==NULL){
    return;
}
struct node* sortedHead = NULL;
struct node* sortedCur = NULL;
struct node* cur = *headpp;
struct node* fwd = (*headpp)->next;
int emptyflag = 0;

while(cur!=NULL){
    fwd=cur->next;
    printf("start of loop cur is %p wtih value %i\n", cur, cur->data);
    printf("start of loop fwd is %p\n", fwd);
    //if sorted list is empty
    if(sortedHead == NULL){
        cur->next = NULL;
        sortedHead = cur;
        emptyflag = 1;
        printf("[sorted list NULL]sorted head is %p with value %i\n", sortedHead, sortedHead->data );
        printf("[sorted list NULL]reg head is %p with value %i\n", *headpp, (*headpp)->data );
    }
    //if cur is smaller than head
    if(sortedHead->data >= cur->data && emptyflag==0){
        cur->next = sortedHead;
        sortedHead = cur;
        printf("[sortedHead change]sorted head is %p with value %i\n", sortedHead, sortedHead->data );
        printf("[sortedHead change]reg head is %p with value %i\n", *headpp, (*headpp)->data );
    }

    sortedCur=sortedHead;
    printf("sortedCur is %p with value %i\n",sortedCur, sortedCur->data );
    printf("sortedCur->next is %p \n",sortedCur->next );
    printf("sortedhead is %p with value %i\n",sortedHead, sortedHead->data );
    printf("sortedHead->next is %p \n",sortedHead->next );
    while((sortedCur->next!=NULL) && (sortedCur->data < cur->data)){
        sortedCur=sortedCur->next;
    }
    if(sortedCur->next == NULL && emptyflag ==0){
        sortedCur->next = cur;
        sortedCur->next = NULL;
    }

    if(sortedCur->data < cur->data && emptyflag ==0){
        sortedCur->next = cur;
        cur->next = sortedCur->next->next;
    }
    emptyflag=0;

    cur = fwd;

    printf("end of loop cur is %p\n", cur);
    printf("end of loop cur has value %i\n", cur->data);
    printf("end of loop sortedHead is %p\n", sortedHead);
    printf("end of loop sortedHead has value %i\n", sortedHead->data);
    printf("end of loop sortedHead->next is %p \n", sortedHead->next);
    printf(" -------------------------------------------------- \n");
  }

  printf("this won't print\n");
  *headpp=sortedHead;
  }

Я ожидал, что цикл завершится, и заголовок связанного списка будет изменен на отсортированный, так что любые последующие функции, вызывающие этот список, приведут к отсортированному списку.

Ответы [ 2 ]

2 голосов
/ 18 мая 2019

если cur равно NULL, то эта строка

printf("end of loop cur has value %i\n", cur->data);

вызывает неопределенное поведение путем разыменования NULL.Тогда может произойти что угодно, и вполне вероятно, что программа просто упала.

0 голосов
/ 18 мая 2019

Как уже упоминалось @ alk , эта строка может привести к ошибке сегментации.

printf("end of loop cur has value %i\n", cur->data);

Измените ее на что-то вроде:

if (cur != NULL)
    printf("end of loop cur has value %i\n", cur->data);

Ваша функцияработает просто отлично.Заголовок связанного списка изменяется на отсортированный.Я использовал эту программу для тестирования:

int main(){
    // Create the head node
    struct node *head = malloc(sizeof(struct node));
    head->next = NULL;
    head->data = 10;

    // Create 9 more nodes, 10 in total
    struct node *ptr = head;
    int i;
    for (i = 9; i > 0; i--){
        ptr->next = malloc(sizeof(struct node));
        ptr->next->next = NULL;
        ptr->next->data = i;
        ptr = ptr->next;
    }

    // Print all the nodes
    ptr = head;
    while (ptr != NULL){
        printf("Node: %p, Next: %p, Data: %d\n", ptr, ptr->next, ptr->data);
        ptr = ptr->next;
    }

    LL_sort(&head);

    // Print the sorted nodes
    ptr = head;
    while (ptr != NULL){
        printf("Node: %p, Next: %p, Data: %d\n", ptr, ptr->next, ptr->data);
        ptr = ptr->next;
    }

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...