Я пишу базовую программу связанных списков в C и имею немного проблем с удалением. Вот что у меня есть:Основной связанный список в C
#include <stdio.h>
struct node * delete(struct node * head, struct node * toDelete);
void print(struct node * head);
struct node {
int value;
struct node *next;
};
int main(int argc, const char * argv[]) {
struct node node1, node2, node3;
struct node *head = &node1;
node1.value = 1;
node1.next = &node2;
node2.value = 2;
node2.next = &node3;
node3.value = 3;
node3.next = (struct node *) 0;
print(head);
delete(head, &node3);
print(head);
return 0;
}
struct node * delete(struct node * head, struct node * toDelete) {
//if to delete is head
if (head == toDelete) {
head = head->next;
} else {
//find node preceding node to delete
struct node *current = head;
while (current->next != toDelete) {
current = current->next;
}
current = current->next->next;
}
return head;
}
void print(struct node * head) {
struct node *current = head;
while (current != (struct node *) 0) {
printf("%i\n", current->value);
current = current->next;
}
}
Вопрос № 1: Так что я пытался написать:
delete(head, node3);
но Xcode хотел добавить "&" перед "node3". Как правило, верно, что, когда я определяю функцию для ввода указателя, мне нужно передать адрес памяти?
Вопрос № 2:
Моя функция печати работает для распечатки значений 3 узлов. После вызова delete и попытки удалить node3, он все еще печатает 3 узла. Я не знаю, где я ошибся. Я нахожу узел, предшествующий тому, который я хочу удалить, и установите его следующий указатель на узел после узла после (неофициально: node.next = node.next.next).
Любые идеи?
Спасибо за помощь, bclayman
(1) да, * указатель * на что-то означает, что вам нужно * адрес * что-то. (2) ваша функция удаления ничего не делает: 'current = current-> next-> next;' только изменяет локальную переменную. – lurker