Lineární spojový seznam - problém – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Lineární spojový seznam - problém – C / C++ – Fórum – Programujte.comLineární spojový seznam - problém – C / C++ – Fórum – Programujte.com

 

Radek K.
~ Anonymní uživatel
4 příspěvky
27. 12. 2016   #1
-
0
-

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;
}
Nahlásit jako SPAM
IP: 188.120.198.–
Jerry
~ Anonymní uživatel
504 příspěvků
27. 12. 2016   #2
-
0
-

#1 Radek K.
no vidíš můžeš si podat ruce s dalším dotazovatelem:

http://programujte.com/forum/vlakno/31763-linearne-zretezeny-seznam-v-c/

Nahlásit jako SPAM
IP: 194.228.128.–
gna
~ Anonymní uživatel
1851 příspěvků
27. 12. 2016   #3
-
0
-

#1 Radek K.
Při vkládání kontaktu vytváříš nový adresář. A bacha, pro ty stringy alokuješ jen jeden znak.

Nahlásit jako SPAM
IP: 213.211.51.–
Jerry
~ Anonymní uživatel
504 příspěvků
27. 12. 2016   #4
-
0
-

Co myslíš tím "dostali jsme vzorové kódy ???.... " to jako že pan učitel vám dal funkce init_adresar, serad_adresar, atd  a taky struktury  typedef struct kontakt atd ... ???  Přiznám se, že ten zdroják co si tu dal je totální zmatlanina. Funkce serad_adresar je napsana špatně a nebude nikdy fungovat. Vubec struktura Adresar jak se použitá je kardinalni volovina. Nechce se mi to číst. Podle mě vás tohle nemoch nikdo učit. To je na trestní oznámení. :))) totální vostuda. Nevim v čem to píšeš. Předpokládejme že máš MS-VisualStudio-2015up3. Koukni sem:  https://uloz.to/!wybTcOhmXzwM/consoleapplication1-zip máš tam naprogramovaný všechno co potřebuješ.

Strukturu t_treeItem můžeš rozšířit o další prvky např char* jmeno, char* prijmeni, char* telefon. Dále pak rozšíříš funkci Add( int t_value ) na další vkládané promněnné tedy t_jmeno, t_prijmeni, t_telefon a přidáš je stejně jako je to podle vzoru jak se přidává t_value do value. Zjistíš délku vkládaného řetězce, pak nezapomeneš alokovat paměť pomocí malloc a přidáš délku řetězce + 1 protože řetězec musí končit znakem ASCII NULA neboli \0. Z proměnné t_jmeno překopirujes do item->jmeno pomocí strcpy. atd. atd. ...

Nahlásit jako SPAM
IP: 194.228.128.–
Radek K.
~ Anonymní uživatel
4 příspěvky
27. 12. 2016   #5
-
0
-

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. 

Nahlásit jako SPAM
IP: 188.120.198.–
Jerry
~ Anonymní uživatel
504 příspěvků
27. 12. 2016   #6
-
0
-

#5 Radek K.
dejme tomu, že by sis mohl upravit strukturu  _uzel tak, že kromě kromě jména, příjmení atd. by si onen link pojmenovaný jako "další" zrušil a místo něj vložil dva a to "_uzel *fwLink" a "_uzel *bwLink". Tím by sis vytvořil obousměrně slinkovaný lineární seznam neboli také non-AVL-tree neboli také sekvenční binární strom. Operace přidání, mazání atd. se zde prování VYRAZNE jednodušeji.


v tom programu co si napsal je tolik chyb že to nemá smysl nějak diskutovat.... to bysme tu byli rok :)

třeba řádek
adresar = init_adresar(); nemuže bejt uvnitř CASE 1 ale má bejt ještě před "do" jinak to nemá smysl...

dále oro strukturu _seznam nemá smysl přidělovat paměť dynamicky protože je tam JEN jednou takže to může být statická struktura a pak odkaz na jej9 prvky je pomocí tečkové notace nikoliv pomocí ->
atd. atd. ...

Codelight neznám a mám jenom MS VS cože je samé :)

navíc MS VS Comunity je zadara 

