【发布时间】:2020-10-20 03:43:06
【问题描述】:
我正在尝试创建一个不插入重复项的排序双向链表,但我无法找到一种方法来执行此操作。我查看了有关如何删除重复项的帖子,但没有查看有关防止重复插入的帖子。
这是我必须在不拒绝重复的情况下插入和排序的代码。参数 dataIn 从 main (Student s = {{gpa, name}, ..., {gpa, name}} 中的预定义学生对象列表中获取值:
void StudentList::insertNode(Student dataIn)
{
ListNode *newNode; // A new node pointer
ListNode *pCur; // To traverse the list
// Allocate a new node and store num there.
newNode = new ListNode;
newNode->stu = dataIn;
newNode->forw = NULL;
newNode->back = NULL;
//Check if there is node in list
if(head ->forw == NULL && head->back == NULL){
head->forw = newNode;
newNode->back = head;
newNode->forw = head;
head->back = newNode;
}
else{
// Initialize pointers
pCur = head->forw;
// Find location: skip all nodes whose name is less than dataIn's name
while (pCur != head && pCur->stu.name < dataIn.name)
{
pCur = pCur->forw;
}
// Insert the new node between pPre and pCur
ListNode *pPre = pCur->back; // The previous node
newNode->back = pPre;
newNode->forw = pCur;
pCur->back = newNode;
pPre->forw = newNode;
}
// Update the counter
count++;
}
有谁知道拒绝重复而不删除的方法?谢谢大家!
【问题讨论】:
-
当您尝试某事但它不起作用时,请不要再问“什么是 XYZ 的最佳方式”。相反,问一个关于实际问题的问题。如果有更好的方法,有人可能会在确定您的问题的同时指出这一点。
-
第 1 步是编写一个
bool StudentList::contains(const Student & s) const方法,如果列表中已经存在等于s的Student,则返回 true。第二步是将if (contains(dataIn)) return;添加到insert()方法的顶部。 -
在
while (pCur != head && pCur->stu.name < dataIn.name)循环结束时,有三种可能。 1)pCur == head- 你绕了一圈,dataIn.name比所有其他名字都小; 2)pCur->stu.name > dataIn.name- 你找到了插入新名字的地方; 3)pCur->stu.name == dataIn.name- 已经存在同名节点,dataIn是重复的,应该被拒绝。您不需要任何额外的数据结构。 -
当您“检查列表中是否有节点”时,您在插入第一个节点之前执行
if(head ->forw == NULL) ...但不是head == NULL?如果是,你不能做head->forw或head->back。 -
“这就是插入发生的地方”——不完全是,当您更新
back和forw指针时,插入发生在 while 循环之后。但无论哪种方式都没有关系:while 循环找到了应该插入节点的位置,所以你可以在那个时刻(在更新 pCur 之后,或者在 while 循环之后)检查你是否找到了一个相等的节点。跨度>
标签: c++ vector iterator duplicates doubly-linked-list