2016-04-07 13 views
2

wenn ich die folgende Struktur erstellen:Wie funktionieren Zeiger mit doppelt verknüpften Listen in C?

typedef struct node { 
    int a; 
    char b[100][15]; 
    struct node *prev; 
    struct node *next; 
} Scope; 

Muss ich einen Zeiger mein head_node zu initialisieren? Derzeit ist dies meine Initialisierungsfunktion:

Scope initScope() { 
    Scope head; 
    head.a = 1; 
    head.prev = NULL; 
    head.next = NULL; 
    return head; 
} 

In einiger Funktion würde ich

Scope head = initScope(); 

sagt Diese so weit ich in Ordnung scheint, aber ich bin nicht sicher, wie ich einen neuen Knoten erstellen. Ich vermute, ich würde einen Zeiger vom Typ Scope benötigen. Ich müsste es von Größe Scope malloc und dann seine Werte initialisieren. Soll ich das gleiche machen, wenn ich den Kopf erstelle? Die zugrundeliegende Frage, die ich zu beantworten versuche, ist der Zweck eines Zeigers hier? Was passiert, wenn in der Definition meiner struct I

*Scope 

statt

Scope 

geschrieben hatte? Wenn ich Zeiger verwenden muss, um Knoten zu erstellen, warum sollte ich die Struktur nicht zu einem Zeiger machen? Nach meinem Verständnis erlauben Zeiger nur, den Speicher zu manipulieren. Was bleibt also zurück, wenn ich einen Knoten erstelle und weitergehe?

Antwort

0

Das scheint mir in Ordnung, aber ich bin mir nicht sicher, wie ich einen neuen Knoten erstellen werde.

Die prev und next Mitglieder eines Scope Objekt muss auf andere Scope Objekte zeigen eine verknüpfte Liste zu erstellen.

Diese Objekte können sich in einem statisch zugewiesenen Array von Objekten oder dynamisch zugeordneten Objekten befinden.

  1. Erstellen einer verknüpften Liste von einer statisch zugewiesenen Array

    Scope scopes[10]; 
    scopes[0].prev = NULL; 
    scopes[9].next = NULL; 
    for (int i = 0; i < 9; ++i) 
    { 
        scopes[i].next = &(scopes[i+1]); 
        scopes[i+1].pref = &(scopes[i]); 
    } 
    
  2. eine verknüpfte Liste erstellen von dynamisch zugewiesenen Objekte

    Scope* node = malloc(sizeof(*node)); 
    node->next = node->prev = NULL; 
    for (int i = 0; i < 9; ++i) 
    { 
        Scope* temp = malloc(sizeof(*temp)); 
        temp->prev = NULL; 
        temp->next = node; 
        node->prev = temp; 
        node = temp; 
    } 
    

    Sie können auch alle Objekte mit einem Aufruf dynamisch zuweisen .

    Scope* scopes = malloc(10*sizeof(*scopes)); 
    

    und dann behandeln Sie es ähnlich einem statisch zugewiesenen Array.

    Sie müssen die richtigen Aufrufe an free abhängig davon verwenden, welche Methode Sie verwenden, um die Objekte zuzuweisen.

+0

Also würde ich einen Zeiger verwenden, um Knoten zu erstellen? Der erste Knoten würde Nullzeiger haben, und jeder Knoten danach wäre mit dem nächsten Zeiger verbunden? Also benutze ich nur struct, um einen bestimmten Speicherblock zuzuweisen? – Pareod

+0

Zeiger zeigen auf Objekte. Ich bin mir nicht sicher, was Sie mit * meinen, also würde ich einen Zeiger verwenden, um Knoten zu erstellen? * Wenn es nur einen Knoten gibt, ist es "nächste" und "vorherige" Mitglieder werden NULL sein. Sonst werden sie nicht. Ja, Sie verwenden eine 'struct', um einen bestimmten Speicherblock zuzuordnen. –

+0

Was ich meine ist, dass, anstatt "Int = 5" zu sagen, ich sagen werde: int * ptr = malloc (sizeof (int)); & ptr = 5; 'so im Wesentlichen bin ich abschneiden Speicher der Größe int. Wenn ich nun diese Idee auf verknüpfte Listen anwenden möchte, muss ich es auf diese Weise machen, sonst hätte ich einen eindeutigen Variablennamen für jeden Knoten, richtig? Oder ich hätte ein Array von Knoten, die jeweils einen eindeutigen Index haben? Ich glaube, ich beginne zu verstehen, warum ich einen Zeiger für Knoten nach dem Kopf brauche. – Pareod

Verwandte Themen