#include "list.h" /* Fundamental */ void initList(List * L) { L->lin = NULL; } int lengthList(List * L) { linkList tmp = L->lin; int i = 0; while (tmp) { i++; tmp = tmp->next; } return i; } bool locateElem(List * L, int * i, int e) { linkList tmp = L->lin; *i = 1; while (tmp) { if (tmp->elem != e) { (*i)++; tmp = tmp->next; } else return true; } return false; } bool getElem(List * L, int i, int * e) { linkList tmp = L->lin; for (int j = 1; j < i; j++) if(tmp->next) tmp = tmp->next; else { fprintf(stderr,"Location is out of range\n"); return false; } *e = tmp->elem; return true; } bool insertElem(List * L, int i, int e) { if (i <= 0) { fprintf(stderr,"Invalid location!\n"); return false; } linkList scan = L->lin; linkList new = (Link *) malloc (sizeof(Link)); new->elem = e; new->next = NULL; if (!L->lin) { L->lin = new; return true; } else { if (i == 1) { new->next = scan; L->lin = new; } else { int j = 2; while (j++ < i && scan->next) scan = scan->next; if (!scan->next && --j < i) printf("Location is beyond the list length, Append element\n"); new->next = scan->next; scan->next = new; } } return true; } bool deleteElem(List * L, int i, int * e) { linkList tmp = L->lin; if (i == 1) { *e = tmp->elem; L->lin = L->lin->next; free(tmp); return true; } int j = 2; // we need the one before the one needs delete while (j++ < i && tmp->next) tmp = tmp->next; if (!tmp->next) { fprintf(stderr,"location out of range\n"); return false; } *e = tmp->next->elem; if (tmp->next) { linkList t = tmp->next; tmp->next = t->next; free(t); } else free(tmp); return true; } void printList(List * L) { linkList tmp = L->lin; while (tmp) { printf("%d ",tmp->elem); tmp = tmp->next; } putchar('\n'); } void deleteList(List * L) { linkList tmp = L->lin; linkList del; while (tmp) { del = tmp->next; free(tmp); tmp = del; } } /* Homework */ void deleteX(linkList * L, int e) { linkList tmp = *L; if (!tmp->next) return; else { if (tmp->elem == e) { (*L) = (*L)->next; free(tmp); deleteX(&(*L)->next,e); } else if (tmp->next->elem == e) { linkList p = tmp->next; tmp->next = p->next; free(p); deleteX(&tmp,e); } else deleteX(&tmp->next,e); } }