Почему реализация моей вдвойне связанной списка C Создание дублирующих значений?
-
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
обновляется новым именем, и, поскольку указатель в первом узле указывает на этот массив, кажется, что имя дублируется.