我无法弄清楚如何将元素插入到排序列表中。我是链接列表的新手,我仍然遇到问题。以下函数将预定义列表和元素作为参数。我有白色登上了整件事,但我仍然无法弄明白。谢谢你的帮助。
/*
* 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;
}
答案 0 :(得分:0)
一般来说,链接列表包含"节点"通过从每个节点指向下一个节点(或前一个节点或两者)的链接按顺序连接在一起。每个节点也(也许是平凡的)指向列表的一个实际元素。
要将元素插入到给定位置的链接列表中,只需创建指向该元素的节点,然后根据需要更新其他指针。使用像你这样的双向链表(每个节点都指向下一个节点和前一个节点),你必须
next
指针,指向新节点,prev
指针,指向新节点,prev
和next
指针设置为指向其他节点。通常会在列表的开头或结尾插入特殊情况;细节取决于您的列表和节点实现。
在您的情况下,您还必须找到合适的插入点。由于列表已排序,您可以从头开始遍历它,将每个节点的元素与要插入的元素进行比较,直到找到正确的位置。这样的线性搜索"如果列表很长,则效率不是很高,但使用通用链表无法做得更好。
答案 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;
}
}