我有一个名为 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;
}
答案 0 :(得分:1)
首先,你的for循环条件应为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 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;
}
OUTPUT 10203040 203040 2040
我看不到stucks in loop forever