Zamieszczam kilka funkcji które służą do wykonywnia podstawowych czynności na liście dwukierunkowej.
Nie jestem programistą C. Uczę się C. Jestem progrmistą PHP, więc problemy rozwiązane poniżej mogą być mało efektywne czy coś… Tak czy siak – wstawiam:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | #include <stdio.h> #include <stdlib.h> //Lista dwukierunkowa //Mateusz Mazurek 5.05.2012r typedef struct test{ int val; char txt[255]; struct test *next; struct test *prev; } strk; void dodaj_koniec(strk*,int); // dodawanie na koniec elementow void wyswietl(strk *);//wyswietlanie listy strk* dodaj_poczatek(strk * a, int g);//dodanie elementu na poczatek void wyswietl_koniec(strk*);//wyswietlanie listy od konca int max_l(strk*); //maksymalna wartosc z listy int min_l(strk*); // minimalna wartosc z listy void wywalall(strk*); //usuwamy liste zostawiajac 1 element int ile(strk *);//zlicza ile jest elementow //-------------------------------------- int main() { strk a; // struktura strk* wsk =&a; // wsk do struktury wsk->next=NULL; wsk->prev=NULL; wsk->val=10; dodaj_koniec(wsk, 2);//dodajemy na koniec 2 dodaj_koniec(wsk, 3);//dodajemy na koniec 3 dodaj_koniec(wsk, 30400);//dodajemy na koniec 30400 dodaj_koniec(wsk,5665);//dodajemy na koniec 5665 wsk=dodaj_poczatek(wsk, 44); //wstawiamy na poczatek 44 wsk=dodaj_poczatek(wsk, 34);//wstawiamy na poczatek 34 wsk=dodaj_poczatek(wsk, 32);//wstawiamy na poczatek 32 wsk=dodaj_poczatek(wsk, 3324);//wstawiamy na poczatek 3324 wyswietl(wsk);//wyswietlamy printf("\n\nOd konca:\n"); wyswietl_koniec(wsk); // od konca wyswietlamy printf("\n\nMax z listy: %d\n\n", max_l(wsk));//szukamy maxa printf("\n\nMin z listy: %d\n\n", min_l(wsk));//szuakmy min wywalall(wsk);// wywalamy all wyswietl(wsk);//wyswietlamy printf("\n\nElementow listy: %d \n\n", ile(wsk));//liczymy elementy system("pause"); return 0; } void dodaj_koniec(strk * a, int g){ while (a->next != NULL)//skoro na koniec to przewijamy wskaznik na koniec. { a = a->next; } strk *nowa = malloc(sizeof(strk)); // tworzymy wskaznik do nowej struktury nowa->val=g;// dajemy wartosc strcpy(nowa->txt,"lala");//wartosc nowa->next=NULL;//skoro na koniec to nastepniej nie ma nowa->prev=a;// poprzednia to ostatnia z wczesneijszej list a->next=nowa;// nastepna listy oryginalnej to ta nowa } void wyswietl(strk *a){ while(a!=NULL)//lecimy do konca { printf("%d\n",a->val);//wyswietlajac a=a->next; } } strk* dodaj_poczatek(strk * a, int g){ //funkcja zwraca wskaznik do "nowo" powstałej listy sklejonej ze starej listy i nowej. //Pewnie mozna bylo to rozegrac inaczej - ale taki byl moj 1 pomysl strk *nowa = malloc(sizeof(strk));//tworzymy strukture nowa->val=g;//wartosci strcpy(nowa->txt,"lala"); a->prev=nowa;//skoro to jest element na poczatku to poprzedni element listy orygninalnej to wlasnie nowa lista nowa->next=a;//1 element listy musi miec kolejny element nowa->prev=NULL;//1 element nie ma poprzednika w LISCIE DWUKIERUNKOWEJ. W liscie cyklicznej jest. return nowa; //zwracamy wsk do listy "sklejonej" } void wyswietl_koniec(strk*a){ while(a->next!=NULL) // skoro od konca to przewiajmy do konca { a=a->next; } while(a!=NULL)// i lecimy po wskaniku prev { printf("%d\n", a->val); a=a->prev; } } int max_l(strk* a){ int max= a->val;//element poczatkowy while(a!=NULL)//lecimy po liscie { if(a->val > max)//jesli znajdziemy wieksz max= a->val;//zamieniamy a=a->next; } return max; } int min_l(strk* a){//to samo co wyzej tylko szukamy mneijszej int max= a->val; while(a!=NULL) { if(a->val < max) max= a->val; a=a->next; } return max; } void wywalall(strk* a){ strk*c; while(a->next!=NULL) { c=a->next;//przechowujemy wskaznik do kolejnego elementu a->next=c->next;// przeskakujemy element kasowany free(c);// element przeskoczony kasujemy } } int ile(strk *a){//inkrementacja zwykla.. int d=0; while(a!=NULL) { d++; a=a->next; } return d; } |
Wyświetlanie listy, kasowanie listy, dodawanie elementu na koniec i na początek. Szukanie największego i najmniejszego elementu. Wypisywanie listy w odrotnej kolejności. Listy dwukierunkowe. Liczenie ilość elementów listy.
Mateusz Mazurek