您好我有一个使用结构的链表。现在我得到它在最后添加每个元素。但是,我想根据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;
}
答案 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::map
或std::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;
}
}