C ++按排序顺序添加到链接列表

时间:2011-01-28 05:06:57

标签: c++ list linked-list

您好我有一个使用结构的链表。现在我得到它在最后添加每个元素。但是,我想根据ID按排序顺序添加每个元素。该结构有两个元素:字符串名称和长ID。

node* temp = new node;
temp->name = nameRead;
temp->id = idRead;

//check if first item, if so add as head
if(head == NULL)
{
    head = temp;
}
else
{
   node* temp2 = head;
   while(temp2->next != NULL)
   {
      temp2 = temp2->next;
   }
   temp2->next = temp;
}

3 个答案:

答案 0 :(得分:12)

node* temp = new node;
temp->name = nameRead;
temp->id = idRead;

node* temp2 = head;
node** temp3 = &head;
while(temp2 != null && temp2->id < temp->id)
{
   temp3 = &temp2->next;
   temp2 = temp2->next;
}
*temp3 = temp;
temp->next = temp2;

编辑:说明:'temp3'指针指向'temp'需要去的地方。将temp2初始化为head,并保持循环直到我们到达列表的末尾,或者直到temp2的id为&gt; =而不是temp的id。在循环的每次迭代中,前进temp3和temp2。

在循环结束时,'temp3'将保存指针所在的地址。因此,指定* temp3指向temp,并指定temp-&gt;旁边指向temp2(此时它将为null,或者指向id大于temp-&gt; id的项目)。

答案 1 :(得分:2)

对代码的大多数修改都非常简单 - 只需添加基于ID的比较,这样您只需遍历列表,直到到达ID大于您需要插入的新节点的节点(或到达列表的末尾。)

这就是事情变得有点棘手的事情:在你“意识到”你已经到达列表中的正确位置之前,你已经离开了一个节点太远了(在一个单链表中,没有办法回去)。修复它的技巧非常简单:分配一个新的(空)节点并在找到的太大的节点之后插入它。将过大的节点内容复制到刚插入的新节点中,然后将新节点的数据复制到刚刚腾出的位置。

但是,我应该补充一点,所有这些都是一个有争议的问题。如果你想要一个有序的项目集合,链表往往是一个非常糟糕的选择。除非你做了类似家庭作业的事情,否则你别无选择,只能做任何已被分配的脑死亡废话,请查看std::set [编辑:或std::multiset,如果允许重复 - 或者可能是std::mapstd::multimap,如果您希望能够根据ID找到节点]而忘记自己实施它。

答案 2 :(得分:2)

取自我的学生笔记本:

void addSorted(node * head, int id){
        node* newNode = new node;
        newNode->number = n;
        newNode->next = NULL;

        if(head == NULL || head->number >= id   ){
            newNode->next = head;
            head = newNode;
            return;
        }else if(head->next != NULL && head->next->id >= id){
            node * nextNode = head->next;
            newNode->next = nextNode;
            head->next = newNode;
            return;
        }else{
            node * left;
            node * right = head;
            while(right != NULL && right->next->id <= id){
                left = right;
                right = right->next;
            }
            left->next=newNode;
            newNode->next = right;
        }
    }