分配大小无效。尝试合并阵列排序列表

时间:2014-11-09 18:05:34

标签: c++ data-structures dynamic-arrays

我必须开发两个功能。一个是应用程序级别函数,它合并使用动态数组实现的两个排序列表。另一个是相同的,除了它应该是一个成员函数。我得到无效的分配大小。当我跟踪函数时,它成功返回而没有错误购买,一旦我到达原始调用代码,我得到错误。这是两个函数的代码。

应用程序级别功能:

ArraySortedType&  merge(const ArraySortedType& list1, const ArraySortedType& list2)
{
    ItemType temp;
    ArraySortedType ret, list1Copy=list1, list2Copy=list2;
    list1Copy.ResetList();
    while (list1Copy.GetNextItem(temp) == Success)
        ret.InsertItem(temp);
    list2Copy.ResetList();
    while (list2Copy.GetNextItem(temp) == Success)
        ret.InsertItem(temp);
    return ret;
}

会员功能:

ArraySortedType& ArraySortedType::merge(const ArraySortedType& list)
{
    ArraySortedType s, copy = list;
    ItemType temp;
    copy.ResetList();
    while (copy.GetNextItem(temp) == Success)
        s.InsertItem(temp);
    for (int k = 0; k < length; k++)
        s.InsertItem(info[k]);
    return s;
}

我称之为函数的代码:

ArraySortedType u = merge(s, n);
//ArraySortedType k = merge(s, n);
cout << "Length of u is: " << u.LengthIs() << endl;
// cout << "Length of k is: " << k.LengthIs() << endl;

即使是注释掉的代码也无法正常工作。

还有很多代码用于实现我遗漏的ArraySortedType,因为我认为这是不必要的。其中大部分已经在实验室中提供。 InsertItem是由我实现的,并且使用了很多,所以我将它包含在这里:

Error_Code ArraySortedType::InsertItem ( ItemType item)
{
    if(!length)
    {
        info[0] = item;
        length++;
        return Success;
    }
    for(int i=0;i<=length;i++)
    {
        if(info[i].ComparedTo(item) != LESS || i==length)
        {
            for(int j=length;j>i;j--)
                info[j] = info[j-1];
            info[i]=item;
            length++;
            return Success;
        }
    }
    return Fail;
}

已经给出了GetNextItem()和ResetList(),所以他们不能解决问题,所以我会把它们留下来但只是告诉我它们是否是必需的。

我已经跟踪了他们两个并搜索了相当多的但这个问题让我挠头。任何帮助将不胜感激。

编辑:

我想有必要实现ArraySortedList。这里是。猜猜我真的不希望任何人真正经历过它:

//ArraySortedType.cpp
#include "ArraySortedType.h"

ArraySortedType::ArraySortedType (int max_items) 
{
    length =0; 
    MAX_ITEMS = max_items;
    currentPos =-1;
    try
    {
        info = new ItemType[MAX_ITEMS];
    }
    catch(std::bad_alloc exception)
    {
        //Severe problem, do not keep program running
        cout <<"Memory full "<< endl;
        exit(1);
    }
}
ArraySortedType::~ArraySortedType()
{

    delete [] info;
    info = NULL;
}

void ArraySortedType::ResetList ( )
{
    currentPos = -1;
}

bool ArraySortedType::IsFull ( )  const 
{
    if(length == MAX_ITEMS)
    {  
        try
        {//Check if memory allocation is fine
            ItemType * temp = new ItemType[2*MAX_ITEMS];
            delete [] temp;
            return false;
        }
        catch(std::bad_alloc exception)
        {
            return true;
        }
    }
    return false;
}

bool ArraySortedType::IsEmpty ()  const {
    return (length==0);
}

int ArraySortedType:: LengthIs ()  const {
    return length;
}


Error_Code  ArraySortedType::DeleteItem ( ItemType  item ) {

    int location = 0;
    while ((item.ComparedTo(info[location]) !=  EQUAL ) && location < length)
        location++;
    if (location == length) return Fail;

    info[location] = info[length - 1];
    length--;
    return Success;
}

