使用for循环在基于数组的列表中实现删除

时间:2016-06-02 10:42:04

标签: c++ for-loop data-structures

我正在编写一个代码,使用类和模板在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.也就是说,这个函数只调用一次。我尝试了几个方法来解决问题,但那些没有用。如果有人在我的代码中选择了错误或错误,我真的很感激。

2 个答案:

答案 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;
}