Почему реализация моей вдвойне связанной списка C Создание дублирующих значений?

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

  •  26-10-2019
  •  | 
  •  

Вопрос

Я кодировал для вдвойне связанной реализации списка в C. В этом, после введения значений я получаю дублирование значений. т.е. последнее значение, предоставленное мне, дублировано во всех элементах списка.

Мой код выглядит следующим образом

заголовок

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

Дважды_листа_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;
    }

Дважды_листа_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;
 }
}

И вот идет основной файл,

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

Во время выполнения его правильно получает вклад, если я вставляю только один данные первым или последним.

Но если я вставлю второй, возникает проблема. В моем случае значение идентификатора остается прежним. Но значение имени 2 -го ввода дублируется в 1 -м значении.

Почему это происходит? Это что -то не так в мимолетных аргументах?

Это было полезно?

Решение

Когда вы создаете новый узел, вы устанавливаете имя узла, просто копируя указатель на имя. Вы должны скопировать строку, а не указатель. А strdup Функция идеально подходит для этого:

tmp->name=strdup(name);

Запомни free Имя, когда вы освобождаете узлы.

Редактировать

Что происходит, когда вы звоните insertfirst в первый раз, что name поле первого узла указывает на name массив в main. Анкет Когда вы получаете имя для второго узла, содержимое массива в main обновляется новым именем, и, поскольку указатель в первом узле указывает на этот массив, кажется, что имя дублируется.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top