插入排序链接列表时保持最小值

时间:2015-05-31 12:05:36

标签: c

我正在尝试按排序方式将节点插入到链接列表中, 并保持列表的TAIL和HEAD(最小和最大)

这是我的代码:

void sortedInsert(AutoMotor **head, AutoMotor *new_car)
{
    AutoMotor* current;
    /* Special case for the head end */
    if (*head == NULL || (*head)->id >= new_car->id)
    {
        new_car->next = *head;
        *head = new_car;
    }
    else
    {
        /* Locate the node before the point of insertion */
        current = *head;
        while (current->next != NULL && current->next->id < new_car->id)
        {
            current = current->next;
        }
        int MAX = current->id;
        new_car->next = current->next;
        current->next = new_car;
    }
    printf("new car add successfully to M\n\n");
}

如何提取min&amp;这个函数的最大值(在O(1)中)(我想打印它们)?

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

您可以为旧的最小值和旧的最大值(指针或引用)添加两个参数,并在每次插入时更新它们。

根据狮子座编辑评论:

void sortedInsert(AutoMotor **head, AutoMotor *new_car, AutoMotor **min, AutoMotor **max)
{
    AutoMotor* current;
    /* Special case for the head end */
    if (*head == NULL || (*head)->id >= new_car->id)
    {
        new_car->next = *head;
        *head = new_car;
        *min = *head;
    }
    else
    {
        /* Locate the node before the point of insertion */
        current = *head;
        while (current->next != NULL && current->next->id < new_car->id)
        {
            current = current->next;
        }
        //int MAX = current->id;
        new_car->next = current->next;
        current->next = new_car;
        if ( current->next == NULL )
        {
            *max = current;
        }
    }
    printf("new car add successfully to M\n\n");
}

答案 1 :(得分:0)

根据您在问题中提供的信息,最能帮助您的数据结构是AVL树: 插入新值需要O(log(n)),删除和查找它也是如此。 此外,您需要在侧面保存该AVL树,每次向树中插入新值时,都会向链表中添加一个新节点(以便链表和AVL树中的节点数为你只需在树上进行in order遍历,然后在O(n)中以排序的方式为你提供值,意味着,插入新元素并获取排序列表需要O(log(n)) + O(n) = O(n) 如果你能想到它,那么为了获得O(1)中的最小值和最大值现在非常容易(如果你有一个排序的元素,我确定你已经想到它了。)

Here是我几周前制作的C ++中AVL树的一个实现,你可以就任何问题与我联系