2016-07-28 7 views
0

Ich bin ein wenig Neuling in diesem. Ich wollte nur fragen, warum ändert sich der Wert von start nicht, aber wie ändert sich der Wert von p bei jedem folgenden Aufruf?Single Linked List in C-Wert des Parameters

Der Code lautet:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct Node { 
    int elt; 
    struct Node *next; 
} node; 

void insert (int, node *); 
void delete (int, node *); 
void print (node *); 
int find (int, node *); 
void insertp (int, node *); 
node *findp (int, node *); 

main() 
{ 
    node *start, *temp; 
    node *q; 
    start = (node *) malloc (sizeof (node)); 
    temp = start; 
    temp->next = NULL; 
    printf ("Start before while : %d \n", start); 
    printf ("Start is pointing to : %d \n", start->next); 
    int choice; 
    while (1) { 
     printf 
      ("1.Insert \n2.Display \n3.Find \n4.Insert at given position \n5.Delete \n"); 
     scanf ("%d", &choice); 
     if (choice == 1) { 
      int data; 
      scanf ("%d", &data); 
      insert (data, start); 
      printf ("Start inside while : %d \n", start); 
     } 
     if (choice == 2) { 
      print (start->next); 
      printf ("\n"); 
     } 
     if (choice == 3) { 
      int fin; 
      scanf ("%d", &fin); 
      if (find (fin, start) == 1) 
       printf ("Found \n"); 
      else 
       printf ("Not Found \n"); 
     } 
     if (choice == 4) { 
      int ins; 
      scanf ("%d", &ins); 
      int x; 
      scanf ("%d", &x); 
      q = findp (x, start); 
      insertp (ins, q); 
     } 
    } 
} 

void insert (int x, node * p) 
{ 
    while (p->next != NULL) 
     p = p->next; 
    p->next = (node *) malloc (sizeof (node)); 
    p = p->next; 
    p->elt = x; 
    p->next = NULL; 
    printf ("P : %d \n", p); 
} 

void print (node * q) 
{ 
    if (q == NULL) { 
     return; 
    } 
    printf ("%d ", q->elt); 
    print (q->next); 
} 

int find (int x, node * p) 
{ 
    while (p != NULL) { 
     if (p->elt == x) 
      return 1; 
     p = p->next; 
    } 
    return 0; 
} 

void insertp (int x, node * p) 
{ 
    node *tmpcell = (node *) malloc (sizeof (node)); 
    tmpcell->elt = x; 
    tmpcell->next = p->next; 
    p->next = tmpcell; 
} 

node *findp (int x, node * p) 
{ 
    while (p != NULL && p->elt != x) 
     p = p->next; 
    return p; 
} 
+0

Jetzt .. Ich habe eine grundlegende Formatierung zu Ihrer Frage hinzugefügt. fixieren Sie den Eindruck selbst. –

+0

Willkommen bei Stack Overflow. Bitte lesen Sie die [Über] Seite bald. Lesen Sie dringend, wie Sie ein MCVE erstellen ([MCVE]). Ihr Problem ist mit ziemlicher Sicherheit das Standardverfahren, bei dem Sie entweder einen Zeiger auf einen Zeiger in Ihre 'insert *()' -Funktionen übergeben müssen oder einen Zeiger aus den Funktionen zurückgeben müssen - Ihre Funktion kann den Wert in der aufrufenden Funktion nicht ändern direkt wie geschrieben. Es gibt viele, viele Fragen zu SO, wo dies das Problem ist. Nur wenige von ihnen haben gute Noten, weil die Frage so häufig ist. –

+0

Sie haben den Anfang von "start = (node ​​*) malloc (sizeof (node));" initialisiert, und es gibt keine Anweisung in der Schleife, bei der start geändert wurde, also haben Sie den Start bei aufeinanderfolgenden Aufrufen nicht geändert, also wie Veränderung? – Rupsingh

Antwort

0

Für den Wert von Start müssen Sie in der Adresse des Starts in der Insert-Funktion und ändern Sie es wie die folgenden sein passieren zu ändern. Nur dann ändert sich der Startwert bei jedem Einsatz.

void insert(int x,node **p) 
{ 
    while((*p)->next!=NULL) 
     (*p)=(*p)->next; 
    (*p)->next=(node *)malloc(sizeof(node)); 
    (*p)=(*p)->next; 
    (*p)->elt=x; 
    (*p)->next=NULL; 
    printf("P : %d \n",p); 
}