Error_Code ArraySortedType::GetNextItem (ItemType&  item) {    
    currentPos++;
    if( currentPos == length ) return Fail;
    item = info[currentPos] ;
    return Success;
}
ArraySortedType::ArraySortedType(const ArraySortedType & ust)
{

    MAX_ITEMS =ust.MAX_ITEMS;
    length=ust.length;
    try
    {
        info = new ItemType[MAX_ITEMS];
    }
    catch(std::bad_alloc exception)
    {
        //Severe problem, do not keep program running
        cout <<"Memory full "<< endl;
        exit(1);
    }
    for(int i=0;i<length; i++)
        info[i] = ust.info[i];
        currentPos=ust.currentPos;

}
ArraySortedType& ArraySortedType::operator=(const ArraySortedType & ust)
{
    if(this == &ust) return *this;

    if(MAX_ITEMS !=ust.MAX_ITEMS)
    {
        delete [] info;
        MAX_ITEMS = ust.MAX_ITEMS;
        try
        {
            info = new ItemType[MAX_ITEMS];
        }
        catch(std::bad_alloc exception)
        {
            //Severe problem, do not keep program running
            cout <<"Memory full "<< endl;
            exit(1);
        }
    }
    currentPos=ust.currentPos;
    length=ust.length;
    for(int i=0;i<length; i++)
        info[i] = ust.info[i];

    return *this;
}

//Assumes that an employee has unique ID
bool ArraySortedType::operator==(const ArraySortedType & ust)
{
    if(this == &ust) return true;
    if(length!=ust.length) return false;
    if(currentPos!=ust.currentPos) return false;
    for(int i=0;i<length; i++)
        if(info[i].ComparedTo(ust.info[i])!=EQUAL) return false;
    return true;

}

Error_Code ArraySortedType::InsertItem ( ItemType item)
{
    if(!length)
    {
        info[0] = item;
        length++;
        return Success;
    }
    for(int i=0;i<=length;i++)
    {
        if(info[i].ComparedTo(item) != LESS || i==length)
        {
            for(int j=length;j>i;j--)
                info[j] = info[j-1];
            info[i]=item;
            length++;
            return Success;
        }
    }
    return Fail;
}

Error_Code ArraySortedType::RetrieveItem (ItemType& item , bool& found)
{
    found = false;
    int front = 0, back = length - 1, midpoint=(length-1)/2;
    while (front<=back)
    {
        switch (info[midpoint].ComparedTo(item))
        {
        case EQUAL:
            item = info[midpoint];
            found = true;
            break;
        case LESS:
            front = midpoint + 1;
            break;
        case GREATER:
            back = midpoint - 1;
            break;
        }
        if (found)
            break;
        midpoint = ((back - front) / 2 + front);
    }
    return Fail;
}

Error_Code ArraySortedType::Delete(ItemType startKey, ItemType endKey)
{
    bool startFound = false, endFound = false;
    int numberDeleted=0, startLocation;
    bool deleting = false;
    for (int i = 0; i < length; i++)
    {
        if (info[i].ComparedTo(startKey) == EQUAL)
        {
            startLocation = i;
            deleting = true;
            startFound = true;
        }
        if (deleting)
            numberDeleted++;
        if (info[i].ComparedTo(endKey) == EQUAL)
        {
            deleting = false;
            endFound = true;
        }
    }
    if (!(startFound || endFound))
        return Fail;
    length -= numberDeleted;
    for (int i = startLocation; i < length; i++)
        info[i] = info[i + startLocation];
    return Success;
}

ArraySortedType ArraySortedType::RetrieveItemsInRange(ItemType startKey, ItemType endKey)
{
    ArraySortedType r;
    bool startFound = false, endFound = false;
    int numberDeleted = 0, startLocation;
    bool retrieving = false;
    for (int i = 0; i < length; i++)
    {
        if (info[i].ComparedTo(startKey) == EQUAL)
        {
            startLocation = i;
            retrieving = true;
            startFound = true;
        }
        if (retrieving)
            r.InsertItem(info[i]);
        if (info[i].ComparedTo(endKey) == EQUAL)
        {
            retrieving = false;
            endFound = true;
        }
    }
    return r;
}

ArraySortedType& ArraySortedType::merge(const ArraySortedType& list)
{
    ArraySortedType s, copy = list;
    ItemType temp;
    copy.ResetList();
    while (copy.GetNextItem(temp) == Success)
        s.InsertItem(temp);
    for (int k = 0; k < length; k++)
        s.InsertItem(info[k]);
    return s;
}

ItemType被定义为类Employee。我真的希望我也不必将它包含在这里。 Employee类有一个compareTo类,定义如下:

RelationType Employee::ComparedTo(const Employee & e)
{
    if(eid < e.eid) return LESS;
    else if(eid == e.eid) return EQUAL;
    else return GREATER;
}

有一个称为关系类型的枚举,其值为LESS,EQUAL和GREATER。

0 个答案:

没有答案