我试着编写一个带随机列表并对其进行排序的函数(在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;
}
}
答案 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