#c #linked-list
#c #связанный список
Вопрос:
Я написал две функции для вставки в начале и вставки в конце в LinkedList. Но он показывает ошибку сегментации. Почему мой код выдает ошибку сегментации?
/*Structure of the linked list node is as
struct Node {
int data;
struct Node * next;
Node(int x) {
data = x;
next = NULL;
}
}; */
// function inserts the data in front of the list
Node *insertAtBegining(Node *head, int newData) {
Node* newnode;
newnode->data = newData;
newnode->next = head;
head = newnode;
return head;
}
// function appends the data at the end of the list
Node *insertAtEnd(Node *head, int newData) {
Node* newnode;
newnode->data = newData;
newnode->next = NULL;
Node* temp;
temp = head;
while(temp->next!=NULL){
temp = temp->next;
}
temp->next = newnode;
return head;
}
Комментарии:
1. Какие ошибки в строке seg? Это было бы очень полезно для нас. Кроме того, нет основного метода, поэтому мы не можем воспроизвести вашу проблему.
2. newnode является локальной переменной в обеих функциях, выделенной стеком. Так что он умрет, когда область действия будет завершена.
Ответ №1:
newnode является локальной переменной в обеих функциях, выделенной стеком. Так что он умрет, когда область действия будет завершена.
Вы должны выделить новую область памяти из кучи, а не из стека.
Решение :
Node* newnode = (Node*)calloc(sizeof(Node),1);
Ответ №2:
Node* newnode; newnode->data = newData; newnode->next = head;
Здесь вы проходите через неопределенный указатель, как если бы он указывал на объект. Поведение программы не уточнено.
Ответ №3:
Вы не можете точно знать, на что указывает указатель, и вам никогда не следует пытаться получить к нему доступ к данным, прежде чем вы укажете на фактический адрес или выделите для него память. Хорошей практикой является объявление указателей на null, чтобы избежать подобных ошибок. пример:
Node* newnode = NULL;
newnode = (Node*)malloc(sizeof(Node));
ewnode->data = newData;
newnode->next = head;
Или, конечно, все это в режиме онлайн.
И не забудьте освободить память