一 线性表的顺序存储之动态数组
线性表的顺序存储
一 丶定义
线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列.
线性表的相邻元素之间存在着序偶关系。如用(a1,…,ai-1,ai,ai+1,…,an)表示一个顺序表,
则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。
当i=1,2,…,n-1时,ai有且仅有一个直接后继,当i=2,3,…,n时,ai有且仅有一个直接前驱 。
二丶线性表顺序存储各种操作
定义动态数组结构:
1 #define CARRAY_INIT_CAPACITY 5 //初识容量 2 #define CARRAY_INCREAMENT_CAPACITY 10 //增量 3 4 typedef struct CustomArray 5 { 6 void** pAddr; //数组元素存放地址 7 int size; //数组元素个数 8 int capacity; //数组容量 9 }CArray;
动态数组各种操作:
//遍历函数指针 typedef void(*PRINTCARRAY)(void*); //比较函数指针 typedef int(*COMPARE)(void*, void*); //初始化 CArray* Init_CArray(); //尾插 void Insert_CArray(CArray* arr,void* e); //遍历 void Print_CArray(CArray* arr, PRINTCARRAY pCarry); //查找 int Find_CArray(CArray* arr, void* e, COMPARE compare); //按位置删除 void RemoveByPos(CArray* arr, int pos); //按值删除 void RemoveByValue(CArray* arr, void* e, COMPARE compare); //销毁 void Destory_CArray(CArray* arr);
动态数组各种操作的实现:
1 //初始化 2 CArray* Init_CArray() 3 { 4 CArray* arr = (CArray*)malloc(sizeof(CArray)); 5 arr->size = 0; 6 arr->capacity = CARRAY_INIT_CAPACITY; 7 arr->pAddr = malloc(sizeof(void*)*arr->capacity); 8 return arr; 9 } 10 11 //尾插 12 void Insert_CArray(CArray* arr, void* e) 13 { 14 if (arr->size >= arr->capacity) 15 { 16 //建立新空间并拷贝原空间数据 17 void* newbase = realloc(arr->pAddr, (arr->capacity + CARRAY_INCREAMENT_CAPACITY)*sizeof(void*)); 18 if (newbase == NULL) 19 exit(-1); 20 //更新元素地址和数组容量 21 arr->pAddr = newbase; 22 arr->capacity += CARRAY_INCREAMENT_CAPACITY; 23 } 24 //尾插法插入数据 25 arr->pAddr[arr->size] = e; 26 arr->size++; 27 } 28 29 //遍历 30 void Print_CArray(CArray* arr, PRINTCARRAY pCarry) 31 { 32 if (arr == NULL) 33 return; 34 for (int i = 0; i < arr->size; i++) 35 { 36 pCarry(arr->pAddr[i]); 37 } 38 printf("\n"); 39 } 40 41 //查找 42 int Find_CArray(CArray* arr, void* e, COMPARE compare) 43 { 44 if (arr == NULL) 45 return -1; 46 int pos = -1; 47 for (int i = 0; i < arr->size; i++) 48 { 49 if (compare(arr->pAddr[i], e)==0) 50 { 51 pos = i; 52 break; 53 } 54 } 55 return pos; 56 } 57 58 //按位置删除 59 void RemoveByPos(CArray* arr, int pos) 60 { 61 if (arr == NULL) 62 return; 63 if (pos<0 || pos>arr->size) 64 return; 65 for (int i = pos; i < arr->size; i++) 66 arr->pAddr[i] = arr->pAddr[i + 1]; 67 arr->size--; 68 } 69 70 //按值删除 71 void RemoveByValue(CArray* arr, void* e, COMPARE compare) 72 { 73 if (arr == NULL) 74 return; 75 int pos = Find_CArray(arr, e, compare); 76 RemoveByPos(arr, pos); 77 } 78 79 //销毁 80 void Destory_CArray(CArray* arr) 81 { 82 if (arr == NULL) 83 return; 84 if (arr->pAddr != NULL) 85 { 86 free(arr->pAddr); 87 arr->pAddr = NULL; 88 } 89 free(arr); 90 arr->pAddr = NULL; 91 }
动态数组的测试:
#include <string.h> typedef struct Person { char name[64]; int age; }Person; void MyPrint(void* data) { Person* p = (Person*)data; printf("Name:%s Age:%d\n", p->name, p->age); } int MyCompare(void* data1, void* data2) { Person* p1 = (Person*)data1; Person* p2 = (Person*)data2; return strcmp(p1->name, p2->name) && p1->age == p2->age == 0; } int main() { //初始化 CArray* arr = Init_CArray(); printf("元素个数:%d\n", arr->size); printf("数组容量:%d\n", arr->capacity); //数据 Person p1 = { "李伟",17 }; Person p2 = { "张浩",21 }; Person p3 = { "刘乐",22 }; Person p4 = { "刘雯",26 }; Person p5 = { "张薇",23 }; Person p6 = { "马可",20 }; Person p7 = { "琉璃",28 }; Person p8 = { "张峰",30 }; Person p9 = { "张磊",10 }; Insert_CArray(arr, &p1); Insert_CArray(arr, &p2); Insert_CArray(arr, &p3); Insert_CArray(arr, &p4); Insert_CArray(arr, &p5); Insert_CArray(arr, &p6); Insert_CArray(arr, &p7); Insert_CArray(arr, &p8); printf("-----添加数据后------\n"); printf("元素个数:%d\n", arr->size); printf("数组容量:%d\n", arr->capacity); printf("----遍历数组元素------\n"); Print_CArray(arr, MyPrint); printf("----查找------\n"); int pos = Find_CArray(arr, &p9, MyCompare); printf("POS:%d\n", pos); printf("-----删除----\n"); RemoveByPos(arr, 2); RemoveByValue(arr, &p8, MyCompare); Print_CArray(arr, MyPrint); Destory_CArray(arr); system("pause"); return 0; }

浙公网安备 33010602011771号