Anonymní profil Radek K. – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama

Anonymní profil Radek K. – Programujte.comAnonymní profil Radek K. – Programujte.com

 

Příspěvky odeslané z IP adresy 188.120.198.–

Radek K.
C / C++ › Lineární spojový seznam - pr…
29. 12. 2016   #214284

#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;
}

///////////******************************************************/////////////
Radek K.
C / C++ › Lineární spojový seznam - pr…
28. 12. 2016   #214268

#6 Jerry
Bohužel strom padá tohle jsou požadavky:

Smysluplně využít funkce

Modulárnost

Pro práci s daty program smysluplně využije lineární spojový seznam a nad ním funkce pro vložení, smazání, změnu a vyhledání prvku seznamu.

Práce se souborem -  program ukládá a čte data ze souboru

Neporadil by mi tedy nekdo jak vkládat data do spojového seznamu přes terminál? Čím víc nad tím přemýšlím, tím míň se mi to řešení líbí.

Radek K.
C / C++ › Lineární spojový seznam - pr…
27. 12. 2016   #214264

Tak nějak, dostali jsme proste na prednášce kody jak by se dali použít.  bral jsem je tak jak jsou jenom jsem upravoval věci, které jsem měl jinak. No hlavně ono s tím zadáním moc na výběr nebylo. Prostě obdoba adresáře. Strukturu jsem si nevymyslel. Chápu, že to není nic extra, ale potřeboval bych alespoň to uvézt do jakéhos stavu.

Zde originál ze kterého jsem čerpal.

typedef struct _uzel { // PRVEK, UZEL, ITEM
char *nazev; // hodnotová položka
double hodnota; // hodnotová položka
struct _uzel *dalsi; // odkaz na další uzel
} UZEL;
typedef struct _seznam { // INFO
UZEL *zacatek; //ukazatel na zacatek
UZEL *konec; // ukazatel na konec
UZEL *akt; // ukazovatko
int delka; // delka seznamu
} SEZNAM;

A bohužel dělám v Codelite. Věci co byli napsány výše jsem opravil. 

Radek K.
C / C++ › Lineární spojový seznam - pr…
27. 12. 2016   #214257

Dobrý den,

studuji prvním rokem mechatroniku na VŠ a poprvé jsem se setkal s programováním v C. Na vánoce jsme dostali semestrální práci, která má obsahovat práci se souborem, lineárním spojovým seznamem a funkcemi pro vložení, úpravu, vyhledání a odstranění prvku. Vybral jsem si klasiku telefonní seznam. Dostali jsme si vzorové kody. 

V průběhu programování se ale vyskytl problém, že seznam mi nedokáže uchovat data, která zapíšu přes scanf(). Když je zapíšu přímo do kodu, tak s nimi mohu normálně pracovat.

Děkuji za připadnou pomoc

 soubor s funkcemi

#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("Prijmeni: %s\n", k->prijmeni);
        printf("Jmeno: %s\n", k->jmeno);
        printf("Cislo telefonu: %s\n\n", k->cislo);
    }
}
///////////******************************************************/////////////
// vytvoreni noveho kontaktu
KONTAKT* vytvor_kontakt(char* prijmeni, char* jmeno, char* cislo)
{
    KONTAKT *k;
  k = ( KONTAKT*)malloc(sizeof(KONTAKT));
    if(k != NULL) {

        k->prijmeni= prijmeni;
        k->jmeno=    jmeno;
        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->prijmeni, k->prijmeni) < 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* prijmeni)
{
    if(a->zacatek != NULL) {
        a->uka = a->zacatek;
        while(a->uka != NULL) {
            if(strcmp(a->uka->prijmeni, prijmeni))
                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 0.0.1****\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");

    do {
        char c;
        printf("\t Zadejte vasi volbu: ");
        n = scanf("%d", &volba);

        do {
            scanf("%c", &c);
        } while(c != '\n');

    } while((n == 0) || !((volba >= 0) && (volba <= 4)));
    return volba;
}

///////////******************************************************/////////////

 hlavickový soubor

#ifndef SEZNAM_H
#define SEZNAM_H

// deklarace typu - kontakt
typedef struct kontakt{
    char *prijmeni;
    char *jmeno;
    char *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 *prijmeni, char *jmeno, char *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 *prijmeni);
int menu (void);


#endif

soubor main()

#include <stdio.h>
#include <stdlib.h>
#include "Adresar.h"

int main(int argc, char** argv)
{

    char volba_nabidky;
    ADRESAR* adresar;
     KONTAKT *kontakt;      
    do {
        volba_nabidky = menu();

        switch(volba_nabidky) {

        case 1:
            adresar = init_adresar();
            char *prijmeni;
            prijmeni = (char*)malloc(sizeof(char));
            char *jmeno;
            jmeno = (char*)malloc(sizeof(char));
            char *cislo;
            cislo = (char*)malloc(sizeof(char));

 
            printf("Napis prijmeni:\n");
            scanf("%s", prijmeni);
            printf("Napis jmeno\n");
            scanf("%s", jmeno);
            printf("Napis tel. cislo:\n");
            scanf("%s", cislo);
   
            
            zatridit_kontakt(adresar,vytvor_kontakt(prijmeni, jmeno ,cislo));
          


            break;

        case 2:
        

            break;

        case 3:
        vypis_adresar(adresar);
            break;

        case 4:
            break;

        case 0:
            break;
        }

    } while(volba_nabidky != 0);

    return 0;
}

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032019 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý