abC primeri - kazalci/linsezAll.c

linsezAll.c
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
#include <stdio.h>
#include <stdlib.h>

// element seznama
struct element {
  int vrednost;                
  struct element *naslednji;   
};

// zacetek seznama
struct element *zacetek;

// dodajanje elementa na zacetek
void dodajZ(int x) {
  struct element *nov;

  // rezerviramo prostor in ...
  nov=(struct element*) malloc(sizeof(struct element)); 

  // ... nastavimo vrednosti
  nov->vrednost = x; 
  nov->naslednji = zacetek;

  zacetek = nov;
}

// dodajanje elementa na konec seznama
void dodajK(int x) {
  // kazalec na nov element 
  struct element *nov;

  // rezerviram prostor v pomnilniku
  nov=(struct element *) malloc (sizeof(struct element));
  
  nov -> vrednost = x;
  nov -> naslednji = NULL;

  if (zacetek==NULL) // (a) dodajanje v prazen seznam
    zacetek = nov;
  else {             // (b) dodajanje na konec seznama
    // zacasni kazalec za sprehod po seznamu
    struct element *tmp;

    // s tmp zacnemo na zacetku ...
    tmp = zacetek;

    // ... in se sprehodimo do konca
    while (tmp -> naslednji != NULL)
      tmp = tmp -> naslednji;

    // nov element dodamo na konec verige
    tmp -> naslednji = nov;
  }
}

// dodajanje elementa na "pravo mesto"
void dodajU(int x) {
  // kazalec na nov element 
  struct element *nov;

  // pomozni kazalec za sprehod
  struct element *tmp;

  // rezerviram prostor v pomnilniku in zapisem vrednost
  nov=(struct element *) malloc (sizeof(struct element));  
  nov -> vrednost = x;

  if ((zacetek==NULL) || (zacetek->vrednost > x)) {
    // vstavimo na zacetek seznama
    nov->naslednji = zacetek;
    zacetek = nov; 
  } else {
	// najprej poiscemo pravo mesto ...
    tmp = zacetek;
    while ((tmp->naslednji != NULL) && 
		   (tmp->naslednji->vrednost < x))
	  tmp = tmp -> naslednji;

    // ... nato nov element vrinemo v verigo
	nov -> naslednji = tmp -> naslednji;
    tmp -> naslednji = nov;
  }
}

// zbrisemo prvi element z vrednostjo x v seznamu
void brisi(int x) {
  struct element *r, *zbrisan;

  // ali je seznam prazen?
  if (zacetek==NULL) return;

  // Ali ima ze prvi element vrednost x?
  if (zacetek->vrednost == x) {
    zbrisan = zacetek;
    zacetek = zacetek -> naslednji;
    free(zbrisan);
  } else { // poiscemo element in ga zbrisemo
    r=zacetek;          
    while ((r->naslednji != NULL) && 
           (r->naslednji->vrednost != x))
      r = r->naslednji;
    if (r->naslednji != NULL) {
      zbrisan = r->naslednji;
      r->naslednji = r->naslednji->naslednji;
      free(zbrisan);      
    }
  }
}

// izpisemo element seznama
void izpisi() {
  struct element *tmp;

  tmp = zacetek;
  // sprehodimo se po vsem seznamu
  while (tmp != NULL) {  
    printf("%d  ", tmp->vrednost); 
    tmp = tmp->naslednji;
  }
  printf("\n");
}


main() {
  // na zacetku ustvarim prazen seznam
  zacetek = NULL;  

  // dodam elemente ...
  dodajU(2);dodajU(7);dodajU(3);dodajU(1);
  dodajK(10);dodajK(4);
  dodajZ(15);dodajZ(5);

  brisi(4);brisi(5);brisi(2);

  // ... in seznam izpisem
  izpisi();
}

    Nazaj...