/*
* Esercizio di creazione di una linked list con struttura
* a catena, attraverso l'utilizzo di un nodo sentinella.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
char info[30];
struct node *p_next;
};
typedef struct node ELEMENT;
typedef ELEMENT *LINK;
LINK head, punt, h_sentinel, t_sentinel;
void chain_inseriment(short, ELEMENT *, ELEMENT **);
void chain_elimination(char [], ELEMENT *);
int main(int argc, char *argv[]) {
int ch = 0; ELEMENT *data; char node_to_elim[30];
h_sentinel = (ELEMENT *)calloc(1, sizeof(ELEMENT));
t_sentinel = (ELEMENT *)calloc(1, sizeof(ELEMENT));
strcpy(h_sentinel->info, "HEAD SENTINEL");
strcpy(t_sentinel->info, "TAIL SENTINEL");
head = h_sentinel;
h_sentinel->p_next = t_sentinel;
t_sentinel->p_next = h_sentinel;
while(ch != 3) {
printf("0. Show, 1. Inseriment, 2. Elimination, 3. Exit;\n>> ");
scanf("%d", &ch);
switch(ch) {
case 0:
punt = h_sentinel;
while(punt != t_sentinel) {
printf("%s\n", punt->info);
punt = punt->p_next;
}
printf("***\n");
break;
case 1:
printf("Inseriment of the node:\n");
data = (ELEMENT *)calloc(1, sizeof(ELEMENT));
scanf(" %s", data->info);
chain_inseriment(sizeof(ELEMENT), data, &h_sentinel);
printf("***\n");
break;
case 2:
printf("Elimination of the node:\n");
scanf(" %s", node_to_elim);
chain_elimination(node_to_elim, h_sentinel);
printf("***\n");
break;
case 3:
printf("Exiting..\n");
exit(1);
default:
printf("Command not found..\n");
break;
}
}
}
void chain_inseriment(short len_info, ELEMENT *data, ELEMENT **h_sentinel) {
ELEMENT *ptr = (ELEMENT *)calloc(1, sizeof(ELEMENT));
memcpy(ptr, data, len_info);
ptr->p_next = (*h_sentinel)->p_next;
(*h_sentinel)->p_next = ptr;
}
void chain_elimination(char node_to_elim[], ELEMENT *h_sentinel) {
punt = h_sentinel;
while(punt != t_sentinel) {
if(strcmp((punt->p_next)->info, node_to_elim) == 0) {
punt->p_next = (punt->p_next)->p_next;
break;
} else {
punt = punt->p_next;
}
}
}