байланысты тізімді сегменттеу қатесі. Мен мұнда көрсеткішпен қате нәрсе істеп жатырмын деп ойлаймын

EDIT: жаңартылған енгізу кодын береді. Мен оны бекітіп көремін, бірақ қателесіп жатырмын ба

bool SortedList::insert(Student *s){    
     bool inList = false;    
    //create an iterator for the list    
     ListNode *current = head;    
    //create a new ListNode for the student to be added    
     ListNode *addition = new ListNode();    
    //initialize addition to the student and the next to NULL    
     addition->student = s;    
     addition->next = NULL;    
            //while current is not at the end of the list    
            while(current != NULL){    
                   //if the iteration's ID is equal to the given ID return     
                   //false and delete the ListNode addition    
                    if(current->student->getID() == addition->student->getID()){    
                            delete addition;    
                            return false;    
                   //else if the next student ID in the list is greater than     
                   //the given ID break the while loop     
                    }else if(current->next != NULL && current->next->student->getID() > addition->student->getID()){   
                             inList = true;    
                             break;     
                    }    
                   //otherwise set current to the next student in the list     
                    current = current->next;                  
            }    
    //if current is at the end of the list and student wasn't found, set    
    //current next to addition           
     if(!inList){    
           current->next = addition;    
    //else set addition next to current next next and current next to addition    
     }else{              
           addition->next = current->next;    
           current->next = addition;    
     }        
    //return true regardless as the student has been added    
     return true;    
}

Мен жұмыс істеп жүрген бұл basiclinklist.cpp файлымен біраз проблема туындады. Менің болжауымша, бұл көрсеткіштерді қате немесе осы жолдарда қолданатын шығар деп ойлаймын. Негізгі файл объектілік файл ретінде беріледі, сондықтан оны қарап шығуға болмайды және кейбір себептермен кірістіру әдісін тексеруді ғана ойлаймын (мен ұйқыда және күресуде өте төмен). Әйтпесе, мен NULL-ге сілтеме жасайтын кірістіру әдісінің бір жерін болжап отырмын, бірақ қай жерде екенін білмеймін.

ҚАТЕ: Сегментация ақаулығы (ядродан шыққан) ЕСКЕРТПЕ: кірістіруді іске қосқаннан кейін бұл қате орын алды

#include 
#include "SortedList.h"

using namespace std;

/**
  * zero argument constructor - initializes an empty list
  */
SortedList::SortedList() : head(NULL){}

/**
  * If a student with the same ID is not already in the list, inserts 
  * the given student into the list in the appropriate place and returns
  * true.  If there is already a student in the list with the same ID
  * then the list is not changed and false is returned.
  *
  * @param *s a given pointer to a student
  * @return boolean value based on whether the student was inserted or not
  */
bool SortedList::insert(Student *s){
//create an iterator for the list
 ListNode *current = head;
//create a new ListNode for the student to be added
 ListNode *addition = new ListNode();
//initialize addition to the student and the next to NULL
 addition->student = s;
 addition->next = NULL;
        //while current is not at the end of the list
        while(current != NULL){
               //if the iteration's ID is equal to the given ID return 
               //false and delete the ListNode addition
                if(current->student->getID() == addition->getID()){
                        return false;
                        delete addition;
               //else if the next student ID in the list is greater than 
               //the given ID break the while loop                        
                }else if(current->next->student->getID() > addition->getID()){
                         break;     
                }
               //otherwise set current to the next student in the list 
                current = current->next;              
        }
//if current is at the end of the list and student wasn't found, set
//current next to addition       
 if(current == NULL){
       current->next = addition;
//else set addition next to current next next and current next to addition
 }else{          
 addition->next = current->next->next;
 current->next = addition;
 }    
//return true regardless as the student has been added
 return true;
}

/**
  * Searches the list for a student with the given student ID.  If the
  * student is found, it is returned; if it is not found, NULL is returned.
  *
  * @param studentID the given studentID to find in the list
  * @return a pointer to a the student found or NULL if the student isn't found
  */
