-
Notifications
You must be signed in to change notification settings - Fork 0
/
linkeList.c
232 lines (219 loc) · 9.97 KB
/
linkeList.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
//ciao mondo
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int initData;
void *next;
} Node;
Node *head = NULL;
// 4 opzioni
// AGGIUNGERE
Node *aggiungiNodo(int *numero) {
//definiamo un contenitore che fungera simile a un init di contenitore
Node *contenitore = NULL;
// valutiamo se head e' vuoto ovviamente la prima volta la lista sara vuota di conseguenza, creeremo il primo nodo
if (head == NULL) {
// diamo a contenitore un indirizzo di MEMORIA
contenitore = malloc(sizeof(Node));
// controlliamo se siamo riusciti ad asseggnare l'indirizzo di memoria a contenitore
if (contenitore == NULL)
return 0;
// ora inizializziamo o diamo un nuovo valore a initData che ora risulta vuoto
contenitore->initData = *numero;
// head e' NULL ora gli assegniamo lo stesso indirizzo di memoria di contenitore
head = contenitore;
// cambiamo il nodo a cui punta next che sara NULL perche dopo di lui non ci sara alcun altro nodo
// considerazione personale: potremmo usare solo e solamente haed per modificare
// verrebbe scritto tipo
// head = malloc etc..
// head -> initData = *numb;
// head -> next = NULL;
contenitore->next = NULL;
// se head non e' NULL quindi contiene gia un nodo struct
} else {
// qui facciamo sempre l'assegnazione di indirizzo di memoria
contenitore = malloc(sizeof(Node));
// controlliamo il successo o fallimento di indirizzo di memoria
if (contenitore == NULL)
return 0;
// non faremo direttamente head ma su contenitore, perche siamo modificando un nuovo elemento
contenitore->initData = *numero;
// qui puntiamo head perche puntiamo ;'indirizzo di memoria che abbiamo assegnato gia da prima, non importa se astralmente si trova destra sinistra dopra e giu
contenitore->next = head;
// ora assegnami a head il nuovo indirizzo di memoria perche avremmo un nuovo elemento sara head che sara collegato al prossimo tramite next
head = contenitore;
// immaginiamo che punti sempre all'ultimo che e' stato aggiunto che a sua volta sara collegato all'ultimo aggiunto prima di lui
}
return contenitore;
}
// TOGLIERE Usiamo in rimuoviNodo int perche restituira return 1 che e fallimento o return 0 come fallimento
// argomento usiamo numero pointer
int rimuoviNodo(int *numero){
// faccio un contenitore per adress di memoria di head contenitore fornisce da attuale di adress
Node *contenitore = head;
// prescendente iniziamo con head anche perche ora come ora, noi partiamo da inzio quidni non avremmo ancora qualcosa prima di haed
Node *precedente = head;
// ora un while che fara la stessa cosa fino a quando contenitore non uguale a NULL diventera NULL perche alla fine non ci saranno piu nodi
while (contenitore != NULL) {
// controlliamo se il numero che abbiamo inserito equivale a initData che e' il valore all'interno del nodo
if (contenitore->initData == *numero){
// if contnitere == head intendiamo se' il primo nodo che troviamo ed e' quello che dobbiamo togliere allora
if (contenitore == head){
// indichiamo un nuovo indirizzo di memoria per head che sara il suo successivo
head = head->next;
//altrimenti
}else{
// prescendete prendere next di contenitore attuale a cui stiamo puntando il suo next
// quindi next = contenitore next attuale, in precendente mettiamo adress a qui verra collegata al prossimo di contenitore che ha head
precedente->next = contenitore->next;
// liberiamo la memoria
free(contenitore);
// rendiamo contenitore NULL
contenitore = NULL;
}
// ritorniamo 1 per successo
return 1;
}
// precendente prende le informazioni di contenitore quidni dati e next
precedente = contenitore;
// contenitore prende come valori quelli dell'indirizzo di memoria a cui e' next
contenitore = contenitore->next;
}
// ritornamo 0 per falliemnto
return 0;
}
// INSERIAMO UNA POSIZIOEN DEL NODO
Node *aggiungiNodoLibero(int *numeroPosizione, int *numeroNumero) {
// ######################## CODICE 1 IDEA
Node *same = head;
Node *precedente = head;
Node *newNode = NULL;
newNode = malloc(sizeof(Node));
newNode->initData = *numeroNumero;
// if i type 2 i will iterate 2 times!! so . i type 1 it will go to first node
// DA sistemare!!! PROBLEM IN NUMERO POSIZIONE
if (*numeroPosizione == 1){
same = NULL;
(*numeroPosizione)--;
printf("per aggiungere a primo bisogna usare il comando add. nel menu!\n");
}
while (same != NULL && numeroPosizione != 0) {
printf("swagger while Posizione: %d\n", *numeroPosizione);
(*numeroPosizione)--;
if (*numeroPosizione == 0) {
printf("swagger if Posizione: %d\n", *numeroPosizione);
precedente->next = newNode;
newNode->next = same;
}
precedente = same;
same = same->next;
}
// ###############CODICE 2
// Node *same = head;
// while (same != NULL && *numeroPosizione != 0)
// {
// same = same->next;
// (*numeroPosizione)--;
// }
// if (numeroPosizione != 0)
// {
// printf("NON TROVATO POSIZIONE NON DISPONIBILE");
// return NULL;
// }
// Node *new = malloc(sizeof(Node));
// if (new == NULL)
// return NULL;
// new->initData = *numeroNumero;
// new->next = same->next;
// same->next = new;
// return new;
}
// STAMPARE
void printList() {
// node
// puntiamo a al primo head collegato all'indirizzo di memoria dell'ultimo aggiunto difatti
// stiamo dando ad attuale indirizzo di memoria di head
// nella costruzione del head noi puntiamo sempre a contenitore alla fine quindi l'ultimo aggiunto e primo della lista sara questo
Node *attuale = head;
//il ciclo per la stampa partira solo se non e' null attaule quindi nemmeno head null la lista ha valori
while (attuale != NULL){
// stampera iniData di attuale nello stesso indirizzo di memoria di head
printf("%d linkato a -> ", attuale-> initData);
//dato che in head e' contenuto anche indirizzo di memoria di quello su ccessivo attuale prendere il prossimo indirizzo di memoria
attuale = attuale->next;
// ricomincia il ciclo fino a quando attuale non si trovera in un indirizzo NULL
}
}
// USCIRE DAL GIOCO
// FUNZIONE DI CONTROLLO
void stampaControlli() {
printf("\n");
printf("###################################################################################################\n");
printf("Questi sono i comandi che puoi usare per la tua linkedList: \n");
printf("\t'1' aggiungera un elemento nella lista , in caso sia vuota verra aggiunta una nuova e spostata a destra quella vecchia\n");
printf("\t'2' togliera un elemento dalla lista\n");
printf("\t'3' inserimenti posizione del nodo\n");
printf("\t'4' ti fara printare le tua lista ->\n");
printf("\t'5' ti fara uscire dal programma\n");
printf("####################################################################################################\n");
printf("\n");
return;
}
int datoPerInit;
Node *contenitore;
int main(int argc, char *argv[]){
int controllo =-2;
while (controllo !=5){
stampaControlli();
int numeroScelto = scanf("%d", &controllo);
if (numeroScelto == 1 && numeroScelto > 0 && numeroScelto < 5){
switch (controllo) {
case 1:
printf("\taggiungo \n");
scanf("%d", &datoPerInit);
// node poinmter usiamo un node contenitore per contenere il return di contenitore nella funziona ggiungiNodo
contenitore = aggiungiNodo(&datoPerInit);
printf("al numero scelto e' stato dato indirizzo di memoria: %p\n", (void*)contenitore);
printf("\n");
break;
case 2:
printf("\ttolgo \n");
// iniiziare remove :w
// inseriamo un intero che verra passato a rimuoviNodo
scanf("%d", &datoPerInit);
// usiamo int non nodo perchhe avremo un int che ritorna return 0 o 1
int swag = rimuoviNodo(&datoPerInit);
// return 1 success, return 0 not succes
if (!swag){
printf("e' stato un fallimento. Non esiste nella lista il numero: %d\n", datoPerInit);
} else {
printf("e' stato rimossso correttamente il numero: %d\n", datoPerInit);
}
printf("\n");
break;
case 3:
// uso 2 numeri di inserimento: 1 per la posizione e uno per il numero che si vuole inserire:w
//
printf("\tinserimento\n");
printf("inserimento numero della posizione: \n");
int numberPosition;
scanf("%d", &numberPosition);
printf("Inserisci numero che vuole inserire nella lista\n");
scanf("%d", &datoPerInit);
contenitore = aggiungiNodoLibero(&numberPosition, &datoPerInit);
printf("\n");
break;
case 4:
printf("\tPRINTING\n");
printList();
printf("\n");
break;
case 5:
printf("\tquit dal programma\n");
printf("\n");
break;
}
}
}
return 0;
}