c ++双向链表搜索和删除

时间:2014-05-14 19:02:10

标签: c++

我在查找列表中的节点时遇到问题,然后将其删除。我已经尝试了很多方法,但到目前为止这是我的代码。我不知道问题是在我的插入中还是在我的显示功能中?我几乎没有学到这一点。

void removeStudent(int id)
{
    node *trash = NULL;

    node *current = head;
    while ( current!= NULL)
    {
        if ( current->data.id == id)
        {
            trash = current;
            current->prev->next = current->next;
            current->next->prev = current->prev;
            delete trash;


        }
    }


}

这是我的插入功能

    void push(student s)
{

    node *tmp = new node;
    tmp->data = s;
    tmp->next = head;
    tmp->prev = NULL;

    if (head == NULL)
    {
        head = tmp;
        tail = tmp;
    }
    else
    {
        head->prev = tmp;
        head = tmp;
    }

}

这是我的显示功能

void display()
{
    node *current = head;

    while (current!=NULL)
    {
        cout << current->data.name << endl;
        cout << current->data.GPA << endl;
        cout << current->data.id << endl;
        cout << current->data.university << endl;
        current = current->next;
    }
}

3 个答案:

答案 0 :(得分:0)

node *trash = new node;
trash = current;

内存泄漏,因为你丢失了newin第一行分配的内存而你没有保留指向该内存的指针。您将指针trash指定为current

你应该这样做:

node *trash = NULL; // declare a pointer and set it to NULL

提示:

在处理列表时,为了测试您的代码,请使用纸张和铅笔,创建一个小列表,并在文件中运行从列表的开头和结尾修改(此处删除)节点的情况。

此外,当列表只有一个节点时会发生什么,以及当它是空的时会发生什么。

答案 1 :(得分:0)

循环结束时

current = current->next;

答案 2 :(得分:0)

尝试以下方法。我想你的类也包含数据成员tail。

void removeStudent( int id )
{
    node *current = head;

    while ( current != NULL && current->data.id != id ) current = current->next;

    if ( current != NULL )
    {
       if ( current->prev != NULL ) current->prev->next = current->next;
       else head = current->next;

       if ( current->next != NULL ) current->next->prev = current->prev;
       else  tail = current->prev;

       delete current;
    }
}

如果您的类没有数据成员尾,那么您必须删除语句

       else  tail = current->prev;

来自功能体。