Я пытаюсь это сделать без указателя головы/начала, который обычно содержит адрес первого узла. У меня есть 3 узла, из которых я пытаюсь удалить последний узел, но этого не происходит. Я могу ошибаться в своей логике, и это моя первая программа со связанными списками, поэтому, пожалуйста, помогите мне!
#include <stdio.h>
#include <stdlib.h>
struct dll {
struct dll* prev;
int data;
struct dll* next;
};
int main() {
struct dll* p1, *p2, *p3, *temp;
p1 = malloc(sizeof(struct dll));
p2 = malloc(sizeof(struct dll));
p3 = malloc(sizeof(struct dll));
temp = malloc(sizeof(struct dll));
p1->prev = NULL;
p1->data = 1;
p1->next = p2;
p2->prev = p1;
p2->data = 2;
p2->next = p3;
p3->prev = p2;
p3->data = 3;
p3->next = NULL;
struct dll* add = NULL;
int count = 0;
printf("add of p1::%p add of p2::%p add of p3::%p add of p1->prev::%p add "
"of p1->next::%p add of p2->prev::%p add of p2->next::%p add of "
"p3->prev::%p add of p3->next::%p\n",
p1, p2, p3, p1->prev, p1->next, p2->prev, p2->next, p3->prev,
p3->next);
while (p1->next != NULL) {
count++;
p1 = p1->next;
}
printf("no of nodes %d\n", count + 1);
puts("enter the addresss of node to delete it");
scanf("%p", &add);
while (p1->next != NULL) {
if (p1->next == add) {
temp = p1->next;
p1->next = NULL;
free(temp);
temp = NULL;
} else
p1 = p1->next;
}
puts("after deletion attempted");
printf("add of p1::%p add of p2::%p add of p3::%p add of p1->prev::%p add "
"of p1->next::%p add of p2->prev::%p add of p2->next::%p add of "
"p3->prev::%p add of p3->next::%p\n",
p1, p2, p3, p1->prev, p1->next, p2->prev, p2->next, p3->prev,
p3->next);
while (p1->next != NULL) {
count++;
p1 = p1->next;
}
printf("no of nodes %d\n", count + 1);
free(p1);
p1 = NULL;
free(p2);
p2 = NULL;
free(p3);
p3 = NULL;
return 0;
}
выход::::
add of p1::0x9605008 add of p2::0x9605018 add of p3::0x9605028 add of p1->prev::(nil) add of p1->next::0x9605018 add of p2->prev::0x9605008 add of p2->next::0x9605028 add of p3->prev::0x9605018 add of p3->next::(nil)
no of nodes 3
enter the addresss of node to delete it
0x9605028
after deletion attempted
add of p1::0x9605028 add of p2::0x9605018 add of p3::0x9605028 add of p1->prev::0x9605018 add of p1->next::(nil) add of p2->prev::0x9605008 add of p2->next::0x9605028 add of p3->prev::0x9605018 add of p3->next::(nil)
no of nodes 3
В этом примере я пытаюсь удалить узел 3, который является p3, удалив его адрес 0x9605028. Но после удаления количество узлов по-прежнему равно 3, а адреса как неожиданные!
temp = p1->next
приводит к утечке памяти при первом вызове. Указательtemp
был инициализирован в верхней части функции какtemp=malloc(sizeof(struct dll))
. Это указатель. C — это не Java. Фактически, вы могли бы полностью удалить объявление вmain()
и объявить указатель local-scope внутри фигурных скобокif{}
(и, вероятно, было бы понятнее, если бы вы сделали именно это). - person WhozCraig   schedule 23.08.2014