线性表的顺序存储步骤(仅代表个人看法):
1.根据需要实现的操作,确定创建的结构体是什么样的,里面需不需要记录长度等信息
2.然后逐个实现操作
1.创建结构体,用于保存数组和数组长度
typedef struct { int *date; int length, MaxSize; } SqList;
2. InitList初始化表
void InitList(SqList *L) { L->date = (int *)malloc(InitSize * sizeof(int)); L->length = 0; int i; for (i = 0; i < 10; i++) { L->date[i] = i + 1; L->length++; } }
3.ListInsert插入操作(在某个位置插入元素)
bool ListInsert(SqList *L, int i, int number) { if (i < 1 && i > L->length + 1) return false; if (L->length >= InitSize) { L->MaxSize = 2 * InitSize; L->date = (int *)realloc(L->date, L->MaxSize * sizeof(int)); } int j; for (j = L->length; i <= j; j--) { L->date[j] = L->date[j - 1]; } L->date[i - 1] = number; L->length++; return true; }
4.ListDelete删除操作(删除某个位置元数)
bool ListDelete(SqList *L, int i) { if (i < 1 && i > L->length) //判断是否在有效区间,还可以判断顺序表为空也不能删除操作 return false; /**可写可不写 if (!L->date) //判断顺序表为空 { return false; } */ int e = L->date[i - 1]; int j; for (j = i; j < L->length; j++) { L->date[j - 1] = L->date[j]; } L->length--; return true; }
5.LocateElem按值查找参数(从前到后顺序查找)
int LocateElem(SqList *L, int v) { int i; for (i = 0; i < L->length; i++) { if (L->date[i] == v) return i + 1; } return false; }
6.GetElem按位查找
int GetElem(SqList *L, int x) { if (x < 1 && x > L->length) { return false; } else { return L->date[x - 1]; } }
7.求表长
int Length(SqList *L) { return L->length; }
8.PrintList输出顺序表
void PrintList(SqList *L) { if (L != NULL) { int i; for (i = 0; i < L->length; i++) { printf("date[%d]=%d\n", i, L->date[i]); } printf("%d\n", L->length); } else { printf("顺序表已销毁"); } }
完整代码:
//线性表-顺序存储(顺序表) #include <stdio.h> #include <stdbool.h> #include <stdlib.h> //创建结构体,保存数组和数组长度 #define InitSize 10 typedef struct { int *date; int length, MaxSize; } SqList; // InitList初始化表 void InitList(SqList *L) { L->date = (int *)malloc(InitSize * sizeof(int)); L->length = 0; int i; for (i = 0; i < 10; i++) { L->date[i] = i + 1; L->length++; } } // ListInsert插入操作(在某个位置插入元素) bool ListInsert(SqList *L, int i, int number) { if (i < 1 && i > L->length + 1) return false; if (L->length >= InitSize) { L->MaxSize = 2 * InitSize; L->date = (int *)realloc(L->date, L->MaxSize * sizeof(int)); } int j; for (j = L->length; i <= j; j--) { L->date[j] = L->date[j - 1]; } L->date[i - 1] = number; L->length++; return true; } // ListDelete删除操作(删除某个位置元数) bool ListDelete(SqList *L, int i) { if (i < 1 && i > L->length) //判断是否在有效区间,还可以判断顺序表为空也不能删除操作 return false; int e = L->date[i - 1]; int j; for (j = i; j < L->length; j++) { L->date[j - 1] = L->date[j]; } L->length--; return true; } // LocateElem按值查找参数(从前到后顺序查找) int LocateElem(SqList *L, int v) { int i; for (i = 0; i < L->length; i++) { if (L->date[i] == v) return i + 1; } return false; } // GetElem按位查找 int GetElem(SqList *L, int x) { if (x < 1 && x > L->length) { return false; } else { return L->date[x - 1]; } } // Length表长 int Length(SqList *L) { return L->length; } // PrintList输出顺序表 void PrintList(SqList *L) { if (L != NULL) { int i; for (i = 0; i < L->length; i++) { printf("date[%d]=%d\n", i, L->date[i]); } printf("%d\n", L->length); } else { printf("顺序表已销毁"); } } int main() { SqList L; InitList(&L); ListInsert(&L, 5, 666); //在第五个数的位置插入8 ListDelete(&L, 7); //删除位置在7的数 int v = LocateElem(&L, 8); //找到顺序表中数值为8的数字位置 printf("按值查找的数字位置是%d\n", v); // 8 int x = GetElem(&L, 9); //找到顺序表中位置为9的数值是多少 printf("按位查找的数值是%d\n", x); // 9 int l = Length(&L); printf("表的长度是%d\n", l); //输出表长 PrintList(&L); return 0; }
输出结果:
注:如有不足之处,请大佬指正