Pourquoi ma mise en œuvre de la liste doublement chaînée C la création de valeurs en double?

StackOverflow https://stackoverflow.com/questions/8340531

  •  26-10-2019
  •  | 
  •  

Question

I codé pour la mise en œuvre de la liste doublement chaînée en C. Dans ce, après avoir fait l'insertion des valeurs, je reçois la duplication des valeurs. à savoir la dernière valeur donnée par me dupliquée dans tous les éléments de la liste.

Mon code est le suivant

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 *);

doubly_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;
    }

doubly_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;
 }
}

Et, vient ici le fichier principal,

main.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");
  }
 }
}

Lors de l'exécution de son entrée obtenir de moi bien, si j'insérer seulement une donnée première ou dernière.

Mais si j'insérer une seconde, il vient le problème. Dans mon cas, l'identifiant reste le même. Mais la 2ème valeur de nom de l'entrée est dupliqué en valeur 1er.

Pourquoi cela se passe? Est-il quelque chose de mal à faire passer des arguments?

Était-ce utile?

La solution

Lorsque vous créez un nouveau nœud, vous définissez le nom de noeud en copiant simplement le pointeur sur le nom. Vous devez copier la chaîne pas le pointeur. La fonction strdup est parfait pour cela:

tmp->name=strdup(name);

Souvenez-vous de free le nom lorsque vous libérez les nœuds.

Modifier

Qu'est-ce qui se passe lorsque vous appelez insertfirst la première fois, est que le champ name des premiers points de nœud au tableau de name dans main. Lorsque vous allez chercher le nom du second noeud, le contenu du tableau dans main est mis à jour avec le nouveau nom, et depuis le pointeur dans les premiers points de nœud à ce tableau, il semble que le nom est dupliqué.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top