我尝试按正数开头和负数结尾时对链表进行排序,但我想保留原始顺序

例如,我输入:3,1,4,6,7,8。

这就是我想要的:4,6,8,3,1,7。

但这就是我得到的:4,6,8,7,1,3

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>



typedef struct node{
    int number;
    struct node *nextPtr;
} node;


node* insert(node* head, int num) {
    node *temp, *prev, *next;
    temp = (node*)malloc(sizeof(node));
    temp->number = num;
    temp->nextPtr = NULL;
    if (!head){
        head = temp;
    }
    else{
        prev = NULL;
        next = head;
        while (next && next->number % 2 == 0){
            prev = next;
            next = next->nextPtr;
        }
        if (!next){
            prev->nextPtr = temp;
        }
        else{
            if (prev) {
                temp->nextPtr = prev->nextPtr;
                prev->nextPtr = temp;
            }
            else {
                temp->nextPtr = head;
                head = temp;
            }
        }

        return head;
    }
}

void free_list(node *head) {
    node *prev = head;
    node *cur = head;
    while (cur) {
        prev = cur;
        cur = prev->nextPtr;
        free(prev);
    }
}

int main(){

    node *head, *p;
    head = NULL;

    head = insert(head, 3);
    head = insert(head, 1);
    head = insert(head, 4);
    head = insert(head, 6);
    head = insert(head, 7);
    head = insert(head, 8);

    p = head;
    while (p) {
        printf("%d ", p->number);
        p = p->nextPtr;
    }
    free_list(head);
    return 0;
}

最佳答案

问题

列表中最后一个偶数之后将插入任何奇数。
这实际上意味着,奇数子列表按相反的顺序出现。

补救

调整insert如下:



    while (next && next->number % 2 == 0){
        prev = next;
        next = next->nextPtr;
    }




    if ( num % 2 == 1 ) {
        while (next){
            prev = next;
            next = next->nextPtr;
        }
    }


改善

为了提高效率和代码可维护性,甚至更好的办法是保留两个last子列表指针或2个链接列表,而不是放在首位。一旦两个子列表都至少有一个条目,您始终可以通过简单地链接各部分来创建一个综合列表。

警告

这可能不是OP想要的。她的问题模棱两可,可能使用了错误的用语。

关于c - 正数优先时对链表进行排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34039340/

10-10 21:30