https://www.visualstudio.com/post-download-vs/?sku=community&clcid=0x409&telem=ga

no to chce předělat celej kod co si napsal ... tak to je
 

 

Nahlásit jako SPAM
IP: 194.228.128.–
Radek K.
~ Anonymní uživatel
4 příspěvky
28. 12. 2016   #7
-
0
-

#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í.

Nahlásit jako SPAM
IP: 188.120.198.–
Jerry
~ Anonymní uživatel
504 příspěvků
28. 12. 2016   #8
-
0
-

#7 Radek K.
no :) tak s takhle komplikovanou úlohou si asi budeš muset poradit sám :)

a co že to studuješ ? a kde ? ty asi budeš studovat v prvním ročníku nějaký nukleární umělointeligentní mimozemské inženýrství na Harvardu co ? :)))))) tak přeju hodně štěstí :)))) v tom studiu .... jo a že pozdravuju vaší "pančelku" :))))

jo a .......... lineární spojový seznam neboli v angličtině LinkedList (přeloženo do češtiny SPOJOVY SEZNAM) nebo také jinak řečeno sekvenční binární strom nebo také sekvenční non-AVL tree má 2 formy a to jednostranně zřetězený (vžitý název v .NET List a to s nebo bez [Int32] indexeru) a nebo oboustraně zřetězený (vžitý název v .NET je LinkedList) viz zde 

http://www.stoimen.com/blog/2012/06/22/computer-algorithms-binary-search-tree-data-structure/.

v české literatuře to asi nenajdeš 

pěkně si to užij :)

Nahlásit jako SPAM
IP: 194.228.128.–
Radek K.
~ Anonymní uživatel
4 příspěvky
29. 12. 2016   #9
-
0
-

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

///////////******************************************************/////////////
Nahlásit jako SPAM
IP: 188.120.198.–
gna
~ Anonymní uživatel
1851 příspěvků
29. 12. 2016   #10
-
0
-

#9 Radek K.
Takhle to zapsat nepůjde. Normálně ten adresář projdi a zapiš jednotlivé kontakty. Podobně i načítání.

Můžeš to napsat prakticky stejně, jak už to máš. Jen místo printf/scanf použiješ fprintf/fscanf.

Nahlásit jako SPAM
IP: 213.211.51.–
Jerry
~ Anonymní uživatel
504 příspěvků
30. 12. 2016   #11
-
0
-

tady broučku

https://www.uloz.to/!152v35drQ/ucebnice-jazyka-c-rar

strana 84

použil bych asi binární přístup k souboru než textový ale to je na tobě ....

nezapomeň že musíš mít pevnou šířku dat, všechno můžeš ukládat jako "string" a na konci můžeš udělat CR+LF

takže záznam bude jméno(100znaků)přijmeni(100znaků)vek(3znaky jak ostring)atd... a nakonec CRLF

takhle můžeš přístupovat k souboru jak textově tak i binárně a po načtení např. věku jako string provedeš konverzi žetězce na int.

Nahlásit jako SPAM
IP: 194.228.128.–
Jerry
~ Anonymní uživatel
504 příspěvků
30. 12. 2016   #12
-
0
-

přiznám se že když čtu tu poslední verzi zdrojáku tak mi to vůbec nedává smysl ale jsi statečný   

když ten zdroják nebude číst tak zápočet dostaneš v pohodě .....  

Nahlásit jako SPAM
IP: 194.228.128.–
Jerry
~ Anonymní uživatel
504 příspěvků
30. 12. 2016   #13
-
0
-

koukám ty do toho souboru můžeš aj ukládat celou strukturu
KONTAKT* ... samozřejmě po jednom záznamu. takže všechny záznamy cyklem for nebo do/while

ale pak pudou záznamy za sebou a ty už nebudeš moct editovat takovej soubor ručně např. v notepadu
 

Nahlásit jako SPAM
IP: 194.228.128.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 20 hostů

Podobná vlákna

Linearní spojový seznam — založil Rivers

Spojový seznam - problém — založil Screpheep

Lineární seznam — založil haha

Linearni seznam — založil pidgin

Moderátoři diskuze

 

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