-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patha1f4.c
276 lines (251 loc) · 10.7 KB
/
a1f4.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
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
#include <stdio.h>
#include <stdlib.h>
#define NumberOfNodes 10 /*όριο μεγέθους της συνδεδεμένης λίστας,
ενδεικτικά τέθηκε ίσο με 5*/
#define NilValue -1 // ειδική μεδενικη τιμη δείχνει το τέλος της Συνδ.λίστας
typedef int 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[]);
void printAll(ListPointer List, ListPointer FreePtr, NodeType Node[]);
boolean Search(ListPointer FreePtr, ListPointer List, NodeType Node[NumberOfNodes], ListElementType Item, ListPointer *PredPtr);
int main(){
NodeType Node[NumberOfNodes];
ListPointer head, FreePtr, PredPtr;
ListElementType input;
boolean flag;
char dec, bin;
int i, x;
CreateList(&head);
InitializeStoragePool(Node, &FreePtr);
printf("Question C\n");
printAll(head, FreePtr, Node);
printf("Question D\nLinked List\n");
TraverseLinked(head, Node);
printf("Question E\n");
while(TRUE){
printf("Give a number:");
scanf("%d%c", &input, &bin);
flag = Search(FreePtr, head, Node, input, &PredPtr);
Insert(&head, Node, &FreePtr, PredPtr, input);
printf("Continue Y/N: ");
scanf("%c%c", &dec, &bin);
if(dec == 'n' || dec == 'N'){
break;
}
}
printf("Question F\n");
printf("Storage pool\n");
printAll(head, FreePtr, Node);
printf("Question G\n");
printf("Linked list\n");
TraverseLinked(head, Node);
printf("Question H\n");
if(EmptyList(head)){
printf("Empty list\n");
}else{
printf("Not an empty list\n");
}
printf("Question I\n");
if(FullList(head)){
printf("Full list\n");
}else{
printf("Not a full list\n");
}
printf("Question J\n");
printf("Search for a number\n");
for(i = 0; i < 2; i++){
printf("Give a number ");
scanf("%d%c", &x, &bin);
flag = Search(FreePtr, head, Node, x, &PredPtr);
if(flag){
printf("The number is in the list and its predecessor is in position %d\n", PredPtr);
}else{
printf("The number is not in the list\n");
}
}
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[i].Data=-1; /* δεν είναι αναγκαίο η απόδοση αρχικής τιμής στο πεδίο των δεδομένων, βοηθάει στην εκτύπωση */
}
Node[NumberOfNodes-1].Next=NilValue;
Node[NumberOfNodes-1].Data=-1;
*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;
Node[P].Data = -1; /* Οχι αναγκαία εντολή, βοηθητική για να φαίνονται στην
εκτύπωση οι διαγραμμένοι κόμβοι */
*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->%d) ",CurrPtr,Node[CurrPtr].Data, Node[CurrPtr].Next);
CurrPtr=Node[CurrPtr].Next;
}
printf("\n");
}
else printf("Empty List ...\n");
}
boolean Search(ListPointer FreePtr, ListPointer List, NodeType Node[NumberOfNodes], ListElementType Item,
ListPointer *PredPtr){
ListPointer TempPtr;
TempPtr = List;
*PredPtr = -1;
if(!EmptyList(List)){
while(TempPtr != NilValue){
if(Item == Node[TempPtr].Data){
return TRUE;
}else if(Node[TempPtr].Data > Item){
return FALSE;
}
*PredPtr = TempPtr;
TempPtr = Node[TempPtr].Next;
}
return FALSE;
}
return FALSE;
}
void printAll(ListPointer List, ListPointer FreePtr, NodeType Node[])
{
int i;
printf("1o STOIXEIO LISTAS=%d, 1H FREE POSITION=%d\n", List, FreePtr);
printf("H STORAGE POOL EXEI TA EJHS STOIXEIA\n");
for (i=0;i<NumberOfNodes;i++)
printf("(%d: %d->%d) ",i,Node[i].Data, Node[i].Next);
printf("\n");
}