Student * SortedList::find(int studentID){
   //create iterator for the list
    ListNode *current = head;
   //while not at the end of the list iterate
    while(current != NULL){
          //if the current student ID equals the given student ID return
          //the student       
           if(current->student->getID() == studentID){
                    return current->student;
           }
          //otherwise continue iterating
           current = current->next;
    }
   //if not found then return NULL
    return NULL;                   
}

/**
  * Searches the list for a student with the given student ID.  If the 
  * student is found, the student is removed from the list and returned;
  * if no student is found with the given ID, NULL is returned.
  *
  * @param studentID the given student ID to be removed from the list
  * @return a pointer to the student that was removed or NULL if the student
  * wasn't found
  */
Student * SortedList::remove(int studentID){
   //create iterator for the list
    ListNode *current = head;
   //create the to hold the value ahead of the iterator
    ListNode *currentNext;
   //create to hold the removed student
    Student *remove;
   //while current is not at the end of the list iterate
    while(current != NULL){
                 //set currentNext to the value ahead of iterator
                  currentNext = current->next;
                 //if its ID equals the given ID
                  if(currentNext->student->getID() == studentID){
                      //set remove to the student removing
                       remove = currentNext->student;
                      //set current next to currentNext next
                      //(current next next)
                       current->next = currentNext->next;
                       //delete the removed ListNode
                       delete currentNext;
                       //return the removed student
                       return remove;
                  }
    }
    //if the student wasn't found return NULL
    return NULL;
}

/**
  * Prints out the list of students to standard output.  The students are
  * printed in order of student ID (from smallest to largest), one per line
  */
 void SortedList::print() const{
  //create iterator for list
 ListNode *current = head;
          //while current is not at the end of the list iterate
          while(current != NULL){
                 //print each individual student and end line      
                  current->student->print();
                  cout << endl;
                  //iterate the list
                  current = current->next;              
          }           
}
0
Пайдалану проблеманы өзіңізді төмендетуге көмектесу үшін агрессивті түрде бекітеді
қосылды автор Mooing Duck, көзі

1 жауаптар

   while(current != NULL){
           //if the iteration's ID is equal to the given ID return 
           //false and delete the ListNode addition
            if(current->student->getID() == addition->getID()){
   2                 return false;
                    delete addition;
           //else if the next student ID in the list is greater than 
           //the given ID break the while loop                        
   1         }else if(current->next->student->getID() > addition->getID()){
                     break;     
            }

At the line I marked 1, you dereference current->next without ever checking if it is NULL or not. Also, at the line I marked 2, you end exectution, and then delete the pointer. You should delete before you return.

if(current == NULL){
3   current->next = addition;
//else set addition next to current next next and current next to addition
 }else{          
4     addition->next = current->next->next;
     current->next = addition;
 }  

At the line marked 3, you dereference current only if it's NULL. Bad juju. At the line marked 4, you dereference current->next without checking if it's NULL first. I think you meant to set addition->next to current->next anyway.

1
қосылды
@ user1015524: pointername -> деген әр жолдан бұрын assert (pointername); дегенді білдіреді. Сонымен қатар, жаңартылған кодты көре алмаймын, сондықтан алмаймын жаңартылған код туралы түсініктеме беріңіз.
қосылды автор Mooing Duck, көзі
@ user1015524: бірінші оқушыны өшіре алмайтын қоспағанда, жақсы көрінеді, жақсы көріністі алып тастаңыз.
қосылды автор Mooing Duck, көзі
@ user1015524: менің жалаңаш көзге жақсы көрінеді. Әрі қарай көмектесу үшін нақты қате туралы хабарлар қажет болады. Сіз дұрыс түзеткішті пайдаланасыз ба? Visual Studio немесе gdb?
қосылды автор Mooing Duck, көзі
Мен барлық ұсынылған түзетулерді жасадым және ол әлі жұмыс істемейді. бұл адамдарды көрсетуге рақмет, бірақ онымен қате нәрсе таба аласыз ба?
қосылды автор chazzwa, көзі
Мен жаңа кодты үстіңгі жағына қосу үшін поштаны жаңарттым
қосылды автор chazzwa, көзі