2016-11-29 4 views
0
struct node { 
    struct node *next; 
    int num; 
} Node; 


Node *insert(int i) { 
    Node *head; 
    for (int c = 0; c < i; c++) { 
     head = malloc(sizeof(Node)); 
     head.num = i; 
     head = head->next; 
    } 
} 

Die Einfügefunktion soll eine verknüpfte Liste erstellen und Zahlen von 0 bis i zu dieser verknüpften Liste hinzufügen. Es soll aber auch einen Zeiger auf den Anfang der Liste/der Liste selbst zurückgeben, und ich kann nicht herausfinden, wie es geht. Ich habe versucht, einen Zeiger zu machen und ihn gleich nach dem Hinzufügen des ersten Knotens einzustellen, aber er gibt nur den ersten Knoten und nicht die gesamte Liste zurück. Kann mir bitte jemand helfen? Vielen Dank.Zurückgeben eines Zeigers an den Anfang einer verknüpften Liste nach dem Hinzufügen von Knoten?

+0

Ihr größeres Problem ist, dass Sie Kopf-> nächsten keinen Wert zuweisen, so dass Sie nicht wirklich eine verknüpfte Liste erstellen, nur eine Reihe von Knoten im Raum herumschweben – happydave

+0

Ich bin mir nicht sicher, ob ich verstehen. Wäre nicht der num-Wert von head-> next 1, da ich den Kopf neu zugewiesen habe? Also wäre es eine verkettete Liste von 0-> 1-> 2-> 3 .....-> c, oder? –

+0

Wenn Sie 'head = head-> next;' zuweisen, weisen Sie einen nicht initialisierten Zeiger auf den Zeiger zu, den Sie gerade zugewiesen haben. Sie haben Speicher ausgeleckt und einen undefinierten Zeiger gespeichert. Du hast GROSSE Probleme. Die Funktion soll auch einen Wert zurückgeben, tut dies aber nicht. –

Antwort

0

Sie möchten sich wahrscheinlich den vorherigen Knoten merken, damit Sie den nächsten Zeiger zuweisen können. Wenn Sie einen Knoten hinzufügen, setzen Sie den nächsten Zeiger auf den alten Kopf und er wird jetzt zum neuen Kopf der Liste. Was Sie nach der letzten Iteration der Schleife einfach zurückgeben können.

Node *insert(int i) { 
    Node *head, *prev = NULL; 
    for (int c = 0; c < i; c++) { 
     head = malloc(sizeof(Node)); 
     head->num = i; 
     head->next = prev; 
     prev = head; 
    } 
    return head; 
} 

Update: jedes neue Element am Ende der Liste einzufügen, müssen Sie ein bisschen mehr Buchhaltung:

Node *insert(int i) { 
    Node *last_node = NULL; 
    Node *first_node = NULL; 
    for (int c = 0; c < i; c++) { 
     Node *node = malloc(sizeof(Node)); 
     node->num = i; 
     node->next = NULL; 
     if (!last_node) { 
      // Remember the first node, so we can return it. 
      first_node = node; 
     } 
     else { 
      // Otherwise, append to the existing list. 
      last_node->next = node; 
     } 
     last_node = node; 
    } 
    return first_node; 
} 
+0

Das funktioniert, aber die Liste ist jetzt von i bis 0 statt 0 bis ich. Gibt es eine Möglichkeit, es so zu machen, dass es die Reihenfolge der Liste nicht umkehrt? –

+0

@ P.Sate: Ja, es kann getan werden. Du solltest es schaffen können. Sie müssen einen Zeiger auf das letzte Element in der Liste sowie auf das erste Element halten. Sie geben die erste zurück, fügen jedoch nach der letzten neue hinzu. –

0

Es ist so einfach eine andere Variable, wie die Einführung. Sie haben derzeit head, um den Kopf der Liste zu verfolgen; Einen weiteren hinzufügen die Schwanz der Liste zu verfolgen:

struct node { 
    struct node *next; 
    int num; 
} Node; 

Node *insert(int i) { 
    Node *head; 
    Node *tail; 
    head = malloc(sizeof(Node)); 
    head.num = 0; 
    tail = head; 
    for (int c = 1; c < i; c++) { 
     // allocate a new node at the end of the list: 
     tail->next = malloc(sizeof(Node)); 
     // set "tail" to point to the new tail node: 
     tail = tail->next; 
     tail->num = c; 
    } 

    return head; 
} 

Sie auch einen Sonderfall für i == 0 bei Bedarf hinzufügen könnte.

Übrigens - und mir ist klar, dass dies möglicherweise eine Aufgabe für Sie als Übung ist - aber insert ist ein schrecklicher Name für eine Funktion, die tatsächlich erstellt und füllt eine völlig neue Liste.

Verwandte Themen