diff options
Diffstat (limited to 'c/dataStructure/线性表/顺序表')
-rwxr-xr-x | c/dataStructure/线性表/顺序表/main.c | 47 | ||||
-rwxr-xr-x | c/dataStructure/线性表/顺序表/sequence.c | 151 | ||||
-rwxr-xr-x | c/dataStructure/线性表/顺序表/sequence.h | 32 |
3 files changed, 230 insertions, 0 deletions
diff --git a/c/dataStructure/线性表/顺序表/main.c b/c/dataStructure/线性表/顺序表/main.c new file mode 100755 index 0000000..66e4031 --- /dev/null +++ b/c/dataStructure/线性表/顺序表/main.c @@ -0,0 +1,47 @@ +#include "sequence.h" + +int main(void) +{ + Elem number; + + InitList(&number); + + if (ListEmpty(&number)) + printf("List now is empty\n"); + + printf("So the length of list would be %d\n",ListLength(&number)); + + for (int i = 0; i < 10; i++) + AddElem(&number, i*i-i*3); + + ElemType n; + if ((n = GetElem(&number,3) != -1)) + printf("Element at position 3 is %d\n", n); + + if ((n = GetElem(&number,7)) != -1) + printf("Element at position 7 is %d\n", n); + + if ((n = LocateElem(&number,-2)) != 0) + printf("Number -2 is at %dth\n",n); + else + printf("Element not found\n"); + + for (int i = 0; i < number.length; i++) + printf("Element %d: %d\n", i+1, number.elem[i]); + putchar('\n'); + + ListInsert(&number,3,7); + + for (int i = 0; i < number.length; i++) + printf("Element %d: %d\n", i+1, number.elem[i]); + putchar('\n'); + + ListDelete(&number,6); + + for (int i = 0; i < number.length; i++) + printf("Element %d: %d\n", i+1, number.elem[i]); + + DestroyList(&number); + + return 0; +}
\ No newline at end of file diff --git a/c/dataStructure/线性表/顺序表/sequence.c b/c/dataStructure/线性表/顺序表/sequence.c new file mode 100755 index 0000000..8a26488 --- /dev/null +++ b/c/dataStructure/线性表/顺序表/sequence.c @@ -0,0 +1,151 @@ +#include "sequence.h" + +void InitList(Elem * L) +{ + L->elem = (ElemType *) malloc (sizeof(ElemType) * MAXSIZE); + + if (!(L->elem)) + { + fprintf(stderr,"Initialization Failed\nPlease run as debug mode\n"); + exit(EXIT_FAILURE); + } + + L->length = 0; + + puts("Initialization Successful!"); + printf("You now have %d storage sequence list!\n",MAXSIZE); +} + +void DestroyList(Elem * L) +{ + if (L->elem) + free(L->elem); + else + printf("Sequence list is not exist!\n"); +} + +void AddElem (Elem * L, ElemType e) +{ + if (L->length >= MAXSIZE) + { + printf("No memory for more data\n" + "You could try to release some unused item.\n"); + puts("Add failed"); + } + + else + { + int i = 0; + + while (i < L->length) + i++; + + *(L->elem + i) = e; + L->length++; + } +} + +bool ListEmpty (Elem * L) +{ + return L->length = 0 ? true:false; +} + +ElemType ListLength (Elem * L) +{ + return L->length; +} + +ElemType GetElem (Elem * L, int i) +{ + if (i > L->length) + { + fprintf(stderr,"%d is out of index\n" + "Please keep index between 0 and %d\n", + i, L->length); + return -1; + } + return *(L->elem + i - 1); +} + +ElemType LocateElem (Elem * L, ElemType e) +{ + for (int i = 0; i < L->length; i++) + { + if (e == *(L->elem + i)) + return i + 1; + } + + return 0; +} + +ElemType PriorELem (Elem * L, ElemType e) +{ + ElemType i = 0; + + while (e != *(L->elem + i) && (i < L->length)) + i++; + if (i == 0) + { + printf("The value is at first, so no element before it\n"); + free(L->elem); + exit(EXIT_FAILURE); + } + else if (i >= L->length) + { + printf("The element is not found.\n"); + free(L->elem); + exit(EXIT_FAILURE); + } + return *(L->elem + i - 1); +} + +ElemType NextElem (Elem * L, ElemType e) +{ + ElemType i = 0; + + while (e != *(L->elem + i) && (i < L->length - 1)) + i++; + if (i == L->length - 1) + { + printf("Not found this element in list.\n"); + free(L->elem); + exit(EXIT_FAILURE); + } + return *(L->elem + i); +} + +bool ListInsert (Elem * L, ElemType e, int i) +{ + if (i < 1 || i >= L->length) + { + fprintf(stderr,"Index should be between 0 and %d\n", + L->length); + return false; + } + + for (int n = L->length; n > i - 1; n--) + L->elem[n] = L->elem[n - 1]; + L->elem[i-1] = e; + L->length++; + + return true; +} + +bool ListDelete (Elem * L, int i) +{ + if (i < 1 || i >= L->length) + { + fprintf(stderr,"Index should be between 0 and %d\n", + L->length); + return false; + } + + printf("Element %d has been deleted\n", L->elem[i-1]); + + for (int n = i; n < L->length; n++) + { + L->elem[n-1] = L->elem[n]; + } + L->length--; + return true; +}
\ No newline at end of file diff --git a/c/dataStructure/线性表/顺序表/sequence.h b/c/dataStructure/线性表/顺序表/sequence.h new file mode 100755 index 0000000..6a48d67 --- /dev/null +++ b/c/dataStructure/线性表/顺序表/sequence.h @@ -0,0 +1,32 @@ +#ifndef SEQUENCE_H_ +#define SEQUENCE_H_ + +#define MAXSIZE 100 + +#include<stdio.h> +#include<stdlib.h> +#include<stdbool.h> + +typedef int ElemType; + +typedef struct data { + ElemType * elem; + int length; +} Elem; + +void InitList (Elem * L); +void DestroyList (Elem * L); +void ClearList (Elem * L); +void AddElem (Elem * L, ElemType e); // Add an element, length +1 +bool ListEmpty (Elem * L); +ElemType ListLength (Elem * L); +ElemType GetElem (Elem * L, int i); // Get ith element +ElemType LocateElem (Elem * L, ElemType e); // return element e's position, if not found, return 0 +ElemType PriorElem (Elem * L, ElemType e); // return precedent element of e +ElemType NextElem (Elem * L, ElemType e); // return element after e +bool ListInsert (Elem * L, ElemType e, int i); // insert Elem at i +bool ListDelete (Elem * L, int i); // delete ith element +void TraverseList (Elem * L); // traverse all list +char OperateMenu (void); // show Menu to user + +#endif
\ No newline at end of file |