Kategorie: Programowanie

[C] Lista dwukierunkowa – wskaźnik roboczy.

Cześć! Cieszę się, że mnie odwiedziłeś/aś. Zanim przejdziesz do artykułu chciałbym zwrocić Ci uwagę na to, że ten artykuł był pisany kilka lat temu (2012-05-12) miej więc proszę na uwadzę że rozwiązania i przemyślenia które tu znajdziesz nie muszą być aktualne. Niemniej jednak zachęcam do przeczytania.

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:

  • wypisywanie listy;
  • wypisywanie wartości wskaźnika roboczego;
  • przesunięcie wskaźnika roboczego do przodu;
  • przesunięcie wskaźnika roboczego do tyłu;
  • dodawanie elementu za wskaźnikiem roboczym (wartość podawana z klawiatury).
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;

}
Dzięki za wizytę,
Mateusz Mazurek
Mateusz M.

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:)

Ostatnie wpisy

Podsumowanie: luty i marzec 2024

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

1 tydzień ago

Podsumowanie: styczeń 2024

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

2 miesiące ago

Podsumowanie roku 2023

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

3 miesiące ago

Podsumowanie: grudzień 2023

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

4 miesiące ago

Praca zdalna – co z nią dalej?

Cześć, ostatnio w Internecie pojawiło się dużo artykułów, które nie były przychylne pracy zdalnej. Z drugiej strony większość komentarzy pod… Read More

4 miesiące ago

Podsumowanie: listopad 2023

Zapraszam na krótkie podsumowanie miesiąca. Książki W listopadzie dokończyłem cykl "Z mgły zrodzony" Sandersona. Tylko "Stop prawa" mi nie do… Read More

5 miesięcy ago