2016-12-01 4 views
-1

Здесь программаМоя связаны списки программа завершается со статусом -1073741819 В кодовых блоков компилятора (x0000000005))

#include <iostream> 
#include <stdio.h> 
#include <conio.h> 
#include <stdlib.h> 
using namespace std; 

struct node 
{ 
    int data; 
    node *next; 
}; 
typedef node *list; 

bool create(list header){ 
    return header==NULL; 
} 

void insert_begining(list header,int item){ 
    node*p; 
    p=new(node); 
    if (p=NULL) 
    { 
     return; 
    } 
    p->data=item; 
    p->next=header; 
    header=p; 
} 

void insert_end(list header,int item){ 
    list p,q; 
    p=new(node); 
    p->data=item; 
    p->next=NULL; 
    if (header==NULL) 
    { 
     header=p; 
    } 
    else 
    { 
     q=header; 
     while(q->next!=NULL){ 
      q=q->next; 

     } 
     q->next=p; 
    } 

} 

void print_list(list header){ 
    node* p; 
    p=header; 
    while(p->next!=NULL){ 
     cout<<p->data<<endl; 
     p=p->next; 
    } 
} 

int main(){ 
    list header; 
    create(header); 
    insert_end(header,500); 
    insert_end(header,600); 
    insert_end(header,4); 
    insert_end(header,6); 
    print_list(header); 
    return 0; 
} 

я запустить программу, и она показывает

Процесс возвращается -1073741819 (0xC0000005) время выполнения: 6.720 s

Я действительно не знаю почему. Я считаю, что синтаксис правильный рад проверить программу выше и сказать мне, что делать. Я новичок, и я действительно мало знаю о связанных списках

+1

1) 'if (p = NULL)' -> 'if (p == NULL)' 2) 'header = p;' не изменять вызывающая сторона. 3) 'list header;': 'header' не инициализируется. – BLUEPIXY

+1

_i я новичок, и я действительно мало знаю о связанных списках - будет сложно написать код, не понимая, для чего вы пишете. Пожалуйста, прочитайте в списке ссылок. Есть много доступных, если вы ищете Google. Для конкретной ошибки, которую вы получаете, @BLUEPIXY указал на это. – alvits

+0

Вы передаете параметр 'header' по значению, поэтому всякий раз, когда вы думаете, что назначаете его, вы на самом деле этого не делаете. –

ответ

0

Во-первых, вам нужно понять значение pass-by-value vs pass-by-reference. В первом случае передается экземпляр var и в последнем передается фактический var. Пример:

void f1(int x) { // Pass by value 
    x = 1; 
} 
void f2(int& x) { // Pass by reference 
    x = 2; 
} 
int main() { 
    int y = 0; 
    f1(y); 
    // y is still 0 
    f2(y); 
    // y is now 2 
} 

В вашей программе, вы передаете header по значению:

void insert_begining(list header,int item){ 
    // .... 
    header=p; // Only modifying the local var! 
} 

Некоторые вещи, которые я хотел бы сделать: Во-первых, избавиться от этого ЬурейеЕ. Это C++, но вы не используете классы, поэтому я предполагаю, что вы еще не изучили их. Вместо этого, создать связанный список-структуру:

struct node 
{ 
    int data; 
    node *next; 
}; 
struct linked_list { 
    struct node *head; 
    linked_list() : head(nullptr) {} // ctor 
}; 

Нет больше ЬурейеЕ не нужны, и теперь вы можете легко перейти по ссылке. Пример:

void insert_begining(linked_list& list, int item){ 
    // removed for brevity 
    p->next = list.head; 
    list.head = p; 
} 
0

Когда вы объявляете переменную заголовка, она не инициализируется значением NULL. В C++ переменные обычно не инициализируются компилятором при объявлении.

Итак, когда вы сделать звонок

insert_end(header, 500); 

внутри функции блок еще выполняется, так как заголовок не NULL, но значения мусора. Виновником здесь:

while(q->next!=NULL); 

Вы не можете оценить q-> следующая поскольку д указывает на случайное место памяти и, следовательно, Segfault. Перед доступом к нему необходимо назначить переменную.

Так в вас основной функции добавить следующее:

list header = NULL; 

Помимо этого для ваших может проверить комментарии BLUPIX о других проблемах. Также используйте nullptr вместо NULL, если компилятор поддерживает C++ 11