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();
}
|