Napisać program implementujący listę dwukierunkową. Elementami listy powinny być struktury zawierające pole integer i dwa wskaźniki (do poprzedniego i następnego elementu listy). Listę należy zainicjalizować 10 elementami ciągu: 1,2,3,4,5,6,7,8,9,10.
Zdefiniować wskaźnik roboczy wskazujący na „element bieżący” (ustawiony początkowo na pierwszy element listy).
Zaimplementować następujące funkcje, umożliwiając użytkownikowi wybór z menu:
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 | #include <stdio.h> #include <stdlib.h> typedef struct a{ int val; struct a* next; struct a* prev; } strk; void dodaj(strk *, int);//dodawanie elementow na koniec void wypisz(strk*);//wypisywanie listy void wypisz_wsk(strk*);//wypisywanie wskaznika strk* do_przodu(strk*);//przesuwanie do przodu strk* do_tylu(strk*);// przesuwanie do tylu strk* dodaj_za_rob(strk*,strk*, int);//dodanie wartosci za roboczy int main() { strk a; strk *wsk=&a; strk* head=&a; strk* roboczy=&a; wsk->next=NULL; wsk->prev=NULL; wsk->val=1; int i=2; while(i<11){ dodaj(wsk,i);//dodawanie na koniec tylko po to napisalem zeby wypelnic liste. i++; } int wybor; while(1){ printf("Program na zaliczenie.\nWcisnij numer polecenia aby wywolac je\n"); printf("1. Pokaz liste\n2. Wypisz pozycje wsk roboczego\n3. Przesun roboczy w prawo.\n4. Przesun roboczy w lewo.\n5. Dodaj element za wskaznikiem.\n\n0 aby zakonczyc.\n"); scanf("%d", &wybor); if(wybor==0) break; if(wybor==1){ printf("\n"); system("cls"); wypisz(wsk); printf("\n"); } if(wybor==2){ printf("\n"); system("cls"); wypisz_wsk(roboczy); printf("\n\n"); } if(wybor==3){ printf("\n"); system("cls"); roboczy=do_przodu(roboczy); printf("\n\n"); } if(wybor==4){ printf("\n"); system("cls"); roboczy=do_tylu(roboczy); printf("\n\n"); } if(wybor==5){ printf("\n"); int co; system("cls"); printf("Podaj wartosc jaka chcesz dodac:"); scanf("%d",&co); roboczy=dodaj_za_rob(roboczy,wsk,co); printf("\n\n"); } } system("Pause"); return 0; } void dodaj(strk *a, int co){ while(a->next!=NULL){ a=a->next; } strk *nowy =(strk*)malloc(sizeof(strk)); nowy->val=co; nowy->next=NULL; nowy->prev=a; a->next=nowy; } void wypisz(strk* a){ while(a!=NULL){ printf("%d\n", a->val); a=a->next; } } void wypisz_wsk(strk* a){ printf("Pozycja wsk roboczego to: %d", a->val); } strk* do_przodu(strk*a){ if(a->next==NULL) printf("Nie mozna przesunac wskaznika! BLAD!"); else printf("Przesunieto wskaznik;"); a=a->next; return a; } strk* do_tylu(strk*a){ if(a->prev==NULL) printf("Nie mozna przesunac wskaznika! BLAD!"); else printf("Przesunieto wskaznik;"); a=a->prev; return a; } strk* dodaj_za_rob(strk* r,strk* a, int co){ strk *nowy =(strk*)malloc(sizeof(strk)); nowy->val=co; strk* t= r->next; nowy->next=t; nowy->prev=r; r->next=nowy; return r; } |
Oj daaawnoo mnie tu nie było. Ale wakacje to był czas dużej liczby intensywnych wyjazdów i tak naprawdę, dopiero jakoś… Read More
Cześć! Zapraszam na krótkie podsumowanie kwietnia. Wyjazd do Niemiec A dokładniej pod granicę z Francją. Chrześnica miała pierwszą komunię. Po… Read More
Ostatnio tygodnie były tak bardzo wypełnione, że nie udało mi się napisać nawet krótkiego podsumowanie. Więc dziś zbiorczo podsumuję luty… Read More
Zapraszam na krótkie podsumowanie miesiąca. Książki W styczniu przeczytałem "Homo Deus: Historia jutra". Książka łudząco podoba do wcześniejszej książki tego… Read More
Cześć! Zapraszam na podsumowanie roku 2023. Książki Zacznijmy od książek. W tym roku cel 35 książek nie został osiągnięty. Niemniej… Read More
Zapraszam na krótkie podsumowanie miesiąca. Książki W grudniu skończyłem czytać Mein Kampf. Nudna książka. Ciekawsze fragmenty można by było streścić… Read More
Pokaż komentarze
Jakie zadanie spełnia w Twojej liście "strk* head=&a;"?
Czy aby na pewno jest to potrzebne?
Cześć.
No w sumie nie potrzebna, ale jest dobrą praktyką posiadanie wskaźnika na głowę listy.
Mała uwaga z mojej strony,
gdy dodajesz za roboczy
nie masz prev na nowy
pozdro:)
Mówisz o previe nowego czy previe całej listy? :)