• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C - problem z dodawaniem do listy uporzadkowanej

VPS Starter Arubacloud
0 głosów
160 wizyt
pytanie zadane 26 kwietnia 2017 w C i C++ przez NyguseK Użytkownik (650 p.)
edycja 26 kwietnia 2017 przez NyguseK

Witam. Siedzę już dłuższy czas nad tym kodem szukając błędu. Chodzi o to, że jeżeli chcę, dodać element za jakimś z pozostałych, program się wyłącza. Załączam kod i bardzo proszę o pomoc :)

 

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

struct list
{
    int data;
    struct list *next;
};

void create_list(struct list** front, int data)
{
    struct list *new_element = (struct list*)malloc(sizeof(struct list));
    if(new_element)
    {
        new_element->data = data;
        new_element -> next = NULL;
        *front = new_element;
    }
    else puts("Nie udalo sie dodac elementu");
}

void add_front(struct list** front, struct list* new_node)
{
    new_node->next = *front;
    *front = new_node;
}

struct list* find_spot(struct list* front, int data)
{
    struct list* prev = NULL;
    while(front && front->data < data)
    {
        prev = front;
        front = front->next;
    }
    return prev;
}

void add_midle(struct list* prev, struct list* new_node)
{
    new_node->next = prev->next;
    prev->next = new_node;
}

void add_to_list(struct list** front)
{
    int data;
    struct list* new_node = (struct list*)malloc(sizeof(struct list));
    puts("Podaj liczbe, ktora chcesz dodac: ");
    scanf("%d", &data);
    if(!(*front))
        create_list(front, data);
    else
    {
        if(new_node)
        {
            new_node->data = data;
            if((*front)->data>=data) add_front(front, new_node);
            else
            {
                struct list* prev = find_spot(front, data);
                add_midle(prev, new_node);
            }
        }
    }
}

void print_list_b(struct list* front)
{
    if(!front) puts("Brak elementow.");
    else
    {
        while(front)
        {
            printf("%p ", &(front->data));
            front = front->next;
        }
    }
}

void print_list(struct list* front)
{
    if(!front) puts("Brak elementow.");
    else
    {
        while(front)
        {
            printf("%d ", (front->data));
            front = front->next;
        }
    }
}
int main()
{
    int option = -1;
    struct list *front = NULL;
    while(option!=0)
    {
        puts("Elementy listy:");
        print_list(front);
        puts("");
        print_list_b(front);
        puts("");
        puts("1. Dodaj element.");
        scanf("%d", &option);
        if(option == 1) add_to_list(&front);

    }
    return 0;
}

 

komentarz 26 kwietnia 2017 przez .kassad Gaduła (3,420 p.)
Czy dostajesz jakiś komunikat o błędzie?
komentarz 26 kwietnia 2017 przez NyguseK Użytkownik (650 p.)
NIe dostaje żadnego komunikatu. Teraz dodalem & w jednym miejscu, teraz nie wywala zadnego błędu, tylko po prostu nie dodaje kolejnego elementu.

2 odpowiedzi

0 głosów
odpowiedź 26 kwietnia 2017 przez .kassad Gaduła (3,420 p.)
wybrane 26 kwietnia 2017 przez NyguseK
 
Najlepsza
Linia 61:
jest : struct list* prev = find_spot(front, data);
powinno być: struct list* prev = find_spot(*front, data);

To chyba jedyne co poprawiłem.

Teraz się sypie przy próbie dodania czegoś na początek listy (tzn przy dodawaniu elementu mniejszego od wszystkich dotychczas dodanych). Problem tkwi w tym, że do funkcji add_front jest przekazywana kopia wskaźnika na początek listy, bo w środku funkcji przypisanie jest odpowiednie, ale poza funkcją wygląda tak jakby przypisania nie było. Ale wymyśliłem, że funkcja add_front mogłaby zwracać wskaźnik na nowy początek i w miejscu, gdzie jest wywołana, możnaby zrobić to przypisanie.
komentarz 26 kwietnia 2017 przez NyguseK Użytkownik (650 p.)
Za chwilkę to zmienię. Dziękuję za pomoc :)
0 głosów
odpowiedź 26 kwietnia 2017 przez NyguseK Użytkownik (650 p.)

