버블 정렬 알고리즘에서 연결 목록의 노드를 어떻게 교체합니까?

마르코 DG

CI 에서 LinkedList 의 값아닌 노드교체 하는 버블 정렬 기능을 작성해야 하지만 수행 할 수 없습니다. 다음은 코드입니다 (주문이 올바르지 않음을 알 수 있음).

#include <stdio.h>
#include <malloc.h> // malloc, free
#include <stddef.h> // NULL

// defining 'int' as data_t
typedef int data_t;

typedef struct node_s {
    data_t data;
    struct node_s* next;
} node_t;

node_t** list_new() {
    node_t** list = malloc(sizeof **list);
    if (!list) return NULL;
    *list = NULL;
    return list;
}

void list_delete(node_t** list) {
    node_t *node, *next;
    for (node = *list; node; node = next) {
        next = node->next;
        free(node);
    }
}

node_t* list_push_front(node_t** list, data_t data) {
    node_t* node = malloc(sizeof(node_t));
    if (!node) return NULL;
    node->data = data;
    node->next = *list;
    return *list = node;
}

// IS EASY TO SWAP THE VALUES
/*
void swap(data_t* a, data_t* b) {
    data_t c = *a;
    *a = *b;
    *b = c;
}

void simple_bubble_sort(node_t** list) {
    for(node_t* i = *list; i; i = i->next)
        for(node_t* j = *list; j->next; j = j->next)
            if(j->data > j->next->data)
                swap(&(j->data), &(j->next->data));

}
*/
// MUCH LESS EASY TO SWAP THE NODES
void swap_node(node_t** prev_node_A, node_t** node_A, node_t** node_B) {
        node_t *last_node = (*node_B)->next;
        node_t *first_node = *node_A;
        node_t *second_node = *node_B;
        if (prev_node_A) {
            (*prev_node_A)->next = second_node;
            (*prev_node_A)->next->next = first_node;
            (*prev_node_A)->next->next->next = last_node;
        } else {
            (*node_A) = second_node;
            (*node_A)->next = first_node;
            (*node_A)->next->next = last_node;
        }
}

void simple_bubble_sort(node_t** list) {

    for(node_t* i = *list; i->next; i = i->next)
        for (node_t *j = *list; j->next->next; j = j->next) {
            if (j == *list) {
                if (j->data > j->next->data) {
                    *list = j->next;
                    swap_node(NULL, &j, &(j->next));
                }
            }
            else {
                if (j->next->data > j->next->next->data)
                    swap_node(&j, &(j->next), &(j->next->next));
            }
            //printf("%i,%i | %i, %i, %i, %i \n", i->data, j->data, (*list)->data, (*list)->next->data, (*list)->next->next->data, (*list)->next->next->next->data);
            //system("pause");
        }
}


int main() {
    // Create List
    node_t** list = list_new();
    if (!list)
        goto memory_allocation_failure;

    // Add values to List
    for(int i=0; i<10; i++)
        if (!list_push_front(list, i))
            goto memory_allocation_failure;

    // Print List
    for (node_t* node = *list; node != NULL; node = node->next)
        printf("%i\n", node->data);

    // Swap Test
    //swap_node(NULL, &(*list), &((*list)->next));
    //swap_node(&(*list), &((*list)->next), &((*list)->next->next));

    // Sort List
    printf("-- Bubble Sort --\n");
    simple_bubble_sort(list);

    // Print List
    for (node_t* node = *list; node != NULL; node = node->next)
        printf("%i\n", node->data);

    // Delete List
    list_delete(list);
    return 0;

    // Error Handler
    memory_allocation_failure:
        printf("Memory Allocation Failure");
        return 1;
}
Vlad / 모스크바

여기에 기능이 swap있습니다.

 void swap( node_t **current )  
 {  
     node_t *tmp = ( *current )->next->next;  

     ( *current )->next->next = *current;  


     *current = ( *current )->next;  

     ( *current )->next->next = tmp;  
 }  

