如何防止用户在链接列表中输入重复值



我一直在想如何防止用户输入重复的值,老实说,我很难找到一个答案,一旦我看到它,可能真的很简单,但我做不到。下面是函数和结构节点。如果有人能在这里帮我,我将不胜感激。

struct node {
int data = -1;
node * current;
node * next;
};
node * start = NULL;

```
void addNode(struct node & n) {
if (n.data == -1) {
cout << "List not created yet." << endl;
} else {
node * temp;
node * temp2;
temp = new node;
cout << "What number would you like to enter:" << endl;
cin >> temp -> data;
cout << endl;
int value;
value = temp -> data;
temp = start;
while (temp != NULL) {
if (temp -> data == value) {
cout << "Duplicate Number!" << endl;
} else {
temp = temp -> next;
}
temp = temp -> next;
}
if (start == NULL) {
start = temp;
} else {
temp2 = start;
while (temp2 -> next != NULL) {
temp2 = temp2 -> next;
}
temp2 -> next = temp;
}
}
} 

以下是关于您的代码的一些备注:

  • 不要使start成为全局变量。相反,使其成为main的本地,并将其作为参数传递给addNode函数

  • 使用nullptr而不是NULL

  • 不要在addNode函数中要求用户输入。根据关注点分离的原则,将I/O方面保留在该功能之外。

  • 相反,将值作为参数传递给addNode

  • 当一个节点的值为-1时,您应该区别对待它。空列表不是一个节点值为-1的列表。空列表是一个空指针。

  • 即使列表为空,也应该可以添加具有此功能的第一个节点

  • 使用更具描述性的变量名称。对于CCD_ 9实例的CCD_。CCD_ 10和CCD_。其中一个是新创建的节点,因此可以将其命名为newNode

  • 创建新节点并将其引用指定给temp后,将使用temp = starttemp指定一个新值,因此丢失(并泄漏(了新创建的节点。

  • 在循环中,当值不匹配时,将执行temp = temp->next两次。当然,每次迭代只能执行一次。

  • 即使您的代码发现重复并输出消息,它仍然会继续这个过程。相反,您应该停止进程,而不是创建节点(或者,如果您已经这样做了:用delete处理它(。

  • 遗憾的是,您需要从一开始就再次遍历列表,以找到最后一个节点并将新节点附加到那里。您应该能够在查找重复项的第一个循环中做到这一点。

这里有一个更正:

bool addNode(node* &start, int value) {
node * current = start;
if (start != nullptr) {
while (current->data != value && current->next != nullptr) {
current = current->next;
}
if (current->data == value) {
return false; // duplicate!
}
}
node* newNode = new node;
newNode->data = value;
if (start != nullptr) {
current->next = newNode;
} else {
start = newNode;
}
return true;
} 

请注意,此函数返回一个布尔值:如果true,则节点已插入。另一个案例意味着存在重复。

你的主要功能可能是这样的:

int main() {
// define start as local variable
node * start = nullptr; // Use nullptr instead of NULL
while (true) {
int value;
// Don't do I/O together with list-logic
cout << "What number would you like to enter:" << endl;
cin >> value;
cout << endl;
if (value == -1) break;
if (!addNode(start, value)) {
cout << "Duplicate Number!" << endl;
}
}
}

相关内容

  • 没有找到相关文章

最新更新