summaryrefslogtreecommitdiff
path: root/c/dataStructure/408/list
diff options
context:
space:
mode:
Diffstat (limited to 'c/dataStructure/408/list')
-rwxr-xr-xc/dataStructure/408/list/Makefile24
-rwxr-xr-xc/dataStructure/408/list/list.h69
-rwxr-xr-xc/dataStructure/408/list/lklist.c174
-rwxr-xr-xc/dataStructure/408/list/main.c41
-rwxr-xr-xc/dataStructure/408/list/sqlist.c201
5 files changed, 509 insertions, 0 deletions
diff --git a/c/dataStructure/408/list/Makefile b/c/dataStructure/408/list/Makefile
new file mode 100755
index 0000000..0b76bbc
--- /dev/null
+++ b/c/dataStructure/408/list/Makefile
@@ -0,0 +1,24 @@
+CC = gcc
+
+FLGS = -Wall -Werror -g
+
+SSRCS = main.c sqlist.c
+LSRCS = main.c lklist.c
+
+OPT = ./list
+
+ALL: link run clean
+
+link:
+ $(CC) $(LSRCS) $(FLGS) -o $(OPT)
+list:
+ $(CC) $(SSRCS) $(FLGS) -o $(OPT)
+
+run:
+ $(OPT)
+
+gdb: $(OPT)
+ gdb $(OPT)
+
+clean:
+ rm $(OPT)
diff --git a/c/dataStructure/408/list/list.h b/c/dataStructure/408/list/list.h
new file mode 100755
index 0000000..811c62d
--- /dev/null
+++ b/c/dataStructure/408/list/list.h
@@ -0,0 +1,69 @@
+/*
+ * In order to use one header file for both
+ * sequence list and linked list, I used linked list style
+ * this may cause inconvenient when inplementing sequence list
+ */
+
+#ifndef _LIST_H
+#define _LIST_H
+
+#include<stdio.h>
+#include<stdlib.h>
+#include<stdbool.h>
+
+#define MAX 50
+
+typedef struct seq {
+ int * data;
+ int length;
+ int maxSize;
+} Seq;
+typedef Seq * sqList;
+
+typedef struct link {
+ int elem;
+ struct link * next;
+} Link;
+typedef Link * linkList;
+
+typedef struct list {
+ sqList sql;
+ linkList lin;
+} List;
+
+/* initialize list
+ * exit with code EXIT_FAILURE if initialize fail,
+ * otherwise nothing return */
+void initList(List * L);
+
+/* return number of current elements
+ * if list does not exist, return -1 */
+int lengthList(List * L);
+
+/* find location of the element
+ * if element exists, return location
+ * else return false */
+bool locateElem(List * L, int * i, int e);
+
+/* find element at given location
+ * if location is bigger/smaller than length/0
+ * return false
+ * else return location */
+bool getElem(List * L, int i, int * e);
+
+/* insert element at given location
+ * if location is bigger than length, insert at last
+ * if location is 0 or negative, return false */
+bool insertElem(List * L, int i, int e);
+
+/* if location is bigger than length,
+ * or is smaller than 1,
+ * return false */
+bool deleteElem(List * L, int i, int * e);
+void printList (List * L);
+
+/* check if list exist and have no element */
+bool emptyList (List * L);
+void deleteList(List * L);
+
+#endif
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);
+ }
+}
diff --git a/c/dataStructure/408/list/main.c b/c/dataStructure/408/list/main.c
new file mode 100755
index 0000000..34e4030
--- /dev/null
+++ b/c/dataStructure/408/list/main.c
@@ -0,0 +1,41 @@
+#include "list.h"
+
+int deleteMin(List * L);
+void reverse(List * L);
+//void deleteX(List * L, int e);
+void deleteX(linkList * L, int e);
+void loopLeftN(List * L, int n);
+int main(void)
+{
+ List U;
+ initList(&U);
+
+ for (int i = 1; i <= 10; i++)
+ insertElem(&U,i,i*2);
+ int p;
+ printList(&U);
+// loopLeftN(&U,3);
+// printList(&U);
+ getElem(&U,8,&p);
+ printf("%d\n",p);
+ locateElem(&U,&p,10);
+ printf("%d\n",p);
+ deleteElem(&U,3,&p);
+ printf("%d\n",p);
+ insertElem(&U,7,p);
+ insertElem(&U,7,p);
+ insertElem(&U,7,p);
+ insertElem(&U,7,p);
+ insertElem(&U,7,p);
+ printList(&U);
+ deleteX(&U.lin,p);
+ deleteX(&U.lin,2);
+ deleteX(&U.lin,20);
+ printList(&U);
+// reverse(&U);
+// printList(&U);
+
+ deleteList(&U);
+
+ return 0;
+}
diff --git a/c/dataStructure/408/list/sqlist.c b/c/dataStructure/408/list/sqlist.c
new file mode 100755
index 0000000..05893b4
--- /dev/null
+++ b/c/dataStructure/408/list/sqlist.c
@@ -0,0 +1,201 @@
+#include "list.h"
+
+/* Fundamental */
+void initList(List * L)
+{
+
+ // create new list
+ L->sql = (Seq *) calloc (1,sizeof(Seq));
+ if (!L->sql)
+ {
+ fprintf(stderr,"create list fail\n");
+ exit(EXIT_FAILURE);
+ }
+
+ sqList tmp = L->sql;
+ // allocate memory
+ tmp->data = (int *) calloc (MAX, sizeof(int));
+ if (!tmp->data)
+ {
+ fprintf(stderr,"allocate memory fail\n");
+ exit(EXIT_FAILURE);
+ }
+
+ tmp->length = 0;
+ tmp->maxSize = MAX;
+}
+
+int lengthList(List * L)
+{
+ return L->sql->length;
+}
+
+bool locateElem(List * L, int * i, int e)
+{
+ sqList tmp = L->sql;
+ for (int j = 0; j < tmp->length; j++)
+ if (tmp->data[j] == e)
+ {
+ *i = j + 1;
+ return true;
+ }
+ return false;
+}
+
+bool getElem(List * L, int i, int * e)
+{
+ sqList tmp = L->sql;
+ if (i < 1 || i > tmp->length)
+ {
+ fprintf(stderr,"Out of range\n");
+ return false;
+ }
+ *e = tmp->data[i-1];
+
+ return true;
+}
+
+bool insertElem(List * L, int i, int e)
+{
+ sqList tmp = L->sql;
+ if (i < 1 || i > tmp->length+1)
+ {
+ fprintf(stderr, "Out of range\n");
+ return false;
+ }
+ if (tmp->length == tmp->maxSize)
+ {
+ fprintf(stderr, "List full\n");
+ return false;
+ }
+ for (int j = tmp->length; j >= i; j--)
+ tmp->data[j] = tmp->data[j-1];
+ tmp->data[i-1] = e;
+ tmp->length++;
+
+ return true;
+}
+
+bool deleteElem(List * L, int i, int * e)
+{
+ sqList tmp = L->sql;
+ if (i < 1 || i > tmp->length)
+ {
+ fprintf(stderr,"Out of range\n");
+ return false;
+ }
+ *e = tmp->data[i-1];
+
+ for (int j = i; j < tmp->length; j++)
+ tmp->data[j-1] = tmp->data[j];
+ tmp->length--;
+ return true;
+}
+
+void printList(List * L)
+{
+ sqList tmp = L->sql;
+ for (int i = 0; i < tmp->length; i++)
+ printf("%d ",tmp->data[i]);
+ putchar('\n');
+}
+
+bool emptyList(List * L)
+{
+ sqList tmp = L->sql;
+ if (tmp->length == 0)
+ return true;
+ return false;
+}
+
+void deleteList(List * L)
+{
+ free(L->sql->data);
+ free(L->sql);
+}
+
+/* homework */
+// 1
+int deleteMin(List * L)
+{
+ sqList tmp = L->sql;
+
+ if (tmp->length == 0)
+ {
+ fprintf(stderr,"list is empty\n");
+ exit(1);
+ }
+ int min = tmp->data[0], index = 0;
+
+ for (int i = 1; i < tmp->length; i++)
+ if (min > tmp->data[i])
+ {
+ min = tmp->data[i];
+ index = i;
+ }
+ tmp->length--;
+ for (int i = index; i < tmp->length; i++)
+ tmp->data[i] = tmp->data[i+1];
+ return min;
+}
+
+// 2
+void reverse(List * L)
+{
+ sqList tmp = L->sql;
+ for (int i = 0; i < tmp->length/2; i++)
+ {
+ int t = tmp->data[i];
+ tmp->data[i] = tmp->data[tmp->length-1-i];
+ tmp->data[tmp->length-1-i] = t;
+ }
+}
+
+// 3
+void deleteX(List * L, int e)
+{
+ sqList tmp = L->sql;
+ int n = 0, index = -1, i;
+
+ for (i = 0; i < tmp->length; i++)
+ {
+ if (tmp->data[i] == e)
+ n++;
+ if (tmp->data[i] == e && index == -1)
+ index = i; // get first element's index
+ }
+
+ for (i = index; i + n < tmp->length; i++)
+ tmp->data[i] = tmp->data[i+n];
+ tmp->length -= n;
+}
+
+// 10
+// helper
+void rev(sqList q, int low, int high)
+{
+ for (int i = low; i < (low+high)/2; i++)
+ {
+ int n = i - low;
+ int tmp = q->data[i];
+ q->data[i] = q->data[high-1-n];
+ q->data[high-1-n] = tmp;
+ }
+}
+
+// question answer
+void loopLeftN(List * L, int n){
+ sqList tmp = L->sql;
+ rev(tmp,0,n);
+ rev(tmp,n,tmp->length);
+ rev(tmp,0,tmp->length);
+}
+// extra
+void loopRightN(List * L, int n)
+{
+ sqList tmp = L->sql;
+ n = tmp->length - n;
+ rev(tmp,0,n);
+ rev(tmp,n,tmp->length);
+ rev(tmp,0,tmp->length);
+}