Po raz kolejny mam problem z moim projektem. Przy dodawaniu obiektu muszę zainicjować unikalne ID zaczynające się od 1. Tutaj fragment polecenia: "Program automatycznie przypisuje pierwszy wolny ID do nowego obiektu". Indeksy wierszy są prawidłowe, bo testowałam przy usuwaniu, jednak wyświetla mi nieprawidłowe ID w funkcji wyświetlania. Próbowałam z funkcją zwracającą wielkość listy, ale nie mam pojęcia jak się stamtąd odnieść do ID.
Kolejny problem, to usuwanie obiektu za pomocą tytułu. W jaki sposób mam wyszukać dany tytuł i zarazem usunąć cały wiersz?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct ObiektWypozyczenia
{
int ID; //unikalna liczba całkowita - przypisywane automatycznie przez program, najlepiej od 1
char tytul[40];
char imie_autor[20];
char nazwisko_autor[25];
char kategoria[3]; //ksiazka/film/gra planszowa;
char imie_osoba[20];
char nazwisko_osoba[25];
int ilosc_wyp; //ile razy przedmiot zostal wypozyczony
struct data_wyp
{
int rok, miesiac, dzien;
};
struct ObiektWypozyczenia *next;
struct ObiektWypozyczenia *prev;
}dane;
dane *head = NULL;
dane *tail = NULL;
int wielkosc(dane *head)
{
int d = 0;
dane *el = head;
while(el != NULL)
{
d++;
el = el->next;
}
return d;
}
void dodaj(int ID)
{
unsigned int m, n;
dane *el = head;
el = new dane;
//Pytania o dane
printf("\nPodaj dane obiektu\n");
printf("\tKategoria (1.ksiazka/2.film/3.gra planszowa): ");
scanf("%d", &m);
fflush(stdin);
if(m == 1)
{
strcpy(el->kategoria, "ksiazka");
}
else if(m == 2)
{
strcpy(el->kategoria, "film");
}
else if(m == 3)
{
strcpy(el->kategoria, "gra planszowa");
}
else
{
printf("Nieprawidlowy znak.");
}
printf("\tTytul: ");
scanf(" %[^\n]s", el->tytul);
fflush(stdin);
printf("\tImie autora: ");
scanf(" %[^\n]s", el->imie_autor);
fflush(stdin);
printf("\tNazwisko autora: ");
scanf(" %[^\n]s", el->nazwisko_autor);
fflush(stdin);
//Dodawanie elementu
if(head == NULL)
{
head = el;
ID = 1;
el->ID = ID;
el->next = NULL;
el->prev = NULL;
tail = el;
}
else
{
ID++;
el->ID = ID;
el->next = NULL;
el->prev = tail;
tail->next = el;
tail = el;
}
//Pytanie o kolejny element
printf("\n------------------------------------------\n");
printf("\n1)Dodaj nowy element\t\t2)Wroc do menu\nWybor:");
scanf("%d", &n);
fflush(stdin);
if(n == 1) {dodaj(ID);}
else if(n == 2) {}
else {printf("Nieprawidlowy znak");}
}
void usun()
{
int ID, x;
char tytul[40];
dane *el = head;
dane *wsk;
if(head == NULL)
{
return;
}
printf("Usun wedlug\n1) ID\t\t2) tytul\nWybor: ");
scanf("%d", &x);
fflush(stdin);
switch(x)
{
case 1:
unsigned int n;
printf("Podaj ID: ");
scanf("%d", &n);
fflush(stdin);
if(n == 1)
{
if(el->prev == el->next)
{
head = NULL;
free(el);
}
else
{
head = el->next;
el->prev = NULL;
el->next->ID = el->ID;
free(el);
}
}
else if(n > 1 && n <= wielkosc(head))
{
wsk = el->next;
el->next = wsk->next;
el->next->prev = el;
el->next->ID = el->ID;
el = el->next;
free(wsk);
}
else
{
printf("\nObiekt o podanym ID nie istnieje.\n");
}
break;
case 2:
char m[40];
printf("Podaj tytul: ");
scanf("%[^\n]s", m);
fflush(stdin);
while(el != NULL)
{
if(el->tytul = m)
{
if(el->prev == el->next)
{
head = NULL;
free(el);
}
else
{
head = el->next;
el->prev = NULL;
// el->next->tytul = el->tytul;
free(el);
}
break;
}
else if(m == tytul)
{
while(el != NULL)
{
el = el->next;
}
wsk = el->next;
el->next = wsk->next;
el->next->prev = el;
// el->next->tytul = el->tytul;
free(wsk);
break;
}
else
{
printf("\nObiekt o podanym tytule nie istnieje.\n");
}
el = el->next;
}
break;
default:
printf("\nNieprawidlowy znak.\n");
}
}
void wyswietl_nazwa(dane *head) //po nazwie obiektu
{
int ID;
dane *el = head;
if(el == NULL)
{
printf("Brak elementow.\n");
}
else
{
while (el != NULL)
{
printf("\nTytul: %s\tImie i nazwisko autora: %s %s\tKategoria: %s\tID: %d", el->tytul, el->imie_autor, el->nazwisko_autor, el->kategoria, el->ID);
el = el->next;
}
}
}