首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:使用插入排序导致程序崩溃

C++:使用插入排序导致程序崩溃
EN

Stack Overflow用户
提问于 2013-06-17 23:54:19
回答 2查看 430关注 0票数 0

我正在尝试对员工的记录进行排序。该记录由包含雇员的名字、姓氏和年龄的条目组成。除了某些输入语句(作为main函数中的注释)之外,整个程序都运行得很好。计划内容如下:

代码语言:javascript
复制
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class cPerson
{
    private:
    string firstname,lastname;
    int age;
    public:
    cPerson(string fn,string ln,int a)      // constructor to input the firstname, lastname and age of the person
    {
        firstname=fn;
        lastname=ln;
        age=a;
    }
    void display()
    {
        cout<<"First Name = "<<firstname<<"\n";
        cout<<"Last Name = "<<lastname<<"\n";
        cout<<"Age = "<<age<<"\n";
    }
    int getAge()
    {
        return age;
    }
    string getLastName()
    {
        return lastname;
    }
};
class cOffice
{
    private:
        vector<cPerson*> v;
        int nElem;                      // counter of number of elements in the vector;
    public:
        cOffice(int max)
        {
            v.resize(max);              // maximum capacity of the vector
            nElem=0;                    
        }
        ~cOffice()
        {
            for(int i=0;i<nElem;i++)
                delete v[i];
        }
        void insertRec(string fn1, string ln1, int a1)      // inserting the record
        {
            v[nElem] = new cPerson(fn1,ln1,a1);
            nElem++;
        }
        void InsertionSort()
        {
            int compare,pivot;
            for(pivot=1;pivot<nElem;pivot++)
            {
                cPerson* temp = v[pivot];
                for(compare=pivot;v[compare-1]->getAge()>temp->getAge();compare--)
                {   
                    v[compare]=v[compare-1];
                }
                v[compare] = temp;
            }
        }
        void display()
        {
            for(int i=0;i<nElem;i++)
                v[i]->display();
        }
};
int main(void)
{
    cOffice obj(10);
    obj.insertRec("Evans", "Patty", 24); 
    obj.insertRec("Adams", "Henry", 63);
    obj.insertRec("Yee", "Tom", 43);
    obj.insertRec("Smith", "Lorraine", 37);
    /*obj.insertRec("Hashimoto", "Sato", 21);                  // cause of the crash
    obj.insertRec("Stimson", "Henry", 29);
    obj.insertRec("Velasquez", "Jose", 72);
    obj.insertRec("Lamarque", "Henry", 54);
    obj.insertRec("Vang", "Minh", 22);
    obj.insertRec("Creswell", "Lucinda", 18);*/  
    obj.display();
    obj.InsertionSort();
    obj.display();
    return 0;
}

问题是前四个输入语句工作得很好(我键入它们的顺序是任意的)。这表明我的InsertionSort()函数工作正常(是吗?)。我想知道我在程序中做错了什么。谢谢你的帮助。

修正后的InsertionSort函数(如MM-BB所建议的)如下:

代码语言:javascript
复制
void InsertionSort()
            {
                int compare,pivot;
                for(pivot=1;pivot<nElem;pivot++)
                {
                    cPerson* temp = v[pivot];
                    for(compare=pivot;compare>0&&v[compare-1]->getAge()>temp->getAge();compare--)
                    {   
                        v[compare]=v[compare-1];
                    }
                    v[compare] = temp;
                }
            }

更正是在第二个for语句中的条件之前添加了术语compare>0 &&。这确保了vector v保持在范围内。早些时候,这不是导致v-1的情况,v-1没有定义,因此导致程序崩溃。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-18 00:35:40

您的函数必须具有compare > 0

存在两种情况,其中一种是真的

way 1

代码语言:javascript
复制
void InsertionSort()
{
    int compare,pivot;
    for(pivot=1;pivot<nElem;pivot++)
    {
        cPerson* temp = v[pivot];
        for(compare=pivot; compare > 0 && v[compare-1]->getAge()>temp->getAge();compare--)
        {
            v[compare]=v[compare-1];
        }
        v[compare] = temp;
    }
}

way 2

代码语言:javascript
复制
void InsertionSort()
{
    int compare,pivot;
    for(pivot=1;pivot<nElem;pivot++)
    {
        cPerson* temp = v[pivot];
        for(compare=pivot; v[compare-1]->getAge()>temp->getAge() && compare>0 ;compare--)
        {
            v[compare]=v[compare-1];
        }
        v[compare] = temp;
    }
}

way 1为true,但way 2为false

因为当compare == 0然后v[index-1]释放一个问题时

我们必须首先检查compare > 0

票数 0
EN

Stack Overflow用户

发布于 2013-06-18 00:01:13

for(compare=pivot;vcompare-1->getAge()>temp->getAge();compare--)

假设pivot1compare将是1。然后访问列表v中的元素0。如果年龄较大,您将减少compare,这将使您访问越界元素(v[-1])。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17151772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档