-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patha21f4.c
229 lines (205 loc) · 9.24 KB
/
a21f4.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
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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
#include <stdio.h>
#include <stdlib.h>
#define NumberOfNodes 20 /*όριο μεγέθους της συνδεδεμένης λίστας,
ενδεικτικά τέθηκε ίσο με 5*/
#define NilValue -1 // ειδική μεδενικη τιμη δείχνει το τέλος της Συνδ.λίστας
typedef struct{
int studentnumber;
float grade;
}ListElementType; /*τύπος δεδομένων για τα στοιχεία της συνδεδεμένης λίστας,
ενδεικτικά επιλέχθηκε ο τύπος int */
typedef int ListPointer;
typedef struct {
ListElementType Data;
ListPointer Next;
} NodeType;
typedef enum {
FALSE, TRUE
} boolean;
void InitializeStoragePool(NodeType Node[], ListPointer *FreePtr);
void CreateList(ListPointer *List);
boolean EmptyList(ListPointer List);
boolean FullList(ListPointer FreePtr);
void GetNode(ListPointer *P, ListPointer *FreePtr, NodeType Node[]);
void ReleaseNode(NodeType Node[NumberOfNodes], ListPointer P, ListPointer *FreePtr);
void Insert(ListPointer *List, NodeType Node[],ListPointer *FreePtr, ListPointer PredPtr, ListElementType Item);
void Delete(ListPointer *List, NodeType Node[], ListPointer *FreePtr, ListPointer PredPtr);
void TraverseLinked(ListPointer List, NodeType Node[]);
int main(){
NodeType Node[NumberOfNodes];
ListPointer head, FreePtr;
ListElementType temp;
char bin;
int allstud, i, PredPtr, counter;
counter = 0;
InitializeStoragePool(Node, &FreePtr);
CreateList(&head);
printf("DWSE ARI8MO MA8HTWN:");
scanf("%d%c", &allstud, &bin);
for(i = 0; i < allstud; i++){
printf("DWSE ARI8MO MHTRWOU GIA EISAGWGH STH LISTA: ");
scanf("%d%c", &temp.studentnumber, &bin);
printf("DWSE TO BA8MO GIA EISAGWGH STH LISTA: ");
scanf("%f%c", &temp.grade, &bin);
printf("DWSE TH 8ESH META THN OPOIA 8A GINEI H EISAGWGH STOIXEIOU: ");
scanf("%d%c", &PredPtr, &bin);
Insert(&head, Node, &FreePtr, PredPtr, temp);
counter += 1;
printf("\nPlithos stoixeiwn sth lista %d\n", counter);
TraverseLinked(head, Node);
}
printf("\nDWSE TH 8ESH TOU PROHGOUMENOU STOIXEIOU GIA DIAGRAFH: ");
scanf("%d%c", &PredPtr, &bin);
Delete(&head, Node, &FreePtr, PredPtr);
counter -= 1;
printf("\nPlithos stoixeiwn sth lista %d\n", counter);
for(i = 0; i < 2; i++){
printf("DWSE ARI8MO MHTRWOU GIA EISAGWGH STH LISTA: ");
scanf("%d%c", &temp.studentnumber, &bin);
printf("DWSE TO BA8MO GIA EISAGWGH STH LISTA: ");
scanf("%f%c", &temp.grade, &bin);
printf("DWSE TH 8ESH META THN OPOIA 8A GINEI H EISAGWGH STOIXEIOU: ");
scanf("%d%c", &PredPtr, &bin);
Insert(&head, Node, &FreePtr, PredPtr, temp);
counter += 1;
printf("\nPlithos stoixeiwn sth lista %d\n", counter);
TraverseLinked(head, Node);
}
return 0;
}
void InitializeStoragePool(NodeType Node[], ListPointer *FreePtr)
/* Δέχεται: Τον πίνακα Node και τον δείκτη FreePtr που δείχνει στον
πρώτο διαθέσιμο κόμβο.
Λειτουργία: Αρχικοποιεί τον πίνακα Node ως συνδεδεμένη λίστα συνδέοντας μεταξύ
τους διαδοχικές εγγραφές του πίνακα,
και αρχικοποιεί τον δείκτη FreePtr .
Επιστρέφει: Τον τροποποιημένο πίνακα Node και τον
δείκτη FreePtr του πρώτου διαθέσιμου κόμβου
*/
{
int i;
for (i = 0; i < NumberOfNodes - 1; i++)
{
Node[i].Next=i+1;
}
Node[NumberOfNodes-1].Next=NilValue;
*FreePtr=0;
}
void CreateList(ListPointer *List)
/* Λειτουργία: Δημιουργεί μια κενή συνδεδεμένη λίστα.
Επιστρέφει: Έναν (μηδενικό) δείκτη που δείχνει σε κενή λίστα
*/
{
*List=NilValue;
}
boolean EmptyList(ListPointer List)
/* Δέχεται: Έναν δείκτη List που δείχνει σε μια συνδεδεμένη λίστα.
Λειτουργία: Ελέγχει αν η συνδεδεμένη λίστα είναι κενή.
Επιστρέφει: True αν η συνδεδεμένη λίστα είναι κενή και false διαφορετικά
*/
{
return (List==NilValue);
}
boolean FullList(ListPointer FreePtr)
/* Δέχεται: Μια συνδεδεμένη λίστα.
Λειτουργία: Ελέγχει αν η συνδεδεμένη λίστα είναι γεμάτη.
Επιστρέφει: True αν η συνδεδεμένηλίστα είναι γεμάτη, false διαφορετικά
*/
{
return (FreePtr == NilValue);
}
void GetNode(ListPointer *P, ListPointer *FreePtr, NodeType Node[])
/* Δέχεται: Τον πίνακα Node και τον δείκτη FreePtr.
Λειτουργία: Αποκτά έναν "ελεύθερο" κόμβο που τον δείχνει ο δείκτης P.
Επιστρέφει: Τον δείκτη P και τον τροποποιημένο δείκτη FreePtr
που δεικτοδοτεί στο πρώτο διαθέσιμο κόμβο
*/
{
*P = *FreePtr;
if (!FullList(*FreePtr))
*FreePtr =Node[*FreePtr].Next;
}
void ReleaseNode(NodeType Node[], ListPointer P, ListPointer *FreePtr)
/* Δέχεται: Τον πίνακα Node, που αναπαριστά τη δεξαμενή των διαθέσιμων κόμβων,
έναν δείκτη TempPtr και τον δείκτη FreePtr.
Λειτουργία: Επιστρέφει στη δεξαμενή τον κόμβο στον οποίο δείχνει ο TempPtr.
Επιστρέφει: Τον τροποποιημένο πίνακα Node και τον δείκτη FreePtr
*/
{
Node[P].Next = *FreePtr;
*FreePtr =P;
}
void Insert(ListPointer *List, NodeType Node[],ListPointer *FreePtr, ListPointer PredPtr, ListElementType Item)
/* Δέχεται: Μια συνδεδεμένη λίστα, τον πίνακα Node, τον δείκτη PredPtr και
ένα στοιχείο Item.
Λειτουργία: Εισάγει στη συνδεδεμένη λίστα, αν δεν είναι γεμάτη, το στοιχείο
Item μετά από τον κόμβο στον οποίο δείχνει ο δείκτης PredPtr.
Επιστρέφει: Την τροποποιημένη συνδεδεμένη λίστα, τον τροποποιημένο πίνακα Node
και τον δείκτη FreePtr.
Εξοδος: Μήνυμα γεμάτης λίστας, αν η συνδεδεμένη λίστα είναι γεμάτη
*/
{
ListPointer TempPtr;
GetNode(&TempPtr,FreePtr,Node);
if (!FullList(TempPtr)) {
if (PredPtr==NilValue)
{
Node[TempPtr].Data = Item;
Node[TempPtr].Next = *List;
*List = TempPtr;
}
else
{
Node[TempPtr].Data = Item;
Node[TempPtr].Next = Node[PredPtr].Next;
Node[PredPtr].Next = TempPtr;
}
}
else
printf("Full List ...\n");
}
void Delete(ListPointer *List, NodeType Node[], ListPointer *FreePtr, ListPointer PredPtr)
/* Δέχεται: Μια συνδεδεμένη λίστα και τον δείκτη PredPtr που δείχνει
στον προηγούμενο κόμβο από αυτόν που θα διαγραφεί.
Λειτουργία: Διαγράφει από τη συνδεδεμένη λίστα, αν δεν είναι κενή,
τον προηγούμενο κόμβο από αυτόν στον οποίο δείχνει ο PredPtr.
Επιστρέφει: Την τροποποιημένη λίστα και το δείκτη FreePtr.
Έξοδος: Μήνυμα κενής λίστας, αν η συνδεδεμένη λίστα είναι κενή
*/
{
ListPointer TempPtr ;
if (!EmptyList(*List)) {
if (PredPtr == NilValue)
{
TempPtr =*List;
*List =Node[TempPtr].Next;
}
else
{
TempPtr =Node[PredPtr].Next;
Node[PredPtr].Next =Node[TempPtr].Next;
}
ReleaseNode(Node,TempPtr,FreePtr);
}
else
printf("Empty List ...\n");
}
void TraverseLinked(ListPointer List, NodeType Node[])
/* Δέχεται: Μια συνδεδεμένη λίστα.
Λειτουργία: Κάνει διάσχιση της συνδεδεμένης λίστας, αν δεν είναι κενή.
Έξοδος: Εξαρτάται από την επεξεργασία
*/
{
ListPointer CurrPtr;
if (!EmptyList(List))
{
CurrPtr = List;
while (CurrPtr != NilValue)
{
printf("[%d: (%d,%.1f) ->%d] ", CurrPtr, Node[CurrPtr].Data.studentnumber, Node[CurrPtr].Data.grade, Node[CurrPtr].Next);
CurrPtr = Node[CurrPtr].Next;
}
printf("\n");
}
else printf("Empty List ...\n");
}