Siedzę po nocy i piszę swoj programik :], mam juz sporo, ale jest problem :-o, do tej pory mam napisane 2 funkcje z menu (1. dodaj element, 2. Pokaz/usun). Ale one nie działają :(, czy ktos widzi tutaj dlaczego? :(, jest to moj pierwszy program w c, do tej pory pisalem w pascalu i najprawdopodobniej bledem jest jakies male g...., ale nie wiem co :/.
#include <stdio.h>
#include <stdlib.h>
int getch(void);
void clrscr(void);
void gotoxy(int x, int y);
int UsunElement(struct OpisCD *glowa, struct OpisCD *temp);
void DodajElement(void);
int EdytujElement(struct OpisCD *temp);
struct OpisCD
{
char zespol[30];
char nazwacd[30];
int rok;
char wytwornia[30];
char pozyczony[30];
char czas[30];
struct OpisCD *nastepny, *poprzedni;
};
struct OpisCD *glowa=NULL;
char sortowany;
int ilosc=0;
int PorownajElementy(char sortowany, struct OpisCD *wsk1, struct OpisCD *wsk2)
{
int i=0;
switch (sortowany)
{
case '1': if (wsk1->zespol < wsk2->zespol) i=1;
break;
case '2': if (wsk1->nazwacd < wsk2->nazwacd) i=1;
break;
case '3': if (wsk1->wytwornia < wsk2->wytwornia) i=1;
break;
case '4': if (wsk1->rok < wsk2->rok) i=1;
break;
}
return i;
}
int DodajDoPosortowanej(struct OpisCD *glowa, char zespol[30], char nazwacd[30],
int rok, char wytwornia[30], char pozyczony[30],
char czas[30])
{
struct OpisCD *temp, *dodawany;
int i, z;
dodawany = malloc(sizeof(struct OpisCD));
if (dodawany!=NULL) exit(0);
//for (i=0;i<30;i++)
{
dodawany->zespol[0] = zespol[0];
//dodawany->nazwacd = nazwacd;
//dodawany->wytwornia = wytwornia;
//dodawany->pozyczony = pozyczony;
//dodawany->czas = czas;
}
dodawany->rok = rok;
if (glowa==NULL)
{
glowa = dodawany;
dodawany->nastepny = NULL;
dodawany->poprzedni = NULL;
}
else if (PorownajElementy(sortowany,dodawany,glowa)=='1')
{
dodawany->poprzedni=NULL;
dodawany->nastepny=glowa;
glowa->poprzedni=dodawany;
glowa=dodawany;
}
else
{
temp=glowa;
z=0;
while ((temp->nastepny!=NULL) & (z=0))
{
temp=temp->nastepny;
if (PorownajElementy(sortowany,dodawany,temp)=='1')
{
temp->poprzedni->nastepny=dodawany;
dodawany->poprzedni=temp->poprzedni;
dodawany->nastepny=temp;
temp->poprzedni=dodawany;
z=1;
}
}
if (z==0)
{
temp->nastepny=dodawany;
dodawany->poprzedni=temp;
dodawany->nastepny=NULL;
}
}
ilosc=ilosc+1;
temp = NULL;
return 0;
}
int PokazUsun(void)
{
struct OpisCD *temp;
char putemp;
int numercd=1;
temp = glowa;
while (temp!=NULL)
{
printf(" Numer CD: %d\n", numercd);
printf(" Zespol: %s\n", temp->zespol);
printf(" Nazwa CD:: %s\n", temp->nazwacd);
printf(" Rok: %d\n", temp->rok);
printf(" Wytwornia: %s\n", temp->wytwornia);
printf(" Pozyczony: %s\n", temp->pozyczony);
printf(" Czas Plyty: %s\n", temp->czas);
gotoxy(62,13);
printf("| Menu: |\n"); gotoxy(62,14);
printf("| P - poprzedni |\n"); gotoxy(62,15);
printf("| N - nastepny |\n"); gotoxy(62,16);
printf("| U - usun |\n"); gotoxy(62,17);
printf("| E - edytuj |\n"); gotoxy(62,18);
printf("| W - powrot |\n"); gotoxy(62,19);
printf("==================\n");
putemp = getch();
switch (putemp){
case 'P', 'p':
if ((temp->poprzedni)!=NULL)
{
temp=temp->poprzedni;
numercd = numercd -11;
} break;
case 'N', 'n':
if ((temp->nastepny)!=NULL)
{
temp=temp->nastepny;
numercd = numercd +1;
} break;
case 'U', 'u':
gotoxy(1,21);
printf("Czy chcesz usunac element? (T/N)\n");
putemp=getch();
if ((putemp='t') || (putemp='T'))
{
UsunElement(glowa,temp);
return 0;
}
gotoxy(1,21);
printf(" \n");
break;
case 'E', 'e': EdytujElement(temp); break;
case 'W', 'w': temp = NULL; break;
}
}
return 0;
}
int UsunElement(struct OpisCD *glowa, struct OpisCD *temp)
{
if (temp->poprzedni==NULL)
{
glowa=temp->nastepny;
if (temp->nastepny!=NULL)
temp->nastepny->poprzedni=NULL;
}
else if (temp->nastepny==NULL)
{
temp->poprzedni->nastepny=NULL;
}
else
{
temp->poprzedni->nastepny=temp->nastepny;
temp->nastepny->poprzedni=temp->poprzedni;
}
free(temp);
ilosc = ilosc-1;
return 0;
}
int EdytujElement(struct OpisCD *temp)
{
char roktemp[4];
gotoxy(1,21);
printf("Edycja istniejacego elementu.\n");
gotoxy(1,14);
printf(" ");
gotoxy(1,14);
printf(" Zespol: ");
gets(temp->zespol);
printf(" ");
gotoxy(1,15);
printf(" Nazwa CD: ");
gets(temp->nazwacd);
printf(" ");
gotoxy(1,16);
printf(" Rok: ");
*roktemp='1';
while ((atoi(roktemp)<1900) || (atoi(roktemp)>2020))
{
gotoxy(7,16);
gets(roktemp);
if ((atoi(roktemp)<1900) || (atoi(roktemp)>2020))
{
gotoxy(1,22);
printf("Blad. Wpisz ponownie! (wartosc miedzy 1900 a 2020).");
}
}
temp->rok=atoi(roktemp);
gotoxy(1,22);
printf(" ");
gotoxy(1,17);
printf(" Wytwornia: ");
gets(temp->wytwornia);
printf(" ");
gotoxy(1,18);
printf(" Pozyczony: ");
gets(temp->pozyczony);
printf(" ");
gotoxy(1,19);
printf(" Czas plyty: ");
gets(temp->czas);
return 0;
}
int WczytajPlik(void)
{
FILE *plik;
char tmp[4], zespol[30], nazwacd[30], wytwornia[30], pozyczony[30], czas[30];
int rok, numer, i;
plik = fopen("baza.db","r");
if (plik == NULL)
{
printf("\n Nie mozna otworzy pliku bazy danych! \n");
gets(tmp);
return 0;
}
fscanf(plik, "%d\n", &numer);
for (i = 0; i < numer; i++)
{
fgets(zespol, 30, plik);
fgets(nazwacd, 30, plik);
fgets(tmp, 30, plik);
fgets(wytwornia, 30, plik);
fgets(pozyczony, 30, plik);
fgets(czas, 30, plik);
rok=atoi(tmp);
DodajDoPosortowanej(glowa,zespol,nazwacd,rok,wytwornia,pozyczony,czas);
}
return 0;
}
void DodajElement()
{
char zespol[30], nazwacd[30], rok[30], wytwornia[30], pozyczony[30], czas[30];
int x;
puts("Dodawanie nowego elementu. \n");
printf("Nazwa zespolu: ");
gets(zespol);
printf("Nazwa plyty: ");
gets(nazwacd);
printf("Rok Wydania: ");
gets(rok);
while ((atoi(rok)<1900) | (atoi(rok)>2020))
{
printf("Blad. Wpisz ponownie! (wartosc miedzy 1900 - 2020): ");
gets(rok);
}
x=atoi(rok);
printf("Wytwornia: ");
gets(wytwornia);
printf("Pozyczony: ");
gets(pozyczony);
printf("Czas trwania plyty [min]: ");
gets(czas);
DodajDoPosortowanej(glowa,zespol,nazwacd,x,wytwornia,pozyczony,czas);
printf("Wpis Dodano");
}
int main(void)
{
char i;
sortowany='1';
WczytajPlik();
do
{
clrscr();
printf("Baza Plyt CD ver. 1.0 Autor: Ja\n");
printf("\n");
printf(" Ilosc plyt w bazie:\n");
printf("\n");
printf(" Menu Glowne:\n");
printf(" 1.Dodaj element.\n");
printf(" 2.Pokaz/Edytuj/Usun elementy.\n");
printf(" 3.Sortuj baze.\n");
printf(" 4.Wyszukaj element.\n");
printf(" 5.Wyczysc baze.\n");
printf(" 6.Wyjscie\n");
printf("================================================================================\n");
i = getch();
switch(i)
{
case '1': DodajElement();
break;
case '2': PokazUsun();
break;
case '3': printf("3Podales %c\n", i);
break;
case '4': printf("4Podales %c\n", i);
break;
case '5': printf("5Podales %c\n", i);
break;
case '6': printf("6Podales %c\n", i);
break;
}
i = getch();
}
while (i!='6');
return 0;
}
A druga sprawa to miejsce w kodzie, w funkcji dodajdoposortowanej, jak przypisac wartosci string[30] do struktura->string[30] :)? funkcja for po 1 znaku? czy jak? :/
Czy ktos potrafi powiedziec mi czemu program wiesza sie przy przegladaniu elementu (po uprzednim dodaniu), piszac ze jest NULL :/.