2015-03-14 3 views
1

Я должен написать эту программу, но Я не могу вносить никаких изменений в функцию main, Эта программа работает, когда Node * head объявлен как глобальная переменная (функции не содержат «Узел» * head "в параметрах). эта программа успешно компилируется, но тогда возникает ошибка сегментации (я знаю, почему, глава не был изменен, и он все еще равен 0, но я не знаю, как это исправить). Есть идеи ?Указатель на функцию (список)

#include <iostream> 
#include <cstdlib> 
using namespace std; 
struct Node{ 
    int val; 
    Node* next; 
}; 
void addBeg(Node* head,int val) 
{ 
    Node* temp = (Node*)malloc(sizeof(Node)); 
    temp->val=val; 
    temp->next=head; 
    head=temp; 
} 
int main() 
{ 
    Node* head=0; 
    addBeg(head,1); 
    cout << head->val << endl; //checking if head was changed correctly 
    return 0; 
} 

ответ

0

Вам необходимо передать указатель на голову ссылка, если вы собираетесь изменить его. Все остальное потребует модификации main(), которая, по-видимому вне пределов:

Изменить это:

void addBeg(Node* head, int val) 

Для этого:

void addBeg(Node*& head, int val) // NOTE: see reference & 

See it live here

Тем не менее, вы должны быть используя new, а не malloc, и в идеале с использованием стандартного контейнера, такого как std::vector<>, std::list<>, std::deque<> вместо этого, но это не связано с вопросом.

+0

Спасибо, человек;) работает – Jkrowling

2

Если вы хотите изменить указатель внутри функции отправки "указатель на указатель", например:

#include <iostream> 
#include <cstdlib> 
using namespace std; 
struct Node{ 
    int val; 
    Node* next; 
}; 
void addBeg(Node** head,int val) // Node** instead of Node* 
{ 
    Node* temp = (Node*)malloc(sizeof(Node)); 
    temp->val=val; 
    temp->next=*head; 
    *head=temp;     // *head instead of head 
} 
int main() 
{ 
    Node* head=0; 
    addBeg(&head,1); // &head instead of head 
    cout << head->val << endl; //checking if head was changed correctly 
    return 0; 
} 

EDIT:

Или просто использовать ссылочный параметр для указателя:

void addBeg(Node* &head,int val) 
{ 
    Node* temp = (Node*)malloc(sizeof(Node)); 
    temp->val=val; 
    temp->next=head; 
    head=temp; 
} 
+0

«Я не могу ничего менять в функции main» означает, что вы не можете написать что-то вроде addBeg (& head, 1); вместо addBeg (head, 1); – Jkrowling

+0

Использовать ссылочный параметр - изменить заголовок 'void addBeg (Node * head, int val)' to 'void addBeg (Node * & head, int val)' (и не менять тело) – VolAnd

Смежные вопросы