我正在编写一个代码,使用类和模板在C ++中实现基于Array的List。 这是代码:
template <typename T>
struct ArrayList
{
T arr[LIST_LEN];
int curPos;
int numOfData;
};
//declare base class
template <typename T>
class ListObj
{
public:
ListObj(ArrayList<T>* plist);
void insert(ArrayList<T>* plist, T data);
T remove(ArrayList<T>* plist);
int cnt(ArrayList<T>* plist);
};
//declare members
template <typename T>
ListObj<T>::ListObj(ArrayList<T>* plist)
{
plist->curPos = -1;
plist->numOfData = 0;
}
template <typename T>
void ListObj<T>::insert(ArrayList<T>* plist, T data)
{
if (plist->numOfData >= LIST_LEN)
{
cout << "Out of Capacity!" << endl;
return;
}
plist->arr[plist->numOfData] = data;
plist->numOfData++;
}
template <typename T>
T ListObj<T>::remove(ArrayList<T>* plist)
{
int rpos = plist->curPos;
int num = plist->numOfData;
T rdata = plist->arr[rpos];
for (int i = rpos; i < num - 1; i++)
plist->arr[i] = plist->arr[i + 1];
plist->numOfData--;
plist->curPos--;
return rdata;
}
template <typename T>
int ListObj<T>::cnt(ArrayList<T>* plist)
{
return plist->numOfData;
}
//miscellaneous functions
template <typename T>
bool LFirst(ArrayList<T>* plist, T* pdata)
{
if (plist->numOfData == 0)
return false;
plist->curPos = 0;
*pdata = plist->arr[0];
return true;
}
template <typename T>
bool LNext(ArrayList<T>* plist, T* pdata)
{
if (plist->curPos >= plist->numOfData - 1)
return false;
plist->curPos++;
*pdata = plist->arr[plist->curPos];
return true;
}
而且,这是main函数的代码。
int main(void)
{
//initialization
ArrayList<int> list;
ListObj<int> l(&list);
int data;
//insert 5 integers
l.insert(&list, 11);
l.insert(&list, 22);
l.insert(&list, 22);
l.insert(&list, 33);
l.insert(&list, 44);
//show the number of data in array
cout << "Current # of Data:" << l.cnt(&list) << endl;
for (int i = 0; i < list.numOfData; i++)
{
cout << list.arr[i] << endl;
}
cout << endl;
//delete certain data value
if (LFirst(&list, &data))
{
if (data == 22)
l.remove(&list);
while (LNext(&list, &data))
{
if(data==22)
l.remove(&list);
}
}
cout << "Current # of Data:" << l.cnt(&list) << endl;
for (int i = 0; i < list.numOfData; i++)
{
cout << list.arr[i] << endl;
}
cout << endl;
system("pause");
return 0;
}
此代码按我的意图运行。但我使用for-loop更改了remove()的代码。
template <typename T>
T ListObj<T>::remove(ArrayList<T>* plist,T target)
{
for (int i = 0; i < plist->numOfData; i++)
{
if (plist->arr[i] == target)
{
int rpos = i;
int num = plist->numOfData;
T rdata = plist->arr[rpos];
for (int i = rpos; i < num - 1; i++)
plist->arr[i] = plist->arr[i + 1];
plist->numOfData--;
return rdata;
}
}
}
所以,上面的函数会像这样被调用; l.remove(&amp; list,22); // 22是目标值
在此代码中,应该调用remove()函数两次以删除目标数据(在本例中为22)。 因此,如果代码正常工作,结果应该是11 33 44.但结果是11 22 33 44.也就是说,这个函数只调用一次。我尝试了几个方法来解决问题,但那些没有用。如果有人在我的代码中选择了错误或错误,我真的很感激。
答案 0 :(得分:1)
我刚刚解决了问题。我的错误是迭代器的错误应用。所以我改变了这样的循环,得到了我想要的结果。
template <typename T>
T ListObj<T>::remove(ArrayList<T>* plist,T target)
{
for (int i = plist->numOfData; i >0; i--)
{
if (plist->arr[i] == target)
{
int rpos = i;
int num = plist->numOfData;
rdata = plist->arr[rpos];
for (int i = rpos; i < num - 1; i++)
plist->arr[i] = plist->arr[i + 1];
plist->numOfData--;
}
}
}
我非常感谢大家给我的建议和提示。
答案 1 :(得分:0)
删除第一个元素后的remove
方法return
。我不是百分百肯定,但我认为你应该改为:
template <typename T>
T ListObj<T>::remove(ArrayList<T>* plist,T target)
{
T rdata;
for (int i = 0; i < plist->numOfData; i++)
{
if (plist->arr[i] == target)
{
int rpos = i;
int num = plist->numOfData;
rdata = plist->arr[rpos];
for (int i = rpos; i < num - 1; i++)
plist->arr[i] = plist->arr[i + 1];
plist->numOfData--;
}
}
return rdata;
}