summaryrefslogtreecommitdiff
path: root/c/dataStructure/线性表/顺序表
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/线性表/顺序表
initialize
Diffstat (limited to 'c/dataStructure/线性表/顺序表')
-rwxr-xr-xc/dataStructure/线性表/顺序表/main.c47
-rwxr-xr-xc/dataStructure/线性表/顺序表/sequence.c151
-rwxr-xr-xc/dataStructure/线性表/顺序表/sequence.h32
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