2016-09-26 3 views
0

Dies ist die Methode, die ich in C geschrieben habe. Sie wird in eine verkettete Liste eingefügt.Einfügen in die kreisförmige verknüpfte Liste (Ausgabe nicht wie gewünscht)

void insert_beg() 
{ 
temp=(struct node*)malloc(sizeof(struct node)); 
ptr=(struct node*)malloc(sizeof(struct node)); 

int data_value; 

printf("Enter the value\n"); 
scanf("%d",&data_value); 

temp->info=data_value; 

if(header->link==NULL)//when there is no node 
{ 
    header->link=temp; 
    temp->link=header; 
} 
else//when atleast one node has been created 
{ 
    ptr->link=header->link;//ptr is pointing to where header was pointing. 
    header->link=temp; 
    temp->link=header; 
} 

printf("\n\n"); 
} 

Dies ist der Code für Traversal (grundsätzlich angezeigt)

void traverse() 
{ 
ptr=header->link; 

while(ptr->link!=header) 
{ 
    ptr=ptr->link; 
    printf("%d\t",ptr->info); 
} 
printf("\n\n"); 
} 

Wenn das Programm ausgeführt wird, wird der Ausgang für Traversal nichts. Es ist, als ob die for-Schleife nicht läuft. Es gibt keinen Segmentierungsfehler beim Einfügen oder irgendetwas anderes. Ist meine Logik korrekt? Wenn nicht, wo gehe ich dann falsch?

+0

Ich denke, die Bedingung sollte 'if (header == NULL)' sein. Dann 'temp-> link = ptr-> link'. Sonst würden Sie den ursprünglichen 'header-> link' – Sharad

+0

in der' insert_beg'-Funktion verlieren, warum werden zwei Objekte von 'node' erzeugt? – PRP

+0

@PRP wenn ich das PTR-Objekt entfernte, dann entsteht ein Problem mit dem else Teil des Codes. Ich habe einen Segmentierungsfehler erhalten. Also, warum .. – sindhugauri

Antwort

1

Der ursprüngliche Wert header->link geht wegen falscher Zuweisungen verloren. Auch brauchen Sie nicht malloc für Variable ptr. Ändern Sie Ihren if/else-Block.

if (header == NULL){ 
    header = temp 
    header->link = temp 
} 
else//when atleast one node has been created 
{ 
    ptr=header->link;//ptr is pointing to where header was pointing. 
    header->link=temp; 
    temp->link=ptr; 
} 

Grundsätzlich sind Sie immer versuchen, mit Ihrem else block an der zweiten Position hinzufügen, aber statt die alten Daten auf dem dritten Platz setzen Sie zeigen Ihre zweiten Kopf zurück.

Ich sehe auch einige grundlegende Probleme mit dem obigen Code. Der Code akzeptiert weder eine Zeigervariable noch einen Zeiger. Sobald die Funktion zurückkehrt, gibt es keine Möglichkeit, auf die Daten zuzugreifen.

Wenn Header eine globale Variable ist, dann sollte dies die Änderung sein. malloc von temp und alles andere mit temp verbunden sind, sollten innerhalb des else Block bewegen, wie wir sie nicht für if

if (header->link == NULL){ 
    header->data = data 
    header->link = header 
} 

Teil benötigen Wenn Header dann nicht eine globale Variable ist die komplette Problem zu lösen, sollte Funktion modifiziert werden als

void insert_beg(struct node **header_dptr) #A double pointer 
{ 
    header = *header_dptr 
    temp=(struct node*)malloc(sizeof(struct node)); 
    int data_value; 

    printf("Enter the value\n"); 
    scanf("%d",&data_value); 

    temp->info=data_value; 

    if(header==NULL)//when there is no node 
    { 
     header=temp; 
     header->link=temp; 
    } 
    else//when atleast one node has been created 
    { 
     ptr=header->link;//ptr is pointing to where header was pointing. 
     header->link=temp; 
     temp->link=ptr; 
    } 

printf("\n\n"); 
} 
+0

können wir 'temp-> link = header-> link; header-> link = temp; 'um einen temporären Zeiger zu vermeiden? – PRP

+0

Ja, wir können das tun, aber ich habe den ursprünglichen Code beibehalten, damit das OP den Fehler im Originalcode versteht. – Sharad

+0

@Sharad Ich bekomme einen Segmentierungsfehler mit diesem Code. (beim Durchlauf). Was ist der Unterschied zwischen header-> link = temp und header = temp? Es tut mir leid, wenn das dumm klingt, aber ich bin jetzt wirklich verwirrt. – sindhugauri

Verwandte Themen