如何对此自定义C 列表类实现删除函数
How can I implement a remove function to this custom C++ List class?
我有一个称为 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;
}
首先,您的循环条件应为 eachI->nextItem->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 deletedn";
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
相关文章:
- unique_ptr实现接口时对已删除函数的引用
- 如何实现删除数组的功能?
- 使用空实现重写删除运算符
- 为什么这个新的 [ ] 和删除 [ ] 实现会分解为 12 >整数?
- 如何实现链表并允许用户选择要使用 C++ 删除的特定节点?
- 带有AUTOMOC的CMake正在删除我的实现
- 内部源代码 - 在链接列表实现中插入元素上的删除会破坏整个应用程序
- 如何对此自定义C 列表类实现删除函数
- 实现unique_ptr:删除未分配的对象
- C++ 二叉树实现 - 删除指针原因
- 在 avl 树中实现删除过程
- C++标准库:实现从链表中删除恒定时间
- 使用运算符重载(新建/删除)实现单例的优缺点
- 在C++中实现哈希表(插入和延迟删除)
- 不实现和删除常用运算符有什么区别
- 尝试实现一个函数以删除链表中的结构,同时将它前面的结构分配给它后面的结构
- 如何使用hashtable在最小堆上实现O(1)删除
- GOF复合设计模式CompositeObject::删除C++中的递归实现
- 如何实现 C "classes" 的 C++11 冒名顶替者的运算符删除?
- 如何正确实现返回ref的运算符重载,以便轻松删除它们的工件