2012-04-06 11 views
3

I für das Hinzufügen von Element diesen Code schrieb:Einzel Verwendung im Vergleich zu Doppelzeiger in Linked in C implementiert Listen

struct node{ 
    int info; 
    struct node* link; 
}; 

void append (struct node **q, int num) 
{ 

struct node *temp, *r ; 

if (*q == NULL)  // if the list is empty, create first node 
{ 
    temp = (struct node*) malloc (sizeof (struct node)) ; 
    temp -> info = num ; 
    temp -> link = NULL ; 
    *q = temp ;   
} 
else{ 
    temp = *q ;   

    /* go to last node */ 
    while (temp -> link != NULL) 
     temp = temp -> link ; 

    /* add node at the end */ 
    r = (struct node *)malloc (sizeof (struct node)) ; 
    r -> info = num ; 
    r -> link = NULL ; 
    temp -> link = r ; 
} 
} 

und ich Funktion wie folgt anhängen nennen: append(&list, 10); wo list ist die Zeiger auf die verkettete Liste

Dieser Code funktioniert, aber wenn ich Einzelzeiger in Append-Funktion (mit * q anstelle von ** q) verwenden und Änderungen vornehmen (wie unten getan und auch wenn ich es nenne), es funktioniert nicht. Was unten ?: mit dem Code falsch ist

void append (struct node *q, int num) 
{ 

struct node *temp, *r ; 

if (q == NULL)  // if the list is empty, create first node 
{ 
    temp = (struct node*) malloc (sizeof (struct node)) ; 
    temp -> info = num ; 
    temp -> link = NULL ; 
    q = temp ;   
} 
else{ 
    temp = q ;   

    /* go to last node */ 
    while (temp -> link != NULL) 
     temp = temp -> link ; 

    /* add node at the end */ 
    r = (struct node *)malloc (sizeof (struct node)) ; 
    r -> info = num ; 
    r -> link = NULL ; 
    temp -> link = r ; 
} 
} 
+1

Warum wird dies als C++ markiert? – iammilind

+1

weil C und C++ eng verwandt sind und ich annehme, dass jemand mit dem Wissen von C++ mir hier helfen könnte. – Jatin

+1

Übrigens ist dies ein schlechter Ansatz, um ein Element an die Liste anzuhängen, weil die Laufzeit linear mit der Anzahl der Elemente ansteigt. Der traditionelle Ansatz besteht darin, einen Zeiger auf beide Enden der Liste zu halten, der das Anhängen in konstanter Zeit ermöglicht. –

Antwort

3

Da im zweiten Beispiel ist q eine Kopie des Zeigers durch den Anrufer übergeben. Der ursprüngliche Zeiger des Aufrufers wird nie geändert.

+0

Aber 'list' ist der Zeiger auf einen Knoten. Also speichert es eine Adresse. Also, wenn ich 'append (list, 10) 'anrufe, übergebe ich die Adresse, also sollte das nicht die ursprüngliche verknüpfte Liste ändern. – Jatin

+0

@Jatin: Nicht für den Teil des Codes mit der Bezeichnung "Wenn die Liste leer ist, erstellen Sie den ersten Knoten." –

+0

Also vorausgesetzt, ich habe mindestens 1 Element in der Liste, dann wird der zweite Code funktionieren, oder? – Jatin

1

In Ihrem ersten Snippet (was korrekt ist), machst du zu viel.

void append (struct node **q, int num) 
{ 

struct node *new ; 

    /* go to last node */ 
    for (; *q; q = &(*q)->link) {;} 

    /* add node at the end */ 
    new = malloc (sizeof *new); 
    if (!new) { barf_now(); return; } 

    new->info = num ; 
    new->link = NULL ; 
    *q = new; ; 
    } 
} 

Die Grundidee ist: Sie möchten an den Schwanz der Liste anhängen; Sie müssen:

  • den ersten NULL-Zeiger
  • gesetzt finden es Wert auf den Wert des neuen Zeigers

Der Fall „leere Liste“ nicht Besonderes, es bedeutet nur, dass Sie finde den NULL-Zeiger in null Schritten. Codieren Sie es auf diese Weise gibt es keinen speziellen Fall, und keine Notwendigkeit für eine if (...) ... else ... Konstrukt.