C |在链接列表中隔离偶数节点和奇数节点

时间:2016-12-09 11:04:30

标签: c

我的代码中需要一点修复 函数void sort_list(struct Node * head)将列表分为2个列表:奇数和偶数。然后当左边的偶数和右边的奇数时,将2个列表返回到一个列表。 一切正常,除了原始列表不在主要更新。 我不会返回新列表。该功能需要无效。 也许我需要以不同的方式发送列表,但我不知道如何。 谢谢你的帮助

#include <stdio.h>
#include <time.h>

struct Node {
    int data;
    struct Node* next;
};

struct Node* Create_list(int size) {
    struct Node* head = NULL, *temp;
    srand(time(NULL));
    for (int i = 0;i<size;i++) {
        int x = rand() % 10 + 1;
        temp = (struct Node*)malloc(sizeof(struct Node));
        temp->data = x;
        temp->next = head;
        head = temp;
    }
    return head;
}

void print_list(const struct Node* head) {
    struct Node* temp=head;
    while (temp != NULL) {
        printf("%4d", temp->data);
        temp = temp->next;
    }
    printf("\n");
}

void free_list(struct Node* head) {
    struct Node* to_free = head;
    while (to_free != NULL) {
        head = head->next;
        free(to_free);
        to_free = head;
    }
}

void sort_list(struct Node* head) {
    struct Node* head_odd, *head_even, *temp;
    head_odd = head_even = NULL;
    while (head != NULL) {
        temp = head;
        head = head->next;
        if ((temp->data) % 2 == 0) {
            temp->next = head_even;
            head_even = temp;
        }
        else {
            temp->next = head_odd;
            head_odd = temp;
        }

    }
    head = head_even;
    while (head_even->next != NULL) {
        head_even = head_even->next;
    }
    head_even->next = head_odd;
}

void main() {
    struct Node* list = Create_list(6);
    print_list(list);
    sort_list(list);
    print_list(list);
    free_list(list);
}

1 个答案:

答案 0 :(得分:1)

C使用pass-by-value。所以这个:

void sort_list(struct Node* head) {

接着是

    sort_list(list);

会将list的值传递给函数。

您对函数内head所做的任何更改都是本地的,即不会更改main中list的值。

使用双指针,如:

void sort_list(struct Node** head) {
....
    *head = ....


sort_list(&list);

或返回如下指针:

struct Node* sort_list(struct Node* head) {
....
    return head;


list = sort_list(list);