Односторонний связанный список и нежелательный первый элемент после заполнения

0

У меня проблема с моим единственным способом связанного списка. Он написал в С.

Для ввода:

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;
}
  • 1
    примечание: &HEAD тип LIST** .
  • 1
    Добавьте логин Add () или GDB и проследите его, чтобы увидеть, что не так.
Теги:
data-structures
linked-list
structure

2 ответа

1
Лучший ответ

Например, чтобы исправить

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;
}
  • 1
    Теперь я понимаю свою ошибку и как она работает. Благодарю. Ваш код работает.
1
if(ptr==NULL){
   ptr=el;
}

У вас здесь проблема, в этом случае вы меняете только ptr, в то время как FIRST остается неизменным, поэтому в конечном итоге вы ничего не делаете, кроме утечки памяти после возвращения.

Чтобы решить эту проблему, вы можете вернуть указатель или передать указатель по адресу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню