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