链表中的分段错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表中的分段错误相关的知识,希望对你有一定的参考价值。

我正在尝试为多项式编写程序。我使用addTerm函数向多项式添加元素。在函数的第一个“else”部分中似乎是一个段错误。

#include <iostream>
#include <math.h>
using namespace std;
class Polynomial{
 protected:
  class Term{
  public:
    int exponent;
    int coefficient;
    Term *next;
    Term(int exp, int coeff,Term *n){
      exponent = exp;
      coefficient = coeff;
      next=n;
    };
    friend class Polynomial;
   };
   Term *head;
 public:
 Polynomial(){
  head=nullptr;
  head->next=nullptr;
 }
 Polynomial(const Polynomial &p){
  head=nullptr;
  Term* curr=p.head;
  while(curr!=nullptr){
    addTerm(curr->exponent,curr->coefficient);
    curr=curr->next;
  }
   }
 ~Polynomial(){
  Term* curr=head;
  while(curr!=nullptr){
    Term* next=curr->next;
    delete curr;
    curr=next;
  }
  head=nullptr;
  };

  Polynomial & operator = (const Polynomial &p){
  Term* curr=head;
  while(curr!=nullptr){
    Term* next=curr->next;
    delete curr;
    curr=next;
  }
  head=nullptr;
  Term* current=p.head;
  while(current!=nullptr){
    addTerm(current->exponent,current->coefficient);
    current=current->next;
  }
  return *this;

};

void addTerm(int expon, int coeff){
  if(head==nullptr){                              //adeia lista
    Term* t=new Term(expon,coeff,nullptr);
    head=t;
    // cout<<t->exponent<<t->coefficient;
  }
  else{
    if(expon>head->exponent){                  
      Term* temp= new Term(expon,coeff,head);
      temp->next=head;
      head=temp;
    }
    else{

     Term* current=head;
      for(current=head;expon!=current->exponent;current=current->next){
        if(current==nullptr) break;
      }
      if(current->exponent==expon){
        current->coefficient=current->coefficient+coeff;
      }
      else{
        current=head;
        Term* prev=head;
        while(expon<current->exponent){

         prev=current;
          current=current->next;
       }
        Term* temp=new Term(expon,coeff,current);
        prev->next=temp;
     }
}
}

我运行它的代码是:

int main(){
 Polynomial p;
 p.addTerm(3,1);
 p.addTerm(2,3);
 }
答案

您的程序在Polynomial构造函数中崩溃,如下所示:

Polynomial() {
  head=nullptr;
  head->next=nullptr;
}

这不起作用,因为你已经将“head”设置为null然后在那之后你尝试访问head-> next。

当head为null时,你不能使用head-> next。试图这样做会导致“分段错误”崩溃。

以上是关于链表中的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试从双向链表中删除最后一个元素时,为啥会收到“信号 SIGSEGV,分段错误”?

链表中元素比较功能的实现

返回指针时出现分段错误[关闭]

使用线程的分段错误

为啥我的代码中出现分段错误(核心转储)错误?

C++中打印链表元素的分段错误