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.