Узел в связанном списке не удаляется должным образом? - PullRequest
0 голосов
/ 03 января 2019

Я разместил код MCVE, который можно скопировать и запустить в любой среде IDE для проверки результатов.

Вход в связанный список выглядит следующим образом:

Kevlar Epoxy 43.75 18.90 1.48 0.34 0.148 3.93
Kevlar Polycarbonate 43.40 14.00 1.39 0.34 0.110 2.75
Kevlar ABS 43.42 13.94 1.35 0.35 0.112 2.74

Результат, который я ищу:

Kevlar Epoxy 43.75 18.90 1.48 0.34 0.148 3.93
Kevlar ABS 43.42 13.94 1.35 0.35 0.112 2.74

Результат, который я получаю:

Kevlar Epoxy 43.75 18.90 1.48 0.34 0.148 3.93
Some random symbols 43.40 14.00 1.39 0.34 0.110 2.75
Kevlar ABS 43.42 13.94 1.35 0.35 0.112 2.74

В этой задаче я пытаюсь удалить промежуточный узел, поэтому я не рассматриваю первый и последний узел. Пожалуйста, может кто-нибудь сообщить мне, почему это происходит?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct lamina
{
  char lamina_fiber[30];
  char lamina_matrix[30];
  float E1,E2,p,v12,v21,G12;
  struct lamina *nextnode;
};

 int main()
{
  struct lamina *head,*data;
  head=(struct lamina *)calloc(1,sizeof(struct lamina));
  data=head;

 strcpy(data->lamina_fiber,"Kevlar");
 strcpy(data->lamina_matrix,"Epoxy");
 data->E1= 43.75;
 data->E2= 18.90;
 data->p= 1.48;
 data->v12= 0.34;
 data->v21= 0.148;
 data->G12= 3.93;

 data->nextnode=(struct lamina *)calloc(1,sizeof(struct lamina));
 data=data->nextnode;

 strcpy(data->lamina_fiber,"Kevlar");
 strcpy(data->lamina_matrix,"Polycarbonate");
 data->E1= 43.40;
 data->E2= 14.00;
 data->p= 1.39;
 data->v12= 0.34;
 data->v21= 0.110;
 data->G12= 2.75;

 data->nextnode=(struct lamina *)calloc(1,sizeof(struct lamina));
 data=data->nextnode;     

strcpy(data->lamina_fiber,"Kevlar");
strcpy(data->lamina_matrix,"ABS");
data->E1= 43.42;
data->E2= 13.94;
data->p= 1.35;
data->v12= 0.35;
data->v21= 0.112;
data->G12= 2.74;

data=head;

struct lamina *temp,*anothertemp;
temp=(struct lamina *)calloc(1,sizeof(struct lamina));
anothertemp=(struct lamina *)calloc(1,sizeof(struct lamina));

temp=data;
size_t i=0;

while(i<1)
{    
 temp=temp->nextnode; 
 i++;
}

if(i==1)
{
 anothertemp=temp->nextnode;
 anothertemp=temp;
 free(temp); 
}

  for(int i=0;i<3;i++)
   {
      printf("%s %s %5.2f %5.2f %5.2f %5.2f %5.2f %5.2f\n",
      data->lamina_fiber,data->lamina_matrix,data->E1,data->E2,data->p, 
      data->v12,data->v21,data->G12);
      data=data->nextnode;
   }

}

1 Ответ

0 голосов
/ 03 января 2019
strcpy(data->lamina_fiber,"Kevlar");
strcpy(data->lamina_fiber,"Polycarbonate");

должно быть

strcpy(data->lamina_fiber,"Kevlar");
strcpy(data->lamina_matrix,"Polycarbonate");

В противном случае вы печатаете неинициализированную память (что является причиной ваших «некоторых случайных символов»)

Кроме того, если вы пытаетесь удалить второй узел, вы должны изменить первый узел (заголовок):

head->next = head->next->next;

Чтобы освободить удаленный узел, сначала сохраните head->next во временную переменную и, наконец, освободите его.

...