Created
January 13, 2016 16:34
-
-
Save Gelio/21b5ae516c27289a4d10 to your computer and use it in GitHub Desktop.
Lista jednokierunkowa - muzeum
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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