Poprawilem chyba tylko tę linijkę.. wszystko działa jak należy. Dziękuję za pomoc! :)

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

struct list
{
    int data;
    struct list *next;
};

void create_list(struct list** front, int data)
{
    struct list *new_element = (struct list*)malloc(sizeof(struct list));
    if(new_element)
    {
        new_element->data = data;
        new_element -> next = NULL;
        *front = new_element;
    }
    else puts("Nie udalo sie dodac elementu");
}

void add_front(struct list** front, struct list* new_node)
{
    new_node->next = *front;
    *front = new_node;
}

struct list* find_spot(struct list* front, int data)
{
    struct list* prev = NULL;
    while(front && front->data < data)
    {
        prev = front;
        front = front->next;
    }
    return prev;
}


void add_midle(struct list* prev, struct list* new_node)
{
    new_node->next = prev->next;
    prev->next = new_node;
}

void add_to_list(struct list** front)
{
    int data;
    struct list* new_node = (struct list*)malloc(sizeof(struct list));
    puts("Podaj liczbe, ktora chcesz dodac: ");
    scanf("%d", &data);
    if(!(*front))
        create_list(front, data);
    else
    {
        if(new_node)
        {
            new_node->data = data;
            if((*front)->data>=data) add_front(front, new_node);
            else
            {
                struct list* prev = find_spot(*front, data);
                add_midle(prev, new_node);
            }
        }
    }
}

void print_list_b(struct list* front)
{
    if(!front) puts("Brak elementow.");
    else
    {
        while(front)
        {
            printf("%p ", &(front->data));
            front = front->next;
        }
    }
}

void print_list(struct list* front)
{
    if(!front) puts("Brak elementow.");
    else
    {
        while(front)
        {
            printf("%d ", (front->data));
            front = front->next;
        }
    }
}

struct list* find_element(struct list* front, int data)
{
    struct list* prev = NULL;
    while(front && front->data != data)
    {
        prev = front;
        front = front -> next;
    }
    printf("%d", prev->data);
    return prev;
}

void delete_middle(struct list* prev)
{
            struct list* tmp = prev->next;
            if(tmp->next==NULL)
            {
                prev->next = tmp->next;
                free(prev->next);
            }
            else
            {
                prev->next = tmp->next;
                prev = tmp->next;
                free(prev->next);
            }
}

void delete_from_list(struct list** front)
{
    if(!(*front)) puts("Lista jest pusta");
    else
    {
        int data;
        puts("Podaj liczbe, ktora chcesz usunac: ");
        scanf("%d", &data);
        if((*front)->data == data)
        {
            struct list* tmp = (*front)->next;
            free(*front);
            *front = tmp;
        }
        else
        {
            struct list* prev = find_element(*front, data);
            delete_middle(prev);
        }
    }
}

void remove_list(struct list** front)
{
    struct list* tmp = NULL;
    while(*front)
    {
        tmp = (*front)->next;
        (*front) = NULL;
        free((*front));
        (*front) = tmp;


    }
}
int main()
{
    int option = -1;
    struct list *front = NULL;
    while(option!=0)
    {
        puts("Elementy listy:");
        print_list(front);
        puts("");
        print_list_b(front);
        puts("");
        puts("1. Dodaj element.");
        puts("2. Usun element.");
        puts("3. Usun liste.");
        scanf("%d", &option);
        if(option == 1) add_to_list(&front);
        if(option == 2) delete_from_list(&front);
        if(option == 3) remove_list(&front);

    }
    return 0;
}

 

Podobne pytania

0 głosów
1 odpowiedź 184 wizyt
pytanie zadane 12 sierpnia 2016 w C i C++ przez mmr0429 Bywalec (2,010 p.)
0 głosów
1 odpowiedź 2,086 wizyt
pytanie zadane 5 stycznia 2017 w C i C++ przez Domi9705 Nowicjusz (120 p.)
+1 głos
1 odpowiedź 727 wizyt
pytanie zadane 23 kwietnia 2021 w C i C++ przez Mavimix Dyskutant (8,390 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...