数据结构学习第一天
线性表线性表是最基本、最简单、也是最常用的一种数据结构。线性表(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; } //添加的数据 for (i = L->lenght - 1; i >= pos - 1; i--) { L->elem[i + 1] = L->elem[i]; } L->elem[pos] = e; L->lenght++; 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; }
线性表更复杂的操作合并两个线性表中的不同数据La={1,2,3,4,5} Lb={6,7,8,9,10} union之后La=La(没合并之前的a表)ULb={1,2,3,4,5,6,7,8,9,10}
//线性表L已经存在,compare() 返回第一个与e满足关系的 数据 位次。若没有这样的数据返回0 //这样 的函数 称为回调函数(使用到函数指针) Status LocateElem(SqList *L, ElemType e, Status(*compare)(ElemType, ElemType)) { //这里主要判断两个元素的关系 int i = 0; /*默认的索引在这里 定义约束 元素的下标+1*/ for (i = 0; i < L->lenght; i++) { if (compare(L->elem[i], e)) { //相等返回下标 return i + 1; } } return 0; } /*用户自定义方法*/ Status equal(ElemType e1, ElemType e2) { if (e1 == e2) { return 1; } return 0; } /*将L2中的数据拷贝到L1中(L1中不包含的数据)*/ void unionSq(SqList *L1,SqList L2) { int la_len = L1->lenght; int lb_len = L2.lenght; int i = 0; for (i = 0; i < lb_len; i++) { //判断La中是否有Lb中的数据 if (!LocateElem(&(*L1), L2.elem[i], equal)) { ListInsert(&(*L1), la_len + i, L2.elem[i]); //(*L1).lenght++; } } return OK; }
理论知识参考数据结构(严蔚敏) 算法2.1