将元素插入到排序列表中

时间:2014-12-05 17:09:36

标签: c insert linked-list sorted

我无法弄清楚如何将元素插入到排序列表中。我是链接列表的新手,我仍然遇到问题。以下函数将预定义列表和元素作为参数。我有白色登上了整件事,但我仍然无法弄明白。谢谢你的帮助。

/*
 * function:  lst_insert_sorted
 *
 * description:  assumes given list is already in sorted order
 *     and inserts x into the appropriate position
 *     retaining sorted-ness.
 * Note 1:  duplicates are allowed.
 *
 * Note 2:  if given list not sorted, behavior is undefined/implementation
 *      dependent.  We blame the caller.    
 *      So... you don't need to check ahead of time if it is           sorted.
 */

void lst_insert_sorted(LIST *l, ElemType x) {
    NODE *p = l->front;
    NODE *temp;
    NODE *current = p;
    NODE *prev;
    NODE *next;

    if (p->val >= x) { // Base Case if
        p->val = x;
    }

    while (p !=NULL) {
        prev = current;
        temp = prev->next;
        next = current->next;

        if (next->val >= x) {
            temp->val = x;
        }

    }

    return 0;
}

3 个答案:

答案 0 :(得分:0)

一般来说,链接列表包含"节点"通过从每个节点指向下一个节点(或前一个节点或两者)的链接按顺序连接在一起。每个节点也(也许是平凡的)指向列表的一个实际元素。

要将元素插入到给定位置的链接列表中,只需创建指向该元素的节点,然后根据需要更新其他指针。使用像你这样的双向链表(每个节点都指向下一个节点和前一个节点),你必须

  • 更新紧接插入位置之前的节点的next指针,指向新节点,
  • 在插入位置后紧跟更新节点的prev指针,指向新节点,
  • 将新节点的prevnext指针设置为指向其他节点。

通常会在列表的开头或结尾插入特殊情况;细节取决于您的列表和节点实现。

在您的情况下,您还必须找到合适的插入点。由于列表已排序,您可以从头开始遍历它,将每个节点的元素与要插入的元素进行比较,直到找到正确的位置。这样的线性搜索"如果列表很长,则效率不是很高,但使用通用链表无法做得更好。

答案 1 :(得分:0)

if (p->val >= x) { // Base Case if
    p->val = x;
}

存在丢失数据,因此您将x写入并覆盖列表中的第一个数据。 İfı明白了你应该创建一个节点并将其插入列表的问题。

答案 2 :(得分:0)

您没有显示如何定义NODE。所以我想这个列表是一个单链表。在这种情况下,该函数可能看起来像

void lst_insert_sorted( LIST *l, ElemType x ) 
{
    NODE *current = l->front;
    NODE *prev = NULL;

    while ( ( current != NULL ) && !( x < current->val ) )
    {
        prev = current;
        current = current->next;
    }

    NODE *node = malloc( sizeof( NODE ) );
    node->val = x;

    node->next = current;
    if ( prev != NULL )
    {
        prev->next = node;
    }
    else
    {
        l->front = node;
    }
}