Warum Erstellen von doppelten Werten meiner doppelt verknüpften Liste der C -Implementierung?

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

  •  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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top