在链表中排序偶数和奇数

时间:2016-12-17 22:31:45

标签: c linked-list

我试着编写一个带随机列表并对其进行排序的函数(在c中),以便偶数是第一个,这样做而不创建第二个列表。 我想要做的是将一个新发现的偶数移动到列表的头部(使前一个头部成为seconnd元素)。 不明白为什么我的指针搞砸了 -

typedef struct node node;
typedef struct node {
    int data;
    node *next;
};

void sortlist(node *head) {
    if (head == NULL) {
        printf("Empty list \n");
    }
    node *index1 = head->next;
    node *oldhead;
    if (index1 == NULL) {
        return;
    }
    while (index1 != NULL) {
        if (index1->data % 2 == 0) {
            oldhead = head;
            head = index1;
            head->next = oldhead;
        }
        index1 = index1->next;
    }
}

3 个答案:

答案 0 :(得分:2)

主要想法:假设您有一个列表,如下所示。

1→3→2→4

当你想让元素2成为新头时,你必须做两件事。

  • 取消关联元素2,并将3的下一个元素设为4。 [你在代码中遗漏了]
  • 创建一个新节点并使其成为列表的新头。

然后列表看起来像2->1->3->4。再次为元素4做同样的事情,它看起来像4->2->1->3

所以,我相信你需要(试探性地)这样的事情。

void sortlist(node *head) {
    if (head == NULL) {
        printf("Empty list \n");
    }
    node *current = head->next;
    node *previous = head;
    while(current != NULL){
        if(current->data % 2 == 0){
            previous->next = current->next;
            current->next = head;
            head = current;
        } else{
            previous = previous->next;
            //previous = current; [an equivalent statement]
        }
        current = previous->next;
    }
}

如果您想创建一个新节点并使其成为列表的头部,则可以采用另一种方法。

void sortlist(node *head) {
    if (head == NULL) {
        printf("Empty list \n");
    }
    node *current = head->next;
    node *previous = head;
    while(current != NULL){
        if(current->data % 2 == 0){
            previous->next = current->next;
            node* new_node = (struct node*) malloc (sizeof (struct node));
            new_node->data = current->data;
            new_node->next = head;
            head = new_node;
        } else{
            previous = previous->next;
        }
        current = current->next;
    }
}

更新:我已验证了两个代码段。它的工作!

答案 1 :(得分:0)

这还不够:当您将节点移动到头部时,您还需要将之前的指向 next 。由于您的列表仅在一个方向上链接,因此您需要跟踪其先前的内容。

此外,像这样发送按值的头指针不会在调用者中更改它,因此调用者将松开对列表头部的跟踪。因此,您需要以可以修改和检索的方式传递头指针,即发送指向该指针的指针:

for index in range(0, df.shape[0]):
    for column in range(1, df.shape[1]): # from 1 not from 0 because I only need # to compare the 2nd to the last cell of each row with the 1st cell in the row 

        if df.iloc[index][column] - df_BDE_n_months_avg_std_pct.iloc[index][0] > 0:
            then "PLEASE PUT YOUR HELP HERE, I NEED A PIECE OF CODE THAT CAN HIGHLIGHT THE CELL"
        else:
            "DO NOTHING"

答案 2 :(得分:0)

目前尚不清楚为什么你跳过头部并从头开始 - >接下来。

头节点也应该通过引用传递,因为在函数中更改了头部。

输出列表为空的消息是没有意义的,因为调用者可以在调用函数之前检查自己是否列表是空的吗?

该功能可以按以下方式查看

void sortlist(node **head)
{
    for (node **current = head; *current != NULL; )
    {
        if ((*current)->data % 2 == 0 && current != head)
        {
            node *tmp = *current;
            *current = (*current)->next;
            tmp->next = *head;
            *head = tmp;
        }
        else
        {
            current = &(*current)->next;
        }
    }
}

例如,如果列表包含以下子句

0 1 2 3 4 5 6 7 8 9

然后在调用函数后,它将看起来像

8 6 4 2 0 1 3 5 7 9