Вы можете исправить ошибку сегментации из-за несанкционированного доступа к памяти, проверив, что t2
не равно нулю, прежде чем пытаться разыменовать указатель. Эта версия работает без ошибок после добавления охранников к t2
:
for (t = start; t; t = t->ptr) {
if (!t2 || (t1 && t1->data > t2->data)) {
printf("%d->", t->data);
}
t1 = t1->ptr;
if (t2) {
t2 = t2->ptr;
}
}
Хотя это показывает правильный вывод, список фактически не изменяется, поэтому мы просто создаем побочный эффект , делая процедуру бесполезной для манипулирования данными в памяти для других целей.
Несколько дополнительных предложений:
- В этой программе нет необходимости в глобальных переменных.
- Избегайте ненужных переменных (
t
и t1
в основном одинаковы, поэтому одну из них легко удалить. Мы также можем удалить t2
и использовать вместо нее t->ptr
). - Дать переменныеописательные имена.
- Используйте интервалы вокруг операторов.
- Разделяйте логические порции кода на отдельные функции вместо добавления комментариев в
main
для их разделения. - Освободите выделенную память прис этим покончено.
- Не нужно приводить результат
malloc
.
Вот версия, которая изменяет список на месте и реализует вышеприведенноеPOINts:
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node *ptr;
};
void remove_right_larger(struct node **head) {
for (struct node *curr = *head, *prev = NULL;
curr; curr = curr->ptr) {
if (curr->ptr && curr->data < curr->ptr->data) {
if (prev) {
prev->ptr = curr->ptr;
}
else {
*head = curr->ptr;
}
free(curr);
}
else {
prev = curr;
}
}
}
void print_list(struct node *head) {
for (; head; head = head->ptr) {
printf("%d->", head->data);
}
puts("NULL");
}
void free_list(struct node *head) {
while (head) {
struct node *tmp = head;
head = head->ptr;
free(tmp);
}
}
struct node *input_list() {
struct node *start = NULL;
struct node *last = NULL;
int size;
printf("Enter size: ");
scanf("%d", &size);
while (size--) {
struct node *tmp = malloc(sizeof(*tmp));
tmp->ptr = NULL;
printf("Enter list: ");
scanf("%d", &(tmp->data));
if (start) {
last->ptr = tmp;
}
else {
start = tmp;
}
last = tmp;
}
return start;
}
int main() {
struct node *head = input_list();
print_list(head);
remove_right_larger(&head);
print_list(head);
free_list(head);
return 0;
}