그리고 여기에 기능이 있습니다 simple_bubble_sort

 void simple_bubble_sort( node_t **head )  
 {  
     if ( *head )  
     {  
         for ( node_t **first = head, *sorted = NULL, *last = sorted;  
               ( *first )->next != last;  
               last = sorted )  
         {  
             sorted = ( *first )->next; 
             for ( node_t **current = first; ( *current )->next != last; current = &( *current )->next )  
             {  
                 if ( ( *current )->next->data < ( *current )->data )  
                 {  
                     swap( current );  

                     sorted = ( *current )->next;  
                 }  
             }  
         }  
     }  
 }  

그들을 조사하십시오.

헤더 <malloc.h>는 표준 C 헤더가 아닙니다. 대신 헤더를 사용하십시오 <stdlib.h>.

현재 코드를 수정해야합니다. 예를 들어이 기능

node_t** list_new() {
    node_t** list = malloc(sizeof **list);
    if (!list) return NULL;
    *list = NULL;
    return list;
}

제거해야하는 것은 말이되지 않습니다.

필요한 것은 메인에서 다음과 같은 포인터를 정의하는 것입니다.

node_t *head = NULL;

그 기능에 대한 예로서 함수로 전달 simple_bubble_sort추천

simple_bubble_sort( &head );

또는 함수 list_push_front는 다음과 같이 정의되어야합니다.

