我一直在想如何防止用户输入重复的值,老实说,我很难找到一个答案,一旦我看到它,可能真的很简单,但我做不到。下面是函数和结构节点。如果有人能在这里帮我,我将不胜感激。
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 = start
为temp
指定一个新值,因此丢失(并泄漏(了新创建的节点。 -
在循环中,当值不匹配时,将执行
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;
}
}
}