#8 Jerry
Nakonec jsem program upravil, takže dělá cca to co potřebuji. Vyskytl se ale průšvih s tím, že se mi nedaří načítat data zkrz funkci fread().Neví někdo jak na to? Nebo neporadil by mi někdo jinou metodu ukládání? Je jedno jestli do texťáku nebo binárně, hlavně aby to fungovalo.
#include <stdio.h>
#include <stdlib.h>
#include "Adresar.h"
int main(int argc, char** argv)
{
int volit;
KONTAKT* kontakt;
ADRESAR* adresar;
adresar = init_adresar();
FILE* fw;
fw = fopen("Adresar.bin", "wb");
do {
volit = menu();
switch(volit) {
case 1: // pridani kontaktu
kontakt = NULL;
char str[30];
long int numb;
printf("Zadejte jmeno kontaktu:");
scanf("%s", str);
// gets(str);
printf("Zadejte cislo:");
scanf("%ld", &numb);
pridat_kontakt(adresar, vytvor_kontakt(str, numb));
break;
case 2: // vyhledani kontaktu
while(kontakt == NULL) {
char ret[30];
printf("Zadej hledaneho: ");
scanf("%s", ret);
kontakt = vyhledej(adresar, ret);
}
printf("Nalezen kontakt:\n");
vypis_kontakt(kontakt); // vypise vyhledany uzel
break;
case 3: // vypis serazeneho adresare
serad_adresar(adresar);
vypis_adresar(adresar);
break;
case 4: // odebrani kontaktu
while(kontakt == NULL) {
char ret[30];
printf("Zadej hledaneho: ");
scanf("%s", ret);
kontakt = vyhledej(adresar, ret);
}
printf("Nalezen kontakt:\n");
vypis_kontakt(kontakt); // vypise vyhledany uzel
odebrat_kontakt(adresar);
vypis_adresar(adresar);
}
} while(volit != 0);
fwrite(adresar->zacatek, sizeof(KONTAKT), adresar->delka, fw);
fclose(fw);
return 0;
}
#ifndef SEZNAM_H
#define SEZNAM_H
// deklarace typu - kontakt
typedef struct kontakt{
char jmeno[30];
long int cislo;
struct kontakt *dalsi;
} KONTAKT;
typedef struct adresar{
KONTAKT *zacatek; // ukazatel na zacatek
KONTAKT *konec; // ukazatel na konec
KONTAKT *uka; // ukazatel aktualní pozice
int delka; // delka seznamu
} ADRESAR;
//funkce pro praci se samotným kontaktem
KONTAKT *vytvor_kontakt (char jmeno[30], long int cislo);
void pridat_kontakt (ADRESAR *a,KONTAKT *k); //Kontakt je zalozen na konec
void vypis_kontakt(KONTAKT *k);
//funkce pro praci se seznamem
void vypis_adresar (ADRESAR *a);
void zrus_adresar (ADRESAR *a);
void zatridit_kontakt (ADRESAR *a, KONTAKT *k); //Zatridi se kontakt
ADRESAR *init_adresar(void);
ADRESAR *serad_adresar (ADRESAR *a); // seradi se kontakty v adresari
KONTAKT *odebrat_kontakt (ADRESAR *a);
KONTAKT *vyhledej (ADRESAR *a, char jmeno[30]);
int menu (void);
#endif
#include "adresar.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// alokace pameti pro seznam a vynulovani pointru
ADRESAR* init_adresar(void)
{
ADRESAR* a;
a = (ADRESAR*)malloc(sizeof(ADRESAR)); // vytvori se v pameti misto na adresar
if(a == NULL) {
printf("CHYBA - nedoslo k alokaci pameti pro ADRESAR\n");
exit(EXIT_FAILURE);
}
a->zacatek = NULL;
a->konec = NULL;
a->uka = NULL;
a->delka = 0;
return a;
}
///////////******************************************************/////////////
// vypis adresare
void vypis_adresar(ADRESAR* a)
{
a->uka = a->zacatek;
while(a->uka != NULL) {
vypis_kontakt(a->uka);
a->uka = a->uka->dalsi;
}
a->uka = a->zacatek;
}
///////////******************************************************/////////////
// uvolneni celeho seznamu z pameti
void zrus_adresar(ADRESAR* a)
{
KONTAKT* rusnik;
a->uka = a->zacatek;
while(a->uka != NULL) {
rusnik = a->uka;
a->uka = a->uka->dalsi;
vypis_kontakt(rusnik);
free((KONTAKT*)rusnik); // uvolneni kontaktu z pameti
}
free((ADRESAR*)a);
a = NULL; // vynuluje seznam
}
///////////******************************************************/////////////
// vypise dany kontakt
void vypis_kontakt(KONTAKT* k)
{
if(k != NULL) {
printf("Jmeno: %s\n", k->jmeno);
printf("Cislo telefonu: %ld\n\n", k->cislo);
}
}
///////////******************************************************/////////////
// vytvoreni noveho kontaktu
KONTAKT* vytvor_kontakt(char jmeno[30], long int cislo)
{
KONTAKT* k;
k = (KONTAKT*)malloc(sizeof(KONTAKT));
if(k != NULL) {
for(int i = 0; i < 30; i++)
k->jmeno[i] = jmeno[i];
k->cislo = cislo;
}
return k;
}
///////////******************************************************/////////////
// prida se kontakt na konec seznamu
void pridat_kontakt(ADRESAR* a, KONTAKT* k)
{
if(a->zacatek == NULL)
a->zacatek = k; // prvni v seznamu
else
a->konec->dalsi = k;
k->dalsi = NULL;
a->konec = k;
a->uka = k;
a->delka++;
}
///////////******************************************************/////////////
// zatridi se uzel do seznamu
void zatridit_kontakt(ADRESAR* a, KONTAKT* k)
{
if(a->zacatek == NULL) { // pro prazdne pole
k->dalsi = NULL;
a->zacatek = a->uka = a->konec = k;
a->delka++;
} else {
KONTAKT* predchozi = NULL;
enum { HLEDEJ, KONEC } stav = HLEDEJ;
a->uka = a->zacatek;
while((stav == HLEDEJ) && (a->uka != NULL)) {
if(strcmp(a->uka->jmeno, k->jmeno) < 0) {
predchozi = a->uka;
a->uka = a->uka->dalsi;
} else {
stav = KONEC;
}
}
if(predchozi == NULL) {
k->dalsi = a->uka;
a->zacatek = k;
a->delka++;
} else {
if(a->uka == NULL) {
a->konec->dalsi = k;
k->dalsi = NULL;
a->konec = k;
a->delka++;
} else {
predchozi->dalsi = k;
k->dalsi = a->uka;
a->delka++;
}
}
}
}
///////////******************************************************/////////////
// serazeni hotového adresare zatridovanim
ADRESAR* serad_adresar(ADRESAR* a)
{
ADRESAR* pomocny;
KONTAKT* dalsi;
pomocny = init_adresar();
// do pomoc seznamu zatridime spravne prvky z puvodniho
a->uka = a->zacatek;
while(a->uka != NULL) {
dalsi = a->uka->dalsi;
zatridit_kontakt(pomocny, a->uka);
a->uka = dalsi;
}
*a = *pomocny;
free(pomocny);
return a;
}
///////////******************************************************/////////////
// vyjmi uzel na aktualni pozici seznamu
KONTAKT* odebrat_kontakt(ADRESAR* a)
{
KONTAKT* k;
// pro prazdny seznam
if(a->zacatek == NULL)
return NULL;
k = a->uka;
// je jenom 1 prvek
if(a->delka == 1) {
a->zacatek = a->uka = a->konec = NULL; // seznam je poté prazdný
} else { // je vice prvku v seznamu
if(a->uka == a->zacatek) { // uka na prvni prvek seznamu
a->uka = k->dalsi; // nastaveni uka na druhy prvek
a->zacatek = a->uka;
} else {
// uka na posledni prvek
if(a->uka == a->konec) {
a->konec = a->zacatek;
while(a->konec->dalsi != a->uka)
a->konec = a->konec->dalsi;
a->uka = a->konec;
} else { // je nekde jinde
a->uka = a->zacatek;
while(a->uka->dalsi != k)
a->uka = a->uka->dalsi;
// prochazi se celým seznamem a vyjmeme prvek
}
a->uka->dalsi = k->dalsi;
}
}
a->delka--; // zkratime seznam
return k;
}
///////////******************************************************/////////////
// prime vyhledani v nesetridenem seznamu
KONTAKT* vyhledej(ADRESAR* a, char jmeno[30])
{
if(a->zacatek != NULL) {
a->uka = a->zacatek;
while(a->uka != NULL) {
for(int i = 0; i < 30; i++)
if(!strcmp(a->uka->jmeno, jmeno))
return a->uka;
a->uka = a->uka->dalsi;
}
}
return NULL;
}
///////////******************************************************/////////////
int menu(void)
{ // funkce vypis menu
int volba = 0;
int n; // pocet spravne zadanych hodnot
printf("\n\t//////////////////////////////////////////// \n");
printf("\t**** ADRESAR verze 1.0****\n");
printf("\t//////////////////////////////////////////// \n");
printf("\t** 1) Vlozit novy kontakt **\n");
printf("\t** 2) Vyhledat podle prijmeni **\n");
printf("\t** 3) Vypsat cely seznam **\n");
printf("\t** 4) Odebrat kontakt **\n");
putchar('\n');
printf("\t//////////////////////////////////////////// \n");
printf("\t**** O) K O N E C ****\n");
printf("\t//////////////////////////////////////////// \n");
putchar('\n');
do {
char c;
printf("\t Zadejte vasi volbu: ");
n = scanf("%d", &volba);
putchar('\n');
do {
scanf("%c", &c);
} while(c != '\n');
} while((n == 0) || !((volba >= 0) && (volba <= 4)));
return volba;
}
///////////******************************************************/////////////