C++ C++;添加方法逻辑

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 =

我一直在想我哪里出了问题。我的add方法无法检测是否添加了两次相同的学生。P.s列表指向容器的头部

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;
 }