C++添加方法逻辑
问题描述:
我一直在试图弄清楚我出错的地方。我的add方法不检测同一个学生是否添加了两次。 P.s列表指向容器的头部。C++添加方法逻辑
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;
}
我修改了下面的代码,但我仍然收到运行时错误。
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;
}
}
以下是搜索的执行情况 //此功能已经为您执行。如果请求的学生不在列表中,则返回NULL。
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;
}
答
您的while循环正在执行以下操作: - 如果学生的名字与循环的第一个元素不同 - > add student - 否则如果名字相同且姓氏相同 - >退出 - 否则如果名字相同且姓氏不同 - >转到下一个元素。
这意味着,在列表的第一个元素名称与要添加的学生名称不同的第一个元素上,学生将被添加,而不管列表的内容如何。
示例: 当前列表:[Ben benson,jack jackson,john johnson] 您计划添加jack jackson。 第一次检查会发现“ben”不等于“jack”并继续添加“jack jackson”。
解决方案: - 逐个检查列表中的元素,直到找到您的学生或您到达列表的末尾。 (这将是你的while循环。) - 经过while循环后,如果找不到学生,请添加学生。
Re'_CONTAINER_H_'请注意,以下划线和大写字母开头的标识符保留给实现。 –
而不是'比较'调用,对于'std :: string',你可以使用'=='。 –
在C++ 11之后,而不是'NULL',一般的首选是使用'nullptr':这就是它的原因,即使我们已经有了'NULL',为什么它被引入。 –