C++ C++;添加方法逻辑
我一直在想我哪里出了问题。我的add方法无法检测是否添加了两次相同的学生。P.s列表指向容器的头部C++ C++;添加方法逻辑,c++,linked-list,containers,C++,Linked List,Containers,我一直在想我哪里出了问题。我的add方法无法检测是否添加了两次相同的学生。P.s列表指向容器的头部 int add(Student* s) { Container *follow = list; Container *newNode = new Container; newNode->student = s; if (list == NULL) { newNode->next = NULL; list =
int add(Student* s)
{
Container *follow = list;
Container *newNode = new Container;
newNode->student = s;
if (list == NULL)
{
newNode->next = NULL;
list = newNode;
//cout << "Student Added!";
return 1;
}
else if (s->getFirstName().compare(list->student->getFirstName()) == 0) //duplication check
{
if (s->getLastName().compare(list->student->getLastName()) == 0) //Same Student
{
free(newNode->student); //Memory Mangment
free(newNode);
// cout << "Student Exist!";
return 0;
}
}
else //adding at the beginning of the list
{
newNode->next = list;
list = newNode;
// cout << "Student Added!";
return 1;
}
Container* temp = list->next;
while (temp != NULL) // inserting inbetween 2 nodes in the list
{
if (s->getFirstName().compare(list->student->getFirstName()) == 0)
{
if (s->getLastName().compare(list->student->getLastName()) == 0) //Same Student
{
free(newNode->student); //Memory Mangment
free(newNode);
// cout << "Student Exist!";
return 0;
}
}
else
{
newNode->next = list;
list = newNode;
// cout << "Student Added!";
return 1;
}
follow = temp;
temp = temp->next;
}
follow->next = newNode; // inserting at the end of the list
return 1;
}
while
循环逻辑指出,除其他外,如果新学生的名字与现有第一个节点中的名字不同,则只需插入它。while循环正在执行以下操作:
-如果学生的名字不同于循环的第一个元素-->添加学生
-否则,如果名字相同,姓氏相同-->退出
-否则,如果名字相同而姓氏不同-->则转到下一个元素
这意味着在列表的第一个元素上,如果该元素的名称与要添加的学生的名称不同,则将添加该学生,而不管列表的内容如何
例如:
当前名单:[本·本森、杰克·杰克逊、约翰·约翰逊]
你计划加入杰克·杰克逊。
第一次检查将发现“ben”不等于“jack”,并继续添加“jack jackson”
解决方案:
-逐个检查列表中的元素,直到找到您的学生或您到达列表的末尾。(这将是您的while循环。)
-在while循环之后,如果找不到学生,则添加学生。Re`\u CONTAINER\u H``请注意,标识符以下划线开头,后跟大写字母,保留给实现。对于
std::string
,您可以在C++11之后使用=
,而不是compare
调用,与NULL
不同的是,一般首选使用nullptr
:这就是为什么它被引入的原因,尽管我们已经有了NULL
。提示:在发布代码之前,您可以使用程序员的编辑器或类似Astyle的独立免费工具格式化代码。而不是int
,0
和1
要表示布尔值,可以使用bool
、false
和true
。我将两个if语句组合在一起
Container* follow = list;
Container* newNode = (Container*) malloc(sizeof(Container));
newNode->student = s;
newNode->next = NULL;
if (list == NULL) // inserting into an empty list
{
list = newNode;
return 1;
}
while (list != NULL)
{
if (search(s) == NULL)
{
newNode->next = list;
list = newNode;
return 1;
}
else if (search(s) != NULL)
{
free(newNode->student); //Memory Mangment
free(newNode);
// cout << "Student Exist!";
return 0;
}
}
Student* search(Student* s)
{
Container *traverser = list;
while (traverser != NULL)
{
if (traverser->student->getFirstName() == s->getFirstName() && traverser->student->getLastName() == s->getLastName())
return traverser->student;
traverser = traverser->next;
}
return NULL;
}