Lista jednokierunkowa

0

Mam 3 problemy z programem dotyczącym list i struktur. Mianowicie w funkcji, która ma usuwać dany element, nie jest usuwany pierwszy element. Funkcja do kasowania całej listy nie działa poprawnie, wydaje mi się, że jest pewno lepszy pomysł na wykonanie takiej czynności niż mój. No i nie mam pojęcia dlaczego do listy dodaje mi 2 na samym początku.

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

typedef struct element {
    int val;
    struct element *next;
} el_listy;

el_listy *first;

void add_to_list(el_listy *lista, int liczba)
{
    el_listy *wsk = lista, *nowy;
    while (wsk->next != NULL)
    {
        wsk = wsk->next;
    }
    nowy = (el_listy *) malloc (sizeof(el_listy));
    nowy->val = liczba;
    nowy->next = NULL;
    wsk->next = nowy;
}

int prime_number(el_listy *lista, int liczba)
{
    el_listy *wsk = first;
    while (wsk != NULL)
    {
        if ((liczba%wsk->val)==0) return 0;
        wsk = wsk->next;
    }
    return 1;
}

void wri_out(el_listy *lista)
{
    el_listy *wsk = lista;
    while (wsk!=NULL)
    {
        printf("\n%d", wsk->val);
        wsk=wsk->next;
    }
}

void add_to_end(el_listy *lista, int number)
{
    el_listy *end;
    while (lista->next!=NULL)
    {
        lista = lista->next;
    }
    end = (el_listy *) malloc (sizeof(el_listy));
    end->val = number;
    end->next = NULL;
    lista->next = end;
}

void remove_e(el_listy *lista, int number)
{
    int n = 0;
    el_listy *subse;
    el_listy *prev;
    while(lista->val!=number)
    {
        prev = lista;
        lista = lista->next;
        n++;
    }
    if (n==0)
    {
       lista = lista->next->next;
    } else {
        subse = lista->next;
        prev->next = subse;
    }
}

void del_the_list(el_listy *lista)
{
    el_listy *prev;
    while (lista->next!=NULL)
    {
        prev = lista;
        lista = lista->next;
        prev->next = NULL;
    }
    printf("Lista usunieta!");
    free (lista);
}

int main()
{
    int choice, i=3, dig,el;
    const int END = 100;
    first = (el_listy *) malloc (sizeof(el_listy));
    first->val = 2;
    first->next = NULL;

    for (;i!=END;++i)
    {
        if (prime_number(first, i))
        {
           add_to_list(first, i);
        }
    }

    printf("Menu:");
    printf("\n1. Kasowanie listy, wybierz 1.");
    printf("\n2. Dodawanie elementu na koniec listy, wybierz 2.");
    printf("\n3. Usuwanie elementu o podanej wartosci (liczby pierwsze do 100), wybierz 3.");
    printf("\n4. Wypisywanie listy, wybierz 4.");

    do {
    printf("\nCo chcesz zrobic?");
    scanf("%d", &choice);
    } while (choice!=1 && choice!=2 && choice!=3 && choice!=4);

    switch (choice)
    {
        {
            case 1:
            printf("\n");
            del_the_list(first);
            wri_out(first);
            break;
        }
        {
            case 2:
            printf("\n");
            printf("\nJaka liczbe dodac na koniec listy: ");
            scanf("%d", &dig);
            add_to_end(first, dig);
            printf("\n");
            wri_out(first);
            break;
        }
        {
            case 3:
            printf("\n");
            printf("\nElement do usuniecia: ");
            scanf("%d", &el);
            remove_e(first,el);
            printf("\n");
            wri_out(first);
            break;
        }
        {
            case 4:
            wri_out(first);
            break;
        }
    }

    getch();
    free(first);
    return 0;
}

 

Ok, z problemem usuwania listy prawie sobie poradziłem. Prawie, tzn. nie usuwa mi tej denerwującej 2.

0

poszukaj na necie albo na tym forum o usuwaniu elementów z listy jednokierunkowej w C. praktycznie każdy robi ten sam błąd co Ty.

0

Niestety, nie mogłem znaleźć rozwiązania. Tzn. widziałem sposoby uporania się z problemem, ale są one przedstawione w języku C++, gdzie można użyć funkcji delete. W C zamiennikiem może być funkcja free, której użyłem w programie, lecz nie dała pożądanego efektu.

0

podam Ci minimalny kod który już powoduje ten błąd i pod spodem analogicznie taki sam tylko zamiast wskaźnika użyję zwykłego inta, a do problemu dojdź sam:

void usun(int* cos)
{
  free(cos);
  cos = NULL;
}
int main()
{
  int* cos = new int;
  usun(cos);
  return 0;
}
#include <stdio.h>
void zmien(int cos)
{
  cos = 5;
}
int main()
{
  int cos = 4;
  printf("cos=%d\n");
  zmien(cos);
  printf("cos=%d\n");
  return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1