In informatica, una lista (in inglese list) è una struttura dati astratta e dinamica (la memoria usata non è necessariamente fisicamente contigua) che denota una collezione omogenea o container di dati. L'accesso a un elemento della struttura avviene direttamente solo al primo elemento della sequenza; per accedere a un qualunque elemento, occorre scandire sequenzialmente tutti gli elementi che lo precedono; è una struttura dati dinamica poiché può cambiare di dimensione grazie alle operazioni di inserimento ed eliminazione di elementi, diversamente al caso degli array standard.
Le operazioni fondamentali offerte da una Lista sono le seguenti:

Principalmente, vi sono due implementazioni delle Liste. Una utilizza come appoggio gli array, l'altra le strutture collegate; i due approcci si differenziano per le prestazioni offerte. In particolare, un ArrayList offrirà un accesso random al costo di O(1), mentre una LinkedList offrirà un costo O(n); dall'altro lato un inserimento su un ArrayList potrebbe costare O(n) (nel caso di ridimensionamento dell'array), mentre su una LinkedList costerà sempre O(1).
typedef int TKey;
typedef int TSat;
struct SInfo{
TKey key;
TSat satellite;
};
typedef struct SInfo TInfo;
struct SNode{
TInfo info;
struct TNode *link;
};
typedef struct SNode TNode;
typedef TNode* TList;
TList list_create() {
return NULL;
}
TList list_insert(TList list, TInfo info) {
TList curr, succ;
curr = NULL;
succ = list;
while(succ != NULL && greater(info.key, succ->info.key)){
curr = succ;
succ = succ->link;
}
TNode* new;
new = (TNode)malloc(sizeof(TNode));
new->info = info;
if(curr == NULL) {
new->link = list;
return new;
} else {
curr->link = new;
new->link = succ;
return list;
}
}
TList list_delete(TList list, TKey key) {
TList curr, succ;
curr = NULL;
succ = list;
while(succ != NULL && greater(key,succ->info.key)) {
curr = succ;
succ = succ->link;
}
if(succ != NULL && equal(key,succ->info.key)) {
if(curr == NULL) {
list = succ->link;
} else {
curr = succ->link;
free(succ);
} return list;
}
}
T_Node* list_search(T_List list, T_Key key) {
T_List curr;
curr = list;
while((curr != NULL) && greater_team(key,curr->info.tag)) {
curr = curr->link;
}
if((curr != NULL) && equal_team(key,curr->info.tag)) {
return curr;
} else {
return NULL;
}
}
void list_visit(T_List list) {
T_List curr;
curr = list;
while(curr != NULL) {
print_node(curr->info);
curr = curr->link;
}
}
int conta_nodi(T_List list) {
if(list == NULL) {
return 0;
} else {
return 1 + conta_nodi(list->link);
}
}
T_List list_destroy(T_List list) {
T_List curr, succ;
curr = list;
while(curr != NULL) {
succ = curr->link;
free(curr);
curr=succ;
}
}
TList list_create() {
return NULL;
}
TList list_insert(TList list, Tinfo info) {
if(list == NULL || greater(list->info.key, info.key)) {
TNode* new;
new = (TNode*)malloc(sizeof(TNode));
new->info = info;
new->link = list;
return new;
} else {
list->link = list_insert(list->link, info);
return list;
}
}
TList list_delete(TList list, TKey key) {
if((list == NULL) || grater(list->info.key, key)){
return list;
} else if(equal(list->info.key, key)) {
TList alias;
alias = list->link;
free(list);
return alias;
} else {
list->link = list_delete(list->link, key);
return list;
}
}
T_Node* list_search(T_List list, T_Key key) {
if(list == NULL || equal(list->info.key, key)){
return list;
} else if(grater(list->info.key, key)){
return NULL;
} else {
list_search(list->link, key);
}
}
void list_visit(T_List list) {
if(list != NULL) {
print_info(list->info);
list_visit(lista->link);
}
}
void list_visit(T_List list) {
if(list != NULL) {
list_visit(lista->link);
print_info(list->info);
}
}
int conta_nodi(T_List list) {
if(list == NULL){
return 0;
} else {
return 1 + conta_nodi(list->link);
}
}
T_List list_destroy(T_List t) {
if (t != NULL)
{
list_destroy(t->link);
free(t);
}
return NULL;
}
| Controllo di autorità | LCCN (EN) sh85077455 · GND (DE) 4783888-7 · J9U (EN, HE) 987007531493105171 |
|---|