简体   繁体   English

链表 SIGSEGV,分段错误

[英]Linked list SIGSEGV, Segmentation fault

I was doing a practice problem using linked lists (I wanted to practice them a bit more) and I got the following error我正在使用链表做练习题(我想多练习一下),但出现以下错误

Program received signal SIGSEGV, Segmentation fault.程序收到信号 SIGSEGV,分段错误。 0x0000555555555888 in LinkedList::getLink (this=0x0) at main.cpp:24 24 return link; 0x0000555555555888 in LinkedList::getLink (this=0x0) at main.cpp:24 24 返回链接;

I can't tell what the problem with this method is,since looking back on the past things I wrote they seemed to be the same as this one.这个方法我也说不出来有什么问题,回头看我以前写的东西好像和这个一样。

#include<iostream>
#include<string>

class LinkedList{
    char sign;
    int count;
    LinkedList *link;
public:
    LinkedList(char sign) : sign(sign),count(1),link(nullptr) {}
    inline void Increment()
    {
        count++;
    }
    inline int getCount() const
    {
        return count;
    }
    inline void setLink(LinkedList *whereTo)
    {
        link=whereTo;
    }
    inline LinkedList* getLink() const
    {
        return link;
    }
    inline char getSign() const
    {
        return sign;
    }
};

void stringInput(std::string &var)
{
    std::cout<<"Enter some text:";
    std::getline(std::cin,var);
}

unsigned int factorial(unsigned int n)
{
    return (n!=0)? n*factorial(n-1) : 1;
}

void addList(char sign,LinkedList *&start,LinkedList *&helper,LinkedList *&end)
{
    end=new LinkedList(sign);
    if(start==nullptr)
    {
        start=end;
    }
    else
    {
        helper->setLink(end);
    }
    helper=end;
}

bool isInList(char sign,LinkedList *helper)
{
    while(helper!=nullptr)
    {
        if(sign==helper->getSign())
        {
            helper->Increment();
            return true;
        }
        helper=helper->getLink();
    }
    return false;
}

void addSignsToList(const std::string &var,LinkedList *&start,LinkedList *&helper,LinkedList *&end)
{
    for(int i=0;i<var.size();i++)
    {
        if(!isInList(var[i],start))
        {
            addList(var[i],start,helper,end);
        }
    }
}

void freeLinkedLists(LinkedList *start)
{
    LinkedList *helper=start->getLink();
    while(start!=nullptr)
    {
        delete start;
        start=helper;
        helper=helper->getLink();
    }
}

unsigned int factorialSum(LinkedList *helper)
{
    unsigned int sum=1;
    while(helper!=nullptr)
    {
        sum*=factorial(helper->getCount());
        helper=helper->getLink();
    }
    return sum;
}

unsigned int comb(const std::string &var)
{
    LinkedList *start=nullptr,*helper=nullptr,*end=nullptr;
    addSignsToList(var,start,helper,end);
    unsigned int upperHalf=factorial(var.size());
    double lowerHalf=factorialSum(start);
    freeLinkedLists(start);
    return upperHalf/lowerHalf;
}

int main()
{
    std::string var;
    stringInput(var);
    std::cout<<"The word \""<<var<<"\" has "<<comb(var)<<" possible combinations!\n";
    std::cin.get();
    return 0;
}

In

void freeLinkedLists(LinkedList *start)
{
    LinkedList *helper=start->getLink(); // fails immediately if start is null
    while(start!=nullptr)
    {
        delete start;
        start=helper;
        helper=helper->getLink(); // too late. Helper may already be null. 
                                  // This won't be  spotted until start is 
                                  // tested on the next loop iteration 
    }
}

Instead use而是使用

void freeLinkedLists(LinkedList *start)
{
    while(start!=nullptr) // handles empty list case
    {
        LinkedList *helper=start->getLink(); // get next node while we know 
                                             // current node is valid
        delete start;
        start=helper; // may be null and will be caught by the while
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM