У меня проблема с моим единственным способом связанного списка. Он написал в С.
Для ввода:
3
4 5 6
Выход
0 4 5 6
Таким образом, 0 является нежелательным. Что я делаю неправильно, неверный список? Похоже, что в функции Add() сначала "if" не выполняется. Но почему, поскольку пропущенный список пуст.
Вот какой код:
#include <stdio.h>
#include <stdlib.h>
typedef struct ELEMENT{
int dane;
struct ELEMENT *next;
}LIST;
void Add(LIST *FIRST, int x){
LIST *ptr=FIRST,*el;
el=(LIST*)malloc(sizeof(LIST));
el->dane=x;
el->next=NULL;
if(ptr==NULL){
ptr=el;
}else{
while(ptr->next!=NULL){
ptr=ptr->next;
}
ptr->next=el;
}
}
void Show(LIST *FIRST){
LIST *ptr=FIRST;
while(ptr!=NULL){
printf("%d ",ptr->dane);
ptr=ptr->next;
}
while(ptr!=NULL){
ptr=ptr->next;
free(ptr);
}
}
LIST *HEAD=NULL;
int main()
{
int i,counter,data;
printf("Give me some data: \n");
scanf("%d",&counter);
for(i=0;i<counter;i++){
scanf("%d",&data);
Add(&HEAD,data);
}
printf("\nMy items:");
Show(&HEAD);
return 0;
}
Например, чтобы исправить
void Add(LIST **FIRST, int x){
LIST *ptr=*FIRST,*el;
el=(LIST*)malloc(sizeof(LIST));
el->dane=x;
el->next=NULL;
if(ptr==NULL){
*FIRST=el;
}else{
while(ptr->next!=NULL){
ptr=ptr->next;
}
ptr->next=el;
}
}
void Show(LIST *FIRST){
LIST *ptr=FIRST;
while(ptr!=NULL){
printf("%d ",ptr->dane);
ptr=ptr->next;
}
ptr=FIRST;
while(ptr!=NULL){
LIST *tmp = ptr;
ptr=ptr->next;
free(tmp);
}
}
LIST *HEAD=NULL;
int main()
{
int i,counter,data;
printf("Give me some data: \n");
scanf("%d",&counter);
for(i=0;i<counter;i++){
scanf("%d",&data);
Add(&HEAD,data);
}
printf("\nMy items:");
Show(HEAD);
return 0;
}
if(ptr==NULL){
ptr=el;
}
У вас здесь проблема, в этом случае вы меняете только ptr, в то время как FIRST остается неизменным, поэтому в конечном итоге вы ничего не делаете, кроме утечки памяти после возвращения.
Чтобы решить эту проблему, вы можете вернуть указатель или передать указатель по адресу.
&HEAD
типLIST**
.