【问题标题】:How can I implement a remove function to this custom C++ List class?如何为此自定义 C++ List 类实现删除功能?
【发布时间】:2017-04-22 13:09:56
【问题描述】:

我有一个名为 myList 的自定义列表,其工作方式如下:

// creating and adding:
myList<int> numbers;
numbers.add(10);
numbers.add(20);

// listing each item:
int n
while (numbers.nextItems(n)) {
        std::cout << m;
}

这是myList的源代码:

template<class T>
class myList
{

    struct eachItem
    {
        T  data;
        eachItem *nextItem;

        eachItem(eachItem *p = NULL)
        {
            nextItem = p;
        }

    }; // end of eachItem

    eachItem *beginning;
    eachItem *current;

    myList(const myList&);

public:
    myList()
    {
        current = beginning = new eachItem;
    }

    void add(const T& dat);
    bool nextItems(T& dat);

    ~myList();
};


template <class T>
myList<T>::~myList()
{
    eachItem *p;
    while ((p = beginning) != NULL)
    {
        beginning = p->nextItem;
        delete p;
    }
}

template <class T>
void myList<T>::add(const T& dat)
{
    eachItem *eachI;

    for (eachI = beginning; eachI->nextItem != NULL; eachI = eachI->nextItem);

    eachItem *newList = new eachItem(*eachI);

    eachI->data = dat;

    eachI->nextItem = newList;
}

template <class T>
bool myList<T>::nextItems(T& dat)
{

    if (current->nextItem == NULL)
    {
        current = beginning;

        return(false);
    }

    dat = current->data;


    current = current->nextItem;

    return(true);
}

现在,我想为这个自定义列表类添加一个删除功能。我希望它像这样工作:

numbers.remove(10)

我尝试了很多不同的方法,但都无法奏效。

这是我的尝试:

template <class T>
void myList<T>::remove(const T& dat)
{
    eachItem *eachI;

    for (eachI = beginning; eachI->nextItem != dat; eachI = eachI->nextItem);

    eachItem *newList = new eachItem(*eachI);
    eachI->nextItem = newList;


    eachItem *eachI2; // from the deleted to the actual end

    for (eachI2 = eachI->nextItem; eachI2->nextItem != NULL; eachI2 = eachI2->nextItem);

    eachItem *newList2 = new eachItem(*eachI2);
    eachI2->nextItem = newList2;
}

【问题讨论】:

  • 展示你的尝试并解释他们的问题
  • 另外,请格式化您的代码 - 每行代码之间不需要这么多空格(使其更难阅读)
  • 对不起,原来的变量类型不是int,我只是为了更简单把它改成了int,我把删除的部分删掉了,对不起
  • 显示您的“不工作”删除代码。
  • 我现在添加了。

标签: c++ arrays list templates


【解决方案1】:

首先你的 for 循环条件应该是 eachI-&gt;nextItem-&gt;data!=dat 以便你比较数据,而不是比较下一个节点的地址和数据

void myList<T>::remove(const T& dat)
{
    //Special acse for deleting first node
    if(beginning!=NULL && beginning->data==dat)
    {
        eachItem *toDelete = beginning;
        beginning = beginning->nextItem;
        current = beginning;
        delete toDelete;
        return;
    }
    eachItem *eachI;

    for (eachI = beginning;eachI!=NULL && eachI->nextItem->data != dat; eachI = eachI->nextItem);
    //if eachI=NULL then data to be deleted is not found
    if(eachI==NULL)
    {
        cout<<dat<<" not found in this list, so not deleted\n";
        return;   //no further processing required.
    }

    //After this for eachI->nextItem will point to node that is to be deleted
    eachItem *toDelete = eachI->nextItem;
    //now remove link between eachI and toDelete
    //i.e. let eachI->next point to toDelete->nextItem
    eachI->nextItem = toDelete->nextItem;
    //Therefore skipping toDelete
    //Now tieing up loose ends(delete the node)
    delete toDelete;

}

同时改变你的添加功能

void myList<T>::add(const T& dat)
{

    if(beginning==NULL)
    {
        beginning = new eachItem;
        current=beginning;
        beginning->data = dat;
        return;
    }
    eachItem *eachI;
    for (eachI = beginning;eachI->nextItem != NULL; eachI = eachI->nextItem);
    eachItem *newList = new eachItem;

    newList->data = dat;

    eachI->nextItem = newList;
    newList->nextItem = NULL;
}

还有你的构造函数

myList()
{
    current = beginning = NULL;
}

主函数和输出

int main()
{
    myList<int> numbers;
    numbers.add(10);
    numbers.add(20);
    numbers.add(30);
    numbers.add(40);
    int m;
    while (numbers.nextItems(m)) {
        std::cout << m;
    }
cout<<"\n";
    numbers.remove(10);
    while (numbers.nextItems(m)) {
        std::cout << m;
    }
    cout<<"\n";
    numbers.remove(30);
    while (numbers.nextItems(m)) {
        std::cout << m;
    }
    return 0;
}

输出 10203040 203040 2040

我不知道它在哪里stucks in loop forever

【讨论】:

  • 你能把你的编辑注释写进你的代码吗?我只是有点困惑。
  • 谢谢,问题是如果我试图删除列表中的第一项,它就不起作用,如下所示:code myList&lt;int&gt;numbers; numbers.add(10); numbers.add(20); numbers.add(30); numbers.remove(10);
  • 在执行eachI-&gt;nextItem-&gt;data 之前,您需要检查eachI-&gt;nextItem 是否为空。
  • 添加了特殊情况。如果对您有帮助,请标记为答案。
  • 谢谢,但现在程序崩溃了,它会永远加载各种数字,如果我尝试删除第一个项目,它现在会一直处于卡住的循环中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 2022-08-19
  • 2011-10-30
  • 2019-09-18
  • 1970-01-01
相关资源
最近更新 更多