Sto scrivendo un programma elenco di base collegato in C e ho un po 'di problemi con la cancellazione. Ecco quello che ho:Elenco collegato di base in 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;
}
}
Domanda # 1: Così ho provato a scrivere:
delete(head, node3);
ma xCode voluto me aggiunga "&" di fronte "node3". È generalmente vero che quando definisco una funzione per prendere un puntatore, devo passare l'indirizzo di memoria?
Domanda # 2:
La mia funzione di stampa lavora per la stampa i valori dei 3 nodi. Dopo aver chiamato delete e provato a cancellare node3, stampa ancora i 3 nodi. Non sono sicuro di dove mi sono sbagliato. Trovo il nodo che precede quello che voglio cancellare e settare il suo prossimo puntatore al nodo dopo il nodo dopo (informalmente: node.next = node.next.next).
Qualche idea?
Grazie per l'aiuto, bclayman
(1) sì, * * puntatore a qualcosa significa che è necessario l'indirizzo * di * qualcosa. (2) la tua funzione di cancellazione non fa nulla: 'corrente = corrente-> prossima-> successiva;' cambia solo una variabile locale. – lurker