线性表线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列
线性表的结构包括顺序存储和链式存储(这次展示的是顺序存储。。。)
//数据类型:
typedef int ElemType; typedef struct { ElemType *elem; int lenght; int listSize; //当前分配的储存容量 }SqList;
/*具体实现*/
//线性表(顺序表的实现)初始化 Status InitList(SqList *L) { ElemType *p; p = (ElemType *)malloc(LIST_INT_SIZE * sizeof(ElemType)); if (!p) { printf("InitList Error:%d", OVERFLOW); } L->elem = p; L->lenght = 0; L->listSize = LIST_INT_SIZE; return OK; } //删除表中的数据 Status ListDelete(SqList *L,int pos,ElemType *e) { if (L->lenght <= 0)return OK; int i = 0; *e = L->elem[pos - 1] ; for (i = pos-1; i < L->lenght-1; i++) { L->elem[i] = L->elem[i + 1]; } L->lenght--; return OK; } //销毁线性表 Status DestoryList(SqList *L) { free(L->elem); L->elem = NULL; L = NULL; printf("SqList 销毁成功 !!! \n"); return OK; } Status ClearList(SqList *L) { int i = 0; for (i = 0; i < L->listSize;i++) { L->elem[i] = -1; } L->lenght = 0; return OK; } //在第i个位置插入e Status ListInsert(SqList *L, int pos, int e) { ElemType *p =NULL; //判断表是否达到上限 int i = 0; if (L->lenght >= L->listSize) { //表达到上限 扩展表 p = (ElemType *)malloc(LIST_INT_SIZE * 2 * sizeof(ElemType));//扩展原来的二倍 if (!p)return OVERFLOW; //将原先表中的数据拷贝到新表中 for (i = 0; i < L->lenght; i++) { p[i] = L->elem[i]; } //修改数据 L->listSize = 2 * LIST_INT_SIZE; L->elem = p; L->lenght++; } //添加的数据 for (i = L->lenght - 1; i >= pos - 1; i--) { L->elem[i + 1] = L->elem[i]; } L->elem[pos - 1] = e; return OK; } //测试插入元素 void test(SqList *L) { int i = 0; for (i = 0; i < 10; i++) { (*L).elem[i] = i + 1; (*L).lenght++; } } //打印 void printList(SqList L) { int i = 0; for (i = 0; i < L.lenght; i++) { printf("%d ", L.elem[i]); } printf("\n%d", L.lenght); }
测试数据:
Status main() { Status flag = 0; SqList L; int i = 0; ElemType e; flag = InitList(&L); if(flag !=0) { printf("InitList fun Error:%d", flag); exit(ERROR); } test(&L); for (i = 0; i < 10; i++) { printf("%d ", L.elem[i]); } printf("\n%d", L.lenght); printf("\n"); flag = ListInsert(&L, 8, 111); if (flag != 0) { printf("ListInsert fun Error:%d", flag); exit(ERROR); } printList(L); flag = ListDelete(&L,8,&e); if (flag != 0) { printf("ListInsert fun Error:%d", flag); exit(ERROR); } printf("\n元素e:%d已被删除\n",e); printList(L); system("pause"); return OK; }
此顺序表还有不完善的地方,排序规则没有定义(后续会补上),如果有什么不足之处,多多指正。。。