首頁  >  問答  >  主體

数据结构 - C++删除表中相同元素,循环问题在哪?

template <class T>
bool SeqList<T>::Delsame(T x)
{
    int i,j;
    for(int j=1;j<n+1;j++)
    {
        if (elements[j-1]==x)
        {
            for (int i=j-1;i<n;i++)
                {
                    elements[i]=elements[i+1];
                }
             n--;
        }
    }
    return true;
}

删除表中相同元素部分的代码,当表中所需删除元素只有1个的时候,运行正常.当所需删除元素有多个的时候,运行结果正确,但是会提示.exe已停止工作,所以想知道循环问题在哪??

ringa_leeringa_lee2765 天前664

全部回覆(2)我來回復

  • ringa_lee

    ringa_lee2017-04-17 15:35:52

    n代表的是順序表元素個數嗎?如果是的話elements[i+1]這一句會取到elements[n]的,越界了。
    BTW,第一個循環為什麼直接j++?如果刪除了一個元素,後面的往前移了,還進行j++,那豈不是會跳過一個元素。
    你試一下兩個相鄰的相同元素能不能刪除。

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 15:35:52

    樓上已經指出了錯誤,我來嘗試給出一個正確的實現

    int find(int lo,int hi,const T& e){
        while(lo<hi--&&elem[hi]!=e);
        return hi;//若失败返回lo-1
    }
    void remove(int lo,int hi){
        while(hi<size) elem[lo++]=elem[hi++];
    }
    void deduplication(){
        int i=1;
        while(i<size){
            (find(0,i,elem[i])<0)?
                i++:remove(i);
        }
    }

    回覆
    0
  • 取消回覆