2015-04-14 5 views
-1

Итак, я делаю рудиментарную реализацию кругового списка. Я еще не сделал функцию удаления. Всякий раз, когда я запускаю cpp, я получаю ошибку seg 11. Любая обратная связь будет высоко оценена. Спасибо.Сегментация Fault 11 всякий раз, когда я запускаю это. Хотелось бы помочь/обратная связь

#include <iostream> 
using namespace std; 

struct node{ 
    node* next=NULL; 
    bool tail= false; 
    int contents; 
}; 
node* start;//start is a pointer that exists at the start of the list before the first element 

class CircList{ 
node *seek; 
public: 

CircList(){ //creates a list of one node that points to itself 
    node *b= new node; 
     b->contents=0; 
     b->next = b; 
     start->next=b; 
     b->tail=true; 
} 

bool empty(){ 
    if(start->next==NULL){ 
     return true; 
    } 
    return false; 
} 

int size(CircList a){ 
    if(start->next==NULL){ 
     cout<<"size is 0 \n"; 
     return true; 
    } 
    seek=start->next; 
    for(int i=0; i++;){ 
    if(seek->tail==true){ 
     cout<<"size is "<<i; 
    } 
    seek=seek->next; 
    } 
    return 0; 
} 

void insert(int pos, int val){ 
    if(start->next ==NULL){//if inseting when the list is empty 
     node *b= new node; 
     b->next = b; 
     b->tail=true; 
     return; 
    } 

    node *b= new node; 
    b->contents= val; 
     seek=start->next; 
    for(int i=0;i<=pos; i++){ 
     if(seek->tail==true){//if inserting at the end 
      seek->tail=false; 
      b->tail=true; 
      seek->next=b; 
      b->next=start->next; 
     } 
     if(pos==i){//if inserting between two nodes 
      b->next = seek->next; 
      seek->next = b; 
     } 
      seek=seek->next; 
    } 
    } 
void remove(int a){ 
    seek=start->next; 
    for(int i=0;i<=a-1; i++){ 
     if(i<a){ 
      seek=seek->next; 
     } 
     if(i==a-1){ 

} 
    } 
} 

    void display(){ 
     cout<<start->next->contents; //will also be completed in the near future 
     seek=start->next; 
     for(int i=0; ;i++){ 
     if(seek->tail==false){ 
      cout<<seek->contents<<"\n"; 
     } 
     if(seek->tail==true){ 
      cout<<seek->contents<<"\n"; 
      return; 
     } 
    } 
     } 
    }; 

Это был .h файл. Ниже приводится cpp. Я просто подключил номера для тестирования. Я хочу запустить программу, чтобы проверить, как она себя ведет.

#include <iostream> 
#include "CircList.h" 
using namespace std; 

int main(){ 

CircList a; 
a.insert (5,5); 
a.insert (5,5); 
a.insert (1,4); 
a.insert (20,65); 
a.insert (3,7); 
a.size(a); 
a.display(); 
} 
+0

Compile со всеми предупреждениями и отладочной информации (например, 'г ++ -Wall -Wextra -std = C++ 11 -g'), возможно, даже с '-fsanitize = address', если они доступны. Затем ** используйте отладчик ** ('gdb') и, возможно, [valgrind] (http://valgrind.org/). Ваш вопрос не в тему, так как вы не понимаете его каким-либо образом. –

ответ

-1

Ваша глобальная переменная start является неинициализированным указатель, но вы разыменования все это за место.

+0

Спасибо. Я сделал указатель NULL, и он все еще компилируется, но я все равно получаю тот же самый seg-код, когда запускаю код. Есть ли что-нибудь еще, что я мог бы сделать лучше? – Sid

+0

@Sid разыменование NULL примерно так же плохо, как использование неинициализированного указателя. Как вы написали этот код без понимания основного указателя? –

+0

@Beta глобальные переменные без явного инициализатора инициализируются значением (в случае указателей это означает нулевой указатель). –

0

Я продолжал рассматривать старт как узел вместо указателя. Сделав start = Null и заменив все «start-> next» на «start», я получил его для компиляции и запуска. Но теперь это только бесконечно вставляемые узлы со значением 0 в содержимом.

Редактировать: я исправил его. Изменяя этот странный цикл в функции отображения на цикл while, он больше не делает бесконечных вставок узла в конструкторе. Кажется, он работает достаточно прилично.

0

Это здесь вызывает Замыкание на SEG

start->next=b; 

, потому что старт в начале программы, так что вы-де-ссылки на пустой указатель NULL.

вместо этого установить начать первый узел в конструкторе

start = b; 
+0

codereview для обзора рабочего кода –

+0

И ответы на самом деле не являются местом для составления рекомендаций по сайту ... – nhgrif

+0

@MattMcNabb да, как только он исправляет ошибку seg, которую я имел в виду, но хорошо, я удалю это. –