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

Re'_CONTAINER_H_'请注意,以下划线和大写字母开头的标识符保留给实现。 –

+0

而不是'比较'调用,对于'std :: string',你可以使用'=='。 –

+0

在C++ 11之后,而不是'NULL',一般的首选是使用'nullptr':这就是它的原因,即使我们已经有了'NULL',为什么它被引入。 –

while循环逻辑说,除其他事项外,如果新的学生的名字比现有的第一个节点的名字不同,那么就插入。

+0

我将2个if语句组合在一起 – SUser

您的while循环正在执行以下操作: - 如果学生的名字与循环的第一个元素不同 - > add student - 否则如果名字相同且姓氏相同 - >退出 - 否则如果名字相同且姓氏不同 - >转到下一个元素。

这意味着,在列表的第一个元素名称与要添加的学生名称不同的第一个元素上,学生将被添加,而不管列表的内容如何。

示例: 当前列表:[Ben benson,jack jackson,john johnson] 您计划添加jack jackson。 第一次检查会发现“ben”不等于“jack”并继续添加“jack jackson”。

解决方案: - 逐个检查列表中的元素,直到找到您的学生或您到达列表的末尾。 (这将是你的while循环。) - 经过while循环后,如果找不到学生,请添加学生。