Perché la mia lista doppiamente collegata all'attuazione C creare valori duplicati?

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

  •  26-10-2019
  •  | 
  •  

Domanda

I codificato per l'attuazione lista doppiamente collegata in C. In questo, dopo aver effettuato l'inserimento di valori, sto ottenendo la duplicazione di valori. vale a dire l'ultimo valore dato da me ripetuto in tutte le voci di elenco.

Il mio codice è il seguente

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

E, ecco che arriva il file principale,

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

Durante l'esecuzione il suo avere un input da me correttamente, se inserisco solo uno dei dati sia prima o l'ultima.

Ma se inserisco un secondo, arriva il problema. Nel mio caso, il valore id rimane lo stesso. Ma il valore nome del 2 ° ingresso è duplicato in 1 ° valore.

Perché questo sta accadendo? E 'qualcosa di sbagliato nel passaggio di argomenti?

È stato utile?

Soluzione

Quando si crea un nuovo nodo, è possibile impostare il nome del nodo, semplicemente copiando il puntatore al nome. Bisogna copiare la stringa di non il puntatore. La funzione strdup è perfetto per questo:

tmp->name=strdup(name);

Ricordate di free il nome quando si libera i nodi.

Modifica

Che cosa accade quando si chiama insertfirst la prima volta, è che il campo name dei primi punti di nodo alla matrice name in main. Quando si recupera il nome per il secondo nodo, il contenuto della matrice in main viene aggiornato con il nuovo nome, e dal momento che il puntatore nei primi punti nodali di tale matrice sembra che il nome viene duplicato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top