Skip to content

Instantly share code, notes, and snippets.

@Gelio
Created January 13, 2016 16:34
Show Gist options
  • Save Gelio/21b5ae516c27289a4d10 to your computer and use it in GitHub Desktop.
Save Gelio/21b5ae516c27289a4d10 to your computer and use it in GitHub Desktop.
Lista jednokierunkowa - muzeum
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DLUGOSC_NAZWY 30 //długość nazwy
#define L_DZIALOW 5 //liczba działów muzeum
enum DZIAL { ceramika, obrazy, rzezba, numizmatyka, magazyn }; //nazwy działów
typedef struct Eksponat
{
enum DZIAL dzialMuzeum;
char nazwa[DLUGOSC_NAZWY];
int rok;
}Eksponat;
typedef struct Node
{
Eksponat *eks;
struct Node *next;
}Node;
//sygnatury funkcji do przygotowania
void wstawNaKoncu(Node **head, enum DZIAL dzialMuzeum, char *nazwa, int rok);
void wyswietlEksponat(Eksponat eks);
void wyswietl(Node *Muzeum[L_DZIALOW]);
void usun(Node **head, Node *w);
void kradziez(Node *Muzeum[L_DZIALOW]);
void doMagazynu(Node *Muzeum[L_DZIALOW]);
void zwolnijNode(Node **doZwolnienia);
int main()
{
//Komórki tablicy przechowują początki (głowy) list,
//w których umieszczane są kolejne eksponaty
Node *Muzeum[L_DZIALOW] = { NULL,NULL,NULL,NULL,NULL };
//_____________________1__________________________________
//Wypełnienie kolejnych list
wstawNaKoncu(&Muzeum[ceramika], ceramika, "Waza Ming", 1587);
wstawNaKoncu(&Muzeum[ceramika], ceramika, "Waza grecka", -600);
wstawNaKoncu(&Muzeum[ceramika], ceramika, "Dzbany zeberkowane", 1860);
wstawNaKoncu(&Muzeum[ceramika], ceramika, "Kufel perelkowy", 1814);
wstawNaKoncu(&Muzeum[rzezba], rzezba, "Venus z Tan-Tan", -400000);
wstawNaKoncu(&Muzeum[rzezba], rzezba, "Dwoch modlacych sie", -2700);
wstawNaKoncu(&Muzeum[rzezba], rzezba, "Sluzacy niosacy tron", -713);
wstawNaKoncu(&Muzeum[rzezba], rzezba, "Bachus", 1497);
wstawNaKoncu(&Muzeum[rzezba], rzezba, "Pieta", 1498);
wstawNaKoncu(&Muzeum[obrazy], obrazy, "Stanczyk", 1853);
wstawNaKoncu(&Muzeum[obrazy], obrazy, "Wernyhora", 1883);
wstawNaKoncu(&Muzeum[obrazy], obrazy, "Panny z Awinionu", 1907);
wstawNaKoncu(&Muzeum[obrazy], obrazy, "Sloneczniki", 1888);
wstawNaKoncu(&Muzeum[obrazy], obrazy, "Chlopiec z fajka", 1905);
wstawNaKoncu(&Muzeum[obrazy], obrazy, "Autoportret van Gogh", 1887);
wstawNaKoncu(&Muzeum[obrazy], obrazy, "Planty o swicie", 1894);
wstawNaKoncu(&Muzeum[numizmatyka], numizmatyka, "5zl - Polonia Ag", 1933);
wstawNaKoncu(&Muzeum[numizmatyka], numizmatyka, "Floren Lokietka Au", 1330);
wstawNaKoncu(&Muzeum[numizmatyka], numizmatyka, "10zl - Chrobry Au", 1925);
wstawNaKoncu(&Muzeum[numizmatyka], numizmatyka, "Szostak koronny Ag", 1624);
wstawNaKoncu(&Muzeum[numizmatyka], numizmatyka, "Denar Ag", 1386);
wstawNaKoncu(&Muzeum[numizmatyka], numizmatyka, "Szelag litewski Cu", 1665);
//////_____________________2__________________________________
printf("\n__________EKSPONATY_____________\n\n");
wyswietl(Muzeum);
////_____________________3__________________________________
printf("\n__________PO USUNIECIU__________\n\n");
usun(&Muzeum[ceramika], Muzeum[ceramika]->next->next);
usun(&Muzeum[ceramika], Muzeum[ceramika]);
wyswietl(Muzeum);
////_____________________4__________________________________
printf("\n__________PO KRADZIEZY__________\n\n");
kradziez(Muzeum);
wyswietl(Muzeum);
////_____________________5__________________________________
printf("\n__________W MAGAZYNIE___________\n\n");
doMagazynu(Muzeum);
wyswietl(Muzeum);
system("PAUSE");
return 0;
}
void wstawNaKoncu(Node **head, enum DZIAL dzialMuzeum, char *nazwa, int rok)
{
Node *pom = *head;
if (pom == NULL)
{
// Glowa nie istnieje, utworz ja
*head = (Node*)malloc(sizeof(Node));
if (*head == NULL)
{
printf("Nie mozna zaalokowac glowy.\n");
return;
}
(*head)->next = NULL;
pom = *head;
}
else
{
while (pom->next != NULL)
pom = pom->next;
pom->next = (Node*)malloc(sizeof(Node));
if (pom->next == NULL)
{
printf("Nie mozna zaalokowac kolejnego elementu.\n");
return;
}
pom = pom->next;
pom->next = NULL;
}
pom->eks = (Eksponat*)malloc(sizeof(Eksponat));
if (pom->eks == NULL)
{
printf("Nie mozna zaalokowac pamieci na eksponat.\n");
return;
}
pom->eks->dzialMuzeum = dzialMuzeum;
pom->eks->rok = rok;
strcpy(pom->eks->nazwa, nazwa);
//pom->eks->nazwa[strlen(nazwa)] = '\0';
return;
} // wstawNaKoncu
void wyswietlEksponat(Eksponat eks)
{
char nazwyDzialow[L_DZIALOW][DLUGOSC_NAZWY] = { "ceramika", "obrazy", "rzezba", "numizmatyka", "magazyn" };
printf("%12s %30s %7d\n", nazwyDzialow[(int)eks.dzialMuzeum], eks.nazwa, eks.rok);
return;
} // wyswietlEksponat
void wyswietl(Node *Muzeum[L_DZIALOW])
{
int i = 0;
Node *pom;
for (i = 0; i < L_DZIALOW; i++)
{
if (Muzeum[i] != NULL)
{
pom = Muzeum[i];
while (pom != NULL)
{
wyswietlEksponat(*pom->eks);
pom = pom->next;
}
}
}
} // wyswietl
void usun(Node **head, Node *w)
{
Node *poprzedni = *head,
*pom;
if (*head == w)
{
// Usun glowe
pom = (*head)->next;
zwolnijNode(head);
*head = pom;
}
else
{
// Usun inny element
while (poprzedni != NULL && poprzedni->next != w)
poprzedni = poprzedni->next;
poprzedni->next = w->next;
zwolnijNode(&w);
}
return;
} // usun
void kradziez(Node *Muzeum[L_DZIALOW])
{
int i = 0,
j = 0;
Node *pom,
*nastepny;
for (i = 0; i < L_DZIALOW; i++)
{
if (Muzeum[i] != NULL)
{
j = 0;
pom = Muzeum[i];
while (pom != NULL)
{
if (j % 2 == 0)
{
nastepny = pom->next;
usun(&Muzeum[i], pom);
pom = nastepny;
}
else
pom = pom->next;
j++;
}
}
}
return;
} // kradziez
void doMagazynu(Node *Muzeum[L_DZIALOW])
{
Node **magazyn = &Muzeum[L_DZIALOW - 1],
*pom = NULL;
int i = 0;
for (i = 0; i < L_DZIALOW - 1; i++)
{
if (Muzeum[i] != NULL)
{
if (*magazyn == NULL)
{
// Przenies pierwsza liste do magazynu
*magazyn = Muzeum[i];
pom = *magazyn;
}
else
{
// Dolacz na koniec magazynu
pom->next = Muzeum[i];
}
while (pom->next != NULL)
pom = pom->next;
}
Muzeum[i] = NULL;
}
return;
} // doMagazynu
void zwolnijNode(Node **doZwolnienia)
{
free((*doZwolnienia)->eks);
free(*doZwolnienia);
return;
} // zwolnijNode
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment