Warum Erstellen von doppelten Werten meiner doppelt verknüpften Liste der C -Implementierung?
-
26-10-2019 - |
Frage
Ich habe für die doppelt verknüpfte Listenimplementierung in C codiert, da ich nach dem Einsetzen von Werten eine Doppelarbeit von Werten erhalte. dh der letzte Wert, den ich in allen Listenelementen dupliziert hat.
Mein Code ist wie folgt
Header.h
#include<stdio.h>
#include<stdlib.h>
typedef struct doubly_list
{
int id;
char *name;
struct doubly_list *next;
struct doubly_list *prev;
}node;
void insertfirst(node **,int ,char *);
void insertlast(node **,int ,char *);
Double_List_insert.c
#include"header.h"
void insertfirst(node **head,int id,char *name)
{
node *tmp=(node *)malloc(sizeof(node));
if(NULL == tmp)
{
printf("\nMemory allocation failed\n");
exit(1);
}
tmp->id=id;
tmp->name=name;
tmp->prev=NULL;
if(*head== NULL)
{
tmp->next=NULL;
*head=tmp;
}
else
{
tmp->next=*head;
(*head)->prev=tmp;
*head=tmp;
}
}
void insertlast(node **head,int id,char *name)
{
if(*head==NULL)
{
insertfirst(head,id,name);
return;
}
node *last=*head;
node *tmp=(node *)malloc(sizeof(node));
if(NULL == tmp)
{
printf("\nMemory allocation failed\n");
exit(1);
}
tmp->id=id;
tmp->name=name;
tmp->next=NULL;
while(last->next!=NULL)
{
last=last->next;
}
last->next=tmp;
tmp->prev=last;
}
Double_List_traverse.c
#include"header.h"
void traverse(node *head)
{
node *tmp=head;
if(head==NULL)
{
printf("\nList is empty\n");
exit(1);
}
while(tmp!=NULL)
{
printf("%d --> %s\n",tmp->id,tmp->name);
tmp=tmp->next;
}
}
Und hier kommt die Hauptdatei,
Haupt c
#include"header.h"
int main()
{
int choice;
int id;
char name[15];
node *root=NULL;
system("clear");
while(1)
{
printf("\n1.Insert First\n");
printf("\n2.Insert Last\n");
printf("\n3.Traverse\n");
printf("\n4.Exit\n");
printf("\nEnter your choice : ");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("\nEnter the employee id : ");
scanf("%d",&id);
printf("\nEnter the employee name : ");
scanf("%s",name);
insertfirst(&root,id,name);
break;
case 2:
printf("\nEnter the employee id : ");
scanf("%d",&id);
printf("\nEnter the employee name : ");
scanf("%s",name);
insertlast(&root,id,name);
break;
case 3:
traverse(root);
break;
case 4:
return 0;
break;
default:
printf("\nPlease enter valid choices\n");
}
}
}
Während der Ausführung wird es ordnungsgemäß eingebracht, wenn ich nur eine Daten entweder zuerst oder zuletzt einfüge.
Aber wenn ich eine zweite einfüge, kommt das Problem. In meinem Fall bleibt der ID -Wert gleich. Der Name der 2. Eingabe wird jedoch im 1. Wert dupliziert.
Warum passiert das? Ist es etwas falsch daran, Argumente zu übergeben?
Lösung
Wenn Sie einen neuen Knoten erstellen, legen Sie den Knotennamen fest, indem Sie den Zeiger auf den Namen kopieren. Sie müssen die Zeichenfolge nicht den Zeiger kopieren. Das strdup
Funktion ist perfekt dafür:
tmp->name=strdup(name);
Erinnere dich an free
Der Name, wenn Sie die Knoten befreien.
Bearbeiten
Was passiert, wenn Sie anrufen insertfirst
Das erste Mal ist, dass die name
Feld des ersten Knotens verweist auf die name
Array in main
. Wenn Sie den Namen für den zweiten Knoten abrufen, ist der Inhalt des Arrays in main
wird mit dem neuen Namen aktualisiert, und da der Zeiger im ersten Knoten auf das Array verweist, scheint der Name dupliziert zu sein.