diff options
author | garhve <git@garhve.com> | 2022-12-05 19:43:39 +0800 |
---|---|---|
committer | garhve <git@garhve.com> | 2022-12-05 19:43:39 +0800 |
commit | c6bc541ab58363d783e60a007e80e9bf9e231fda (patch) | |
tree | a59c7ed0d05225c5876f3e5e919d4f6ed0c447ff /c/dataStructure/408/list |
initialize
Diffstat (limited to 'c/dataStructure/408/list')
-rwxr-xr-x | c/dataStructure/408/list/Makefile | 24 | ||||
-rwxr-xr-x | c/dataStructure/408/list/list.h | 69 | ||||
-rwxr-xr-x | c/dataStructure/408/list/lklist.c | 174 | ||||
-rwxr-xr-x | c/dataStructure/408/list/main.c | 41 | ||||
-rwxr-xr-x | c/dataStructure/408/list/sqlist.c | 201 |
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); +} |