C ++添加方法逻辑

时间:2016-03-28 03:16:59

标签: c++ linked-list containers

我一直想弄清楚我哪里出错了。我的添加方法没有检测到同一个学生是否被添加两次。 P.s 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;


}

我将代码修改为以下内容,但我仍然遇到运行时错误。

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

2 个答案:

答案 0 :(得分:0)

while循环逻辑说,除其他外,如果新学生的名字与现有第一个节点中的第一个名字不同,那么只需插入它即可。

答案 1 :(得分:0)

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

这意味着在列表的第一个元素名称与您要添加的学生名称不同的名称上,无论列表的内容如何,​​都会添加学生。

实施例: 当前名单:[Ben benson,jack jackson,john johnson] 你计划添加杰克杰克森。 第一次检查会发现&#34; ben&#34;不等于&#34; jack&#34;并继续添加&#34; jack jackson&#34;。

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