diff options
Diffstat (limited to 'c/dataStructure/408/list/lklist.c')
-rwxr-xr-x | c/dataStructure/408/list/lklist.c | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/c/dataStructure/408/list/lklist.c b/c/dataStructure/408/list/lklist.c new file mode 100755 index 0000000..c2112b1 --- /dev/null +++ b/c/dataStructure/408/list/lklist.c @@ -0,0 +1,174 @@ +#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); + } +} |