Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include<stdlib.h>
- #include<time.h>
- struct wezel
- {
- int klucz;
- wezel *nastepnik;
- };
- wezel *glowa=(wezel*)calloc(1,sizeof(wezel)); // inicjalizacja pustej listy, glowy
- //------------------FUNKCJE------------------------------------------------------------
- void dodaj(struct wezel* glowa, int a)
- {
- wezel *nowy, *poprzednik;
- nowy=(wezel*)calloc(1,sizeof(wezel));
- poprzednik=(wezel*)calloc(1,sizeof(wezel));
- nowy->klucz=a;
- nowy->nastepnik=NULL;
- if(glowa->nastepnik==NULL)
- {
- glowa->nastepnik=nowy;
- }
- else
- {
- poprzednik=glowa->nastepnik;
- while(poprzednik->nastepnik!=NULL)
- {
- poprzednik=poprzednik->nastepnik;
- }
- poprzednik->nastepnik=nowy;
- }
- }
- void wypisz(struct wezel* glowa)
- {
- wezel *temp=(wezel*)malloc(sizeof(wezel));
- temp=glowa;
- printf("Adres glowy: %p\t\tKlucz: %i\n\nLista:\n", temp,temp->klucz);
- while(temp->nastepnik!=NULL)
- {
- temp=temp->nastepnik;
- printf("Adres: %p\t\tKlucz: %i\n", temp,temp->klucz);
- }
- }
- wezel* wyszukaj_pierwszy(struct wezel *glowa, int a) // wyszukuje pierwsze wystapienie zadanego klucza i zwraca adres
- {
- wezel *temp=(wezel*)malloc(sizeof(wezel));
- temp=glowa;
- while(temp->klucz!=a)
- {
- if(temp->nastepnik==NULL)
- {
- temp=temp->nastepnik;
- break;
- }
- temp=temp->nastepnik;
- }
- return temp;
- }
- int wyszukaj_ile(struct wezel *glowa, int a) // wyszukuje ilosc wystapien zadanego klucza
- {
- wezel *temp=(wezel*)malloc(sizeof(wezel));
- temp=glowa->nastepnik;
- if(temp==NULL) return 0; // jezeli lista jest pusta (istnieje tylko glowa) to zwraca 0
- int ile=0;
- while(temp->nastepnik!=NULL)
- {
- if(temp->klucz==a) ile++;
- temp=temp->nastepnik;
- }
- if(glowa->nastepnik->nastepnik==NULL) // kiedy jest tylko jeden wezel
- if(glowa->nastepnik->klucz==a) ile++; // kiedy jest tylko jeden wezel
- if(temp->nastepnik==NULL && temp->klucz==a) ile++; //sprawdzenie ostatniego klucza
- //free(temp);
- return ile;
- }
- void kasowanie(struct wezel *glowa, int a) //kasuje wezly o zadanej wartosci klucza
- {
- int ile=wyszukaj_ile(glowa,a); // wyszukuje liczbe wystapien
- wezel *poprzedni=(wezel*)malloc(sizeof(wezel));
- wezel *temp=(wezel*)malloc(sizeof(wezel));
- wezel *nastepny=(wezel*)malloc(sizeof(wezel));
- if(ile) // petla do skasowania wszystkich wystapien
- {
- for(int i=0;i<ile;i++)
- {
- temp=glowa;
- while(temp->klucz!=a)
- {
- if(temp->nastepnik==NULL)
- {
- temp=temp->nastepnik;
- break;
- }
- poprzedni=temp;
- temp=temp->nastepnik;
- }
- nastepny=temp->nastepnik;
- poprzedni->nastepnik=nastepny;
- free(temp); // skasowanie wezla
- if(i<ile-1) wezel *temp=(wezel*)malloc(sizeof(wezel)); // ponowna alokacja wskaznika dla obslugi kolejnego wystapienia
- }
- }
- else printf("\nbrak zadanego klucza\n");
- }
- //-------------------------------------------------------------------------------------
- void main()
- {
- wezel *temp=(wezel*)malloc(sizeof(wezel));
- int liczba;
- srand(time(NULL));
- int i = rand()%16;
- printf("\nDlugosc listy: %i\n\n",i);
- for(i;i>0;i--)
- {
- dodaj(glowa,rand()%6);
- }
- wypisz(glowa);
- printf("Podaj liczbe do wyszukania:\n");
- scanf("%i",&liczba);
- temp=wyszukaj_pierwszy(glowa,liczba);
- if(temp==NULL) printf("brak klucza\n\n");
- else
- {
- printf("\n\nAdres wezla: %p\t\t",temp);
- printf("Klucz: %i\n\n", temp->klucz);
- }
- printf("Ilosc wystapien klucza: %i, %i razy\n\n",liczba, wyszukaj_ile(glowa,liczba));
- printf("Wstawiam wezel, podaj wartosc klucza:\n");
- scanf("%i",&liczba);
- wyszukaj_ile(glowa,liczba);
- //if(wyszukaj_ile(glowa,liczba)) printf("\nTaki klucz juz jest!\n");
- //else
- //{
- dodaj(glowa,liczba);
- wypisz(glowa);
- //}
- kasowanie(glowa,50);
- wypisz(glowa);
- }
Add Comment
Please, Sign In to add comment