Ошибка сегментации в связанном списке

#c #list

#c #Список

Вопрос:

Я пытаюсь создать программу для полиномов. Я добавляю элемент в полином, используя функцию 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 amp;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 amp; operator = (const Polynomial amp;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);
 }
 

Комментарии:

1. if(current->exponent==expon){ это ошибка, потому current что может быть nullptr.

2. @drescherjm вы правы, но в коде все еще был сбой сегментации, когда я удалил эту часть кода

3. Возможно, вам следует отладить его шаг за шагом, чтобы выяснить, есть ли другая проблема. Проверка ядра (стека вызовов) после сбоя также является опцией. Иногда ошибка может быть обнаружена только в одной из вызывающих функций.

4. @drescherjm Формирование связанного списка происходит в конструкторе Polynomial(). Я считаю, что весь соответствующий код был вложен, я пропустил только некоторые функции друзей.

5. Поэтому я рекомендовал отладчик: пошаговое выполнение части (вы знаете, что это приведет к сбою) и внимательно следите за задействованными переменными, прежде чем переходить по каждой строке. Перед выполнением шага вы должны подумать, что вы ожидаете, исходя из текущих значений переменных, затем выполнить шаг и посмотреть, выполнил ли отладчик, как ожидалось.

Ответ №1:

Ваша программа выходит из строя в полиномиальном конструкторе, который выглядит следующим образом:

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

Это не работает, потому что вы установили для «head» значение null, а затем после этого пытаетесь получить доступ к head-> next.

Вы не можете использовать head->next, когда head имеет значение null. Попытка сделать это приведет к сбою «ошибка сегментации».