summaryrefslogtreecommitdiff
path: root/c/dataStructure/408/list/lklist.c
diff options
context:
space:
mode:
authorgarhve <git@garhve.com>2022-12-05 19:43:39 +0800
committergarhve <git@garhve.com>2022-12-05 19:43:39 +0800
commitc6bc541ab58363d783e60a007e80e9bf9e231fda (patch)
treea59c7ed0d05225c5876f3e5e919d4f6ed0c447ff /c/dataStructure/408/list/lklist.c
initialize
Diffstat (limited to 'c/dataStructure/408/list/lklist.c')
-rwxr-xr-xc/dataStructure/408/list/lklist.c174
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);
+ }
+}