2015-05-16 13 views
8

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

(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

risposta

4

E 'generalmente vero che quando mi definisco una funzione di prendere un puntatore, ho bisogno di passare in indirizzo di memoria?

Sì, xCode è giusto. node3 è un struct node, ma la tua funzione delete sta assumendo struct node * come secondo parametro, quindi devi passare il puntatore a node3, non alla variabile stessa.

Dopo aver chiamato delete e provato a eliminare node3, stampa ancora i 3 nodi.

Questo perché non si modifica il valore di next. Inoltre, per essere memoria-safe, non dimenticare di controllare se il puntatore è NULL:

while ((current->next != toDelete) && (current->next != NULL)) { 
    current = current->next; 
} 
if (current->next != NULL) 
    current->next = current->next->next; 
4

Basta provare a cambiare current = current->next->next; a current->next=current->next->next. Fammi sapere se non funziona.

6

È necessario passarlo &node3. Per la cancellazione, si prega di modificare il codice da current = current->next->next; a current->next = current->next->next;

7
but xCode wanted me to add "&" in front of "node3". Is it generally true that 
when I define a function to take a pointer, I need to pass in the memory 
address? 

sì, se si dichiara la funzione di prendere un puntatore, è necessario passare un puntatore.

anche durante l'eliminazione di un valore da una lista collegata si sta andando a voler cambiare

current->next = current->next->next 
Problemi correlati