int list_push_front(node_t** list, data_t data) 
{
    node_t* node = malloc(sizeof(node_t));
    int success = node != NULL;

    if ( success )
    {
        node->data = data;
        node->next = *list;
        *list = node;
    }

    return success;;
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Java에서 두 개의 연결된 목록 노드를 어떻게 비교합니까?

분류에서Dev

연결된 목록에서 노드를 이동하여 버블 정렬 (C ++)

분류에서Dev

새로운 단일 연결 목록에서 단일 연결 목록의 홀수 인덱싱 된 노드를 반환하려면 어떻게해야합니까? 첫 번째 노드의 인덱스를 1로 가정합니다.

분류에서Dev

이 단일 연결 목록 정렬 알고리즘을 어떻게 수정하여 오름차순으로 올바르게 정렬합니까?

분류에서Dev

객체의 정렬 방법에 대해 연산자 <를 어떻게 오버로드합니까?

분류에서Dev

cypher에서 연결된 노드 목록과 문자열의 위치를 어떻게 반환합니까?

분류에서Dev

이진 트리가 주어지면 각 깊이에서 모든 노드의 연결 목록을 생성하는 알고리즘을 설계합니다.

분류에서Dev

연결된 목록 노드에 개체를 유지하려면 어떻게해야합니까?

분류에서Dev

연결된 목록에서 이름을 어떻게 정렬합니까?

분류에서Dev

유니 코드 데이터 정렬 알고리즘에서 결합 문자 처리는 어떻게 작동합니까?

분류에서Dev

연결 목록에서 삭제할 노드의 포인터가 주어집니다. 주 함수의 노드에 포인터를 어떻게 전달합니까?

분류에서Dev

하나의 링크를 제거하면 연결된 목록에서 노드가 어떻게 삭제됩니까?

분류에서Dev

C에서 버블 정렬 알고리즘의 어려움에 직면

분류에서Dev

메서드에 의존하지 않고 연결 목록의 끝에있는 노드를 삭제하려면 어떻게해야합니까?

분류에서Dev

두 개의 더미 노드 사이에 이중 연결 목록의 시작 부분에 노드를 추가하려면 어떻게해야합니까?

분류에서Dev

Vowpal Wabbit에서 사용할 알고리즘 (예 : 의사 결정 트리, SVM, 앙상블, NN)을 지정할 수 있습니까? 아니면 Automl이 알고리즘 자체를 선택합니까?

분류에서Dev

연결 목록은 어떻게 정렬합니까?

분류에서Dev

사용자 지정 방법을 사용하여 0 번째 위치에 연결된 목록에 노드를 삽입하려면 어떻게해야합니까?

분류에서Dev

yaml-cpp에서 어떤 종류의 노드를 다루고 있는지 어떻게 결정합니까?

분류에서Dev

단일 연결 목록의 중앙에있는 노드 삭제. 노드는 어떻게됩니까?

분류에서Dev

연결 목록에서 연결 목록의 길이를 어떻게 찾을 수 있습니까?

분류에서Dev

LC3의 어셈블리 코드에서 정렬 알고리즘을 만드는 방법

분류에서Dev

dict 키를 목록에있는 개체의 속성에 연결하려면 어떻게해야합니까?

분류에서Dev

버블 정렬 알고리즘에서이 라인은 무엇을 의미합니까?

분류에서Dev

이 알고리즘의 실행 시간을 어떻게 결정합니까?

분류에서Dev

여러 목록에서 _na를 어떻게 교체합니까?

분류에서Dev

어셈블리에서 C 함수를 어떻게 호출하고 어떻게 정적으로 연결합니까?

분류에서Dev

어셈블리에서 C 함수를 어떻게 호출하고 어떻게 정적으로 연결합니까?

분류에서Dev

연결 목록은 요소가 목록에서 제거되고 조정되는시기를 어떻게 알 수 있습니까?

Related 관련 기사

  1. 1

    Java에서 두 개의 연결된 목록 노드를 어떻게 비교합니까?

  2. 2

    연결된 목록에서 노드를 이동하여 버블 정렬 (C ++)

  3. 3

    새로운 단일 연결 목록에서 단일 연결 목록의 홀수 인덱싱 된 노드를 반환하려면 어떻게해야합니까? 첫 번째 노드의 인덱스를 1로 가정합니다.

  4. 4

    이 단일 연결 목록 정렬 알고리즘을 어떻게 수정하여 오름차순으로 올바르게 정렬합니까?

  5. 5

    객체의 정렬 방법에 대해 연산자 <를 어떻게 오버로드합니까?

  6. 6

    cypher에서 연결된 노드 목록과 문자열의 위치를 어떻게 반환합니까?

  7. 7

    이진 트리가 주어지면 각 깊이에서 모든 노드의 연결 목록을 생성하는 알고리즘을 설계합니다.

  8. 8

    연결된 목록 노드에 개체를 유지하려면 어떻게해야합니까?

  9. 9

    연결된 목록에서 이름을 어떻게 정렬합니까?

  10. 10

    유니 코드 데이터 정렬 알고리즘에서 결합 문자 처리는 어떻게 작동합니까?

  11. 11

    연결 목록에서 삭제할 노드의 포인터가 주어집니다. 주 함수의 노드에 포인터를 어떻게 전달합니까?

  12. 12

    하나의 링크를 제거하면 연결된 목록에서 노드가 어떻게 삭제됩니까?

  13. 13

    C에서 버블 정렬 알고리즘의 어려움에 직면

  14. 14

    메서드에 의존하지 않고 연결 목록의 끝에있는 노드를 삭제하려면 어떻게해야합니까?

  15. 15

    두 개의 더미 노드 사이에 이중 연결 목록의 시작 부분에 노드를 추가하려면 어떻게해야합니까?

  16. 16

    Vowpal Wabbit에서 사용할 알고리즘 (예 : 의사 결정 트리, SVM, 앙상블, NN)을 지정할 수 있습니까? 아니면 Automl이 알고리즘 자체를 선택합니까?

  17. 17

    연결 목록은 어떻게 정렬합니까?

  18. 18

    사용자 지정 방법을 사용하여 0 번째 위치에 연결된 목록에 노드를 삽입하려면 어떻게해야합니까?

  19. 19

    yaml-cpp에서 어떤 종류의 노드를 다루고 있는지 어떻게 결정합니까?

  20. 20

    단일 연결 목록의 중앙에있는 노드 삭제. 노드는 어떻게됩니까?

  21. 21

    연결 목록에서 연결 목록의 길이를 어떻게 찾을 수 있습니까?

  22. 22

    LC3의 어셈블리 코드에서 정렬 알고리즘을 만드는 방법

  23. 23

    dict 키를 목록에있는 개체의 속성에 연결하려면 어떻게해야합니까?

  24. 24

    버블 정렬 알고리즘에서이 라인은 무엇을 의미합니까?

  25. 25

    이 알고리즘의 실행 시간을 어떻게 결정합니까?

  26. 26

    여러 목록에서 _na를 어떻게 교체합니까?

  27. 27

    어셈블리에서 C 함수를 어떻게 호출하고 어떻게 정적으로 연결합니까?

  28. 28

    어셈블리에서 C 함수를 어떻게 호출하고 어떻게 정적으로 연결합니까?

  29. 29

    연결 목록은 요소가 목록에서 제거되고 조정되는시기를 어떻게 알 수 있습니까?

뜨겁다태그

보관