c语言顺序表动态实现
2016-09-11 13:33
357 查看
动态版与静态版区别:当插入数据时内存空间不够时,动态版的顺序表可以再重新开辟一块更大的空间用来存放数据。
顺序表的优缺点:顺序表的优点是便于随机存储,缺点是不便于插入删除等操作,因为插入删除一个元素需要移动其后的所有元素。
结构体实现
typedef int DataType;
typedef struct SeqListD
{
DataType* array;
int capacity;
int size;
}Seq, *pSeq;
函数功能实现
void InitSeqlist(pSeq Seq) {//初始化 assert(Seq); Seq->capacity = 3; Seq->array = (DataType*)malloc(sizeof(DataType)*Seq->capacity); memset(Seq->array, 0, sizeof(DataType) * 3); Seq->size = 0; } int Empty(pSeq Seq) {//判空 assert(Seq); if (0 == Seq->size) { return 1; } return 0; } void PopBack(pSeq Seq) {//尾删 assert(Seq); if (Empty(Seq)) return 0; Seq->size--; } void PushBack(pSeq Seq, DataType data) {//尾插 assert(Seq && data); if (Seq->size >= Seq->capacity) { DataType* temp; Seq->capacity *= 2; temp = (DataType*)malloc(sizeof(DataType)*Seq->capacity); memcpy(temp, Seq->array, sizeof(DataType)*Seq->size); Seq->array = temp; } Seq->array[Seq->size++] = data; }
void PopFront(pSeq Seq) {//头删 int i = 0; assert(Seq); if (Empty(Seq)) return 0; for (i = 0; i < Seq->size - 1; i++) { Seq->array[i] = Seq->array[i + 1]; } Seq->size--; } void PushFront(pSeq Seq, DataType data) {//头插 int i = 0; assert(Seq && data); if (Seq->size >= Seq->capacity) { DataType* temp; Seq->capacity *= 2; temp = (DataType*)malloc(sizeof(DataType)*Seq->capacity); memcpy(temp, Seq->array, sizeof(DataType)*Seq->size); Seq->array = temp; } for (i = Seq->size; i > 0; i--) { Seq->array[i] = Seq->array[i - 1]; } Seq->array[0] = data; Seq->size++; } void PrintSeq(pSeq Seq) {//打印 int i = 0; assert(Seq); for (i = 0; i < Seq->size; i++) printf("%d", Seq->array[i]); printf("\n"); }
void BubbleSort1(pSeq Seq) {//回调函数冒泡升序 int i = 0; int j = 0; int flag = 0; assert(Seq); for (j = 0; j < Seq->size; j++) { flag = 1; for (i = 0; i < Seq->size - j - 1; i++) { if (Seq->array[i]>Seq->array[i + 1]) { DataType temp = Seq->array[i]; Seq->array[i] = Seq->array[i + 1]; Seq->array[i + 1] = temp; flag = 0; } } if (flag) return 0; } } void BubbleSort2(pSeq Seq) {//回调函数冒泡降序 int i = 0; int j = 0; int flag = 0; assert(Seq); for (i = 0; i < Seq->size; i++) { flag = 1; for (j = 0; j < Seq->size - i - 1; j++) { if (Seq->array[j] < Seq->array[j + 1]) { DataType temp = Seq->array[j]; Seq->array[j] = Seq->array[j + 1]; Seq->array[j + 1] = temp; flag = 0; } } if (flag) return 0; } } void BubbleSort(pSeq Seq, void(*op)(pSeq)) {//回调函数登记函数 assert(Seq); op(Seq); }
void SelectSort(pSeq Seq) {//选择排序降序 int i = 0; int j = 0; int min = 0; assert(Seq); for (j = 0; j < Seq->size; j++) { min = j; for (i = j + 1; i < Seq->size - j - 1; i++) { if (Seq->array[min] > Seq->array[i]) { min = i; } DataType temp = 0; temp = Seq->array[i]; Seq->array[i] = Seq->array[min]; Seq->array[min] = temp; } } } int BinarySearch(pSeq Seq, DataType data) {//二分 assert(Seq); int left = 0; int right = Seq->size - 1; int mid = left + (right - left) >> 1; assert(Seq && data); while (left <= right) { if (Seq->array[mid] > data) right = mid - 1; else if (Seq->array[mid] < data) left = mid + 1; else return mid; } } int BinarySearch2(pSeq Seq,DataType data,int left,int right) {//递归二分 assert(Seq&& (right < Seq->size)); int mid = left + (right - left) >> 1; if (data<Seq->array[mid]) { BinarySearch2(Seq,data,left,mid-1); } else if (data>Seq->array[mid]) { BinarySearch2(Seq, data, mid, right); } else { return mid; } } int Size(pSeq Seq) {//判断大小 assert(Seq); return Seq->size; } void Clear(pSeq Seq) {//清空 asserr(Seq); Seq->size = 0; }