Posted in: Různé, Studijní materiály, Vývoj počítačů

Datové struktury v C

Příklad struktur

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//definice struktury
typedef struct //zahájení definice
{
    char jmeno[31]; //textový řetezec
    int vek; //celé čílo
}UZIVATEL; //pojmenování struktury


void main()
{
    UZIVATEL uzivatle[3]; //založení pole o 3 položkách typu uživatel
    for (int i = 0; i < 3; i++) //cyklus k naplnění pole
    {
        printf("Zadej jméno uživatele: "); //výzva uživateli
        scanf("%30s", &uzivatle[i].jmeno); //načtení textového řetězce do položky jméno ve struktuře uživatel
        printf("Zadej vek: "); //výzva užiovateli
        scanf("%d", &uzivatle[i].vek); //načtení celého čísla do položky věk ve struktuře uživatel
    }
    printf("\n\n"); //dvojité odřádkování
    for (int j = 0; j < 3; j++) //cyklus k vypsání strukutry
    {
        printf("Uživatel na indexu %d\n", j);
        printf("Jméno: %s\n", uzivatle[j].jmeno); //vypsání jména ze struktury uživatel
        printf("Věk: %d\n", uzivatle[j].vek); //vypsání věku ze struktury uživatel
    }
}

Kopírovaní struktur

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//definice struktury
typedef struct //zahájení definice
{
    char jmeno[31]; //textový řetezec
    int vek; //celé čílo
}UZIVATEL; //pojmenování struktury

void main()
{
    UZIVATEL Karel; //inicializace struktury
    Karel.vek = 20; //přiřazení hodnoty 
    strcpy(Karel.jmeno, "Karel"); //přiřazení stringu jako hodnoty
    UZIVATEL KarelKopie;
    KarelKopie = Karel; //Struktura Karel se zkopíruje do struktury KarelKopie
    //porovníní stuktur Karel a KarelKopie
    if (Karel.jmeno == KarelKopie.jmeno && Karel.vek == KarelKopie.vek){
        printf("Struktury jsou shodne");
    }else{
        printf("Struktuy jsou rozdilne");
    }
}

Porovnání struktur

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//definice struktury
typedef struct //zahájení definice
{
    char jmeno[31]; //textový řetezec
    int vek; //celé čílo
}UZIVATEL; //pojmenování struktury

void main()
{
    UZIVATEL Karel; //inicializace struktury
    Karel.vek = 20; //přiřazení hodnoty 
    strcpy(Karel.jmeno, "Karel"); //přiřazení stringu jako hodnoty
    UZIVATEL Martin;
    Martin.vek = 20;
    strcpy(Martin.jmeno, "Martin");
    //porovníní stuktur Karel a Martin
    if (Karel.jmeno == Martin.jmeno && Karel.vek == Martin.vek){
        printf("Struktury jsou shodne");
    }else{
        printf("Struktuy jsou rozdilne");
    }
}

Vnořené struktury

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//definice struktury
typedef struct //zahájení definice
{
    float sirka;
    float delka;
}POLOHA; //pojmenování struktury

//definice struktury
typedef struct //zahájení definice
{
    int id; //textový řetezec
    POLOHA poloha; //vnoření struktur
}VUZ; //pojmenování struktury

//funkce pro posunutí vozu
void VUZposun(VUZ* vuz, float sirka, float delka)
{
    vuz->poloha.delka += delka; //přidání zeměpisné délky do polohy vozu
    vuz->poloha.sirka += sirka; //přidání zeměpisné šířky do polohy vozu
}

void main()
{
    VUZ osobak; //vytvoření struktury jménem osobak
    osobak.id = 1; //uložení hodnoty do prvku struktury
    osobak.poloha.delka = 41.40338; //uložení hodnoty do prvku vnořené struktury
    osobak.poloha.sirka = 2.17403;
    printf("Osobni auto má id %d a začíná na poloze %fN, %fW", osobak.id, osobak.poloha.sirka, osobak.poloha.delka);
    VUZposun(&osobak, 10, 10); //volání funkce s předáním reference na strukturu
    printf("\nOsobni auto má id %d a polohu %fN, %fW", osobak.id, osobak.poloha.sirka, osobak.poloha.delka);
}

Dynamicky alokovaná struktura

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//definice struktury
typedef struct //zahájení definice
{
    char jmeno[31]; //textový řetezec
    int vek; //celé čílo
}UZIVATEL; //pojmenování struktury

void main()
{
    UZIVATEL *ukazatel; //ukazatel na stukturu Uzivatel
    //dynamická alokace struktury v paměti
    ukazatel = (UZIVATEL*) malloc(sizeof(UZIVATEL));
    //přítup ke členům struktury
    ukazatel->vek = 2; //přiřazení celého čísla pomocí ukazatele
    strcpy(ukazatel->jmeno, "Michal"); //přiřazení textu pomocí ukazatele
    //vypsání obsahu dynamicky alokované struktury
    printf("Malý %s chodí do školky už ve %d letech", ukazatel->jmeno, ukazatel->vek);
    free(ukazatel); //uvolnění dynamicky alokované struktury
}

Spojový seznam

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//definice prvku spojového seznamu
typedef struct  
{
  int cislo; //data
  //další datové položky různých typů
  struct data *nasl, *pred; //ukazatel na následující a předchozí prvek seznamu
}SEZNAM; //pojmenování prvku seznamu

void main()
{
  SEZNAM *prvni = NULL; //inicializace spojového seznamu
  //alokace paměti pro nový prvek
  SEZNAM *novy = (SEZNAM*) malloc(sizeof(SEZNAM)); 
  if(novy == NULL) //kontroloa alokování paměti  
  {                                  
    printf("Nedostatek pameti !\n");                                    
    system("pause");               
    exit(1);                        
  }     
  //inicializace ukazatelů
  novy->pred = NULL;                       
  novy->nasl = NULL; 
  //naplneni dat
  printf("Zadej cele cislo: ");
  scanf("%d", &novy->cislo);
  //zařazeni na začátek seznamu
  if (prvni == NULL) //pokud byl seznam prázdný, zařadí se na první místo                           
  {                                                     
    prvni = novy;                  
	}                                             
	else                   
  {
    prvni->pred = novy; //zařazení před první prvek                
    novy->nasl = prvni; //nastavení následujícího záznamu v aktuálně vkládaném prvku                       
    prvni = novy; //kopírování dat    
  }   
  //výpis seznamu
  for (SEZNAM *i = prvni; i != NULL; i = i ->nasl) //definice cyklu procházejícího seznam
  {
    printf("%d, ", i->cislo); //vypsání číslené datov hodnoty
    free(i->pred); //uvolnění alokované paměti předešlého prvku
  }  
}

Deklarace enum

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//definice enum
typedef enum //zahájení definice
{
    zelena, oranzova, cervena
}barva; //pojmenování enum

void main()
{
    barva semafor;
    semafor = zelena;
    switch (semafor)
    {
    case 0:
        printf("Můžeš jít");
        break;
    case 1:
        printf("Připrav se");
        break;
    case 2:
        printf("Stůj");
        break;
    default:
        printf("Nevalidní hodnota");
        break;
    }
}

Union

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//definice unie
typedef union
{
  int cislo;
  char znak;
} unie; //pojmenování struktury
// unie bude mít velikost rovnou sizeof(int)

void main()
{
  unie ZnakCislo; //inicializace unie
  ZnakCislo.cislo = 101; // v unii bude číslo 101
  if (ZnakCislo.znak == 'e')
  {
    printf("Do unie bylo ascii kódem vloženo písmeno e");
  }
}
Back to Top