静态顺序表
来源:互联网 发布:php程序设计案例教程 编辑:程序博客网 时间:2024/05/29 18:59
#pragma once #define __SEQ_LIST__ #ifdef __SEQ_LIST__ typedef int DataType; #define DEFAULT_CAPICITY 3 typedef struct SeqList { DataType* array; // 数据块指针 size_t size; // 当前的有效数据个数 size_t capicity; // 容量 }SeqList; //typedef struct SeqList SeqList; typedef enum Tag { TRUE, // 真 FALSE, // 假 }Tag; typedef struct FindRet { Tag isFind; // 是否找到的标示 size_t index; // 找到数据的下标 }FindRet; // 初始化/销毁/打印/检查扩容 void InitSeqList(SeqList* pSeq); void DestorySeqList(SeqList* pSeq); void PrintSeqList(SeqList* pSeq); void CheckExpandCapicity(SeqList* pSeq); // 头插/头删/尾插/尾删 void PushBack(SeqList* pSeq, DataType x); void PopBack(SeqList* pSeq); void PushFront(SeqList* pSeq, DataType x); void PopFront(SeqList* pSeq); // 插入/修改/删除/查找 void Insert(SeqList* pSeq, size_t index, DataType x); void Modified (SeqList* pSeq, size_t index, DataType x); void Remove(SeqList* pSeq, size_t index); FindRet Find(SeqList* pSeq, DataType x,size_t index); Tag Erase(SeqList* pSeq, DataType x, Tag all); // 冒泡排序/选择排序/二分查找 void Swap(DataType* left, DataType* right); void BubbleSort(SeqList* pSeq); void SelectSort(SeqList* pSeq); //FindRet BinarySearch(DataType* array, size_t begin, size_t end, DataType x); FindRet BinarySearch(SeqList* pSep, DataType x); ////////////////////////////////////////////////////////////////////////////// // 实现 void InitSeqList(SeqList* pSeq) { assert(pSeq); pSeq->array = (DataType*)malloc(sizeof(DataType)*DEFAULT_CAPICITY); pSeq->size = 0; pSeq->capicity = DEFAULT_CAPICITY; } void PrintSeqList(SeqList* pSeq) { int i = 0; for (; i < pSeq->size; ++i) { printf("%d", pSeq->array[i]); } printf("\n", pSeq->array[i]); } void CheckExpandCapicity(SeqList* pSeq) { if (pSeq->size == pSeq->capicity) { DataType* tmp = (DataType*)malloc(pSeq->capicity *2 *sizeof(DataType)); memcpy(tmp, pSeq->array, sizeof(DataType) * pSeq->size); free(pSeq->array); pSeq->array = tmp; pSeq->capicity = pSeq->capicity * 2; } } void DestorySeqList(SeqList* pSeq) { if (pSeq) { free(pSeq->array); pSeq->size = 0; pSeq->capicity = 0; } } void PushBack(SeqList* pSeq, DataType x) { assert(pSeq); CheckExpandCapicity(pSeq); pSeq->array[pSeq->size++] = x; } void PopBack(SeqList* pSeq) { assert(pSeq); if (pSeq->size == 0) { printf("SeqList Is Empty\n"); } --pSeq->size; } void PushFront(SeqList* pSeq, DataType x) { int i = pSeq->size; assert(pSeq); CheckExpandCapicity(pSeq); for (; i > 0; --i) { pSeq->array[i] = pSeq->array[i - 1]; } pSeq->array[0] = x; pSeq->size++; } void Modified (SeqList* pSeq, size_t index, DataType x ) { assert(pSeq); assert(index < pSeq->size); pSeq->array[index] = x; } void Swap(DataType* left, DataType* right) { DataType tmp = *left; *left = *right; *right = tmp; } void BubbleSort(SeqList* pSeq) { int count = 0; int exchange = 0; size_t index, end; assert(pSeq); for (end = pSeq->size -1; end >0; --end) { //交换标志进行优化 exchange = 0; for (index =0; index < end; ++index) { count++; if (pSeq->array[index] > pSeq->array[index +1]) { Swap(pSeq->array + index, pSeq->array + index +1); exchange = 1; } } if (exchange == 0) { break; } } printf("count:%d\n", count); } // 选择排序 void SelectSort(SeqList* pSeq) { size_t minIndex, index, begin; assert(pSeq); for (begin = 0; begin < pSeq->size - 1; ++begin) { minIndex = begin; for (index = begin +1; index < pSeq->size; ++index) { if (pSeq->array[minIndex] > pSeq->array[index]) { minIndex = index; } } if (minIndex != begin) { Swap(pSeq->array + minIndex, pSeq->array + begin); } } } FindRet BinarySearch(SeqList* pSep, DataType x) { size_t left, right, mid; FindRet ret; ret.isFind = FALSE; assert(pSep); left = 0; right = pSep->size - 1; // 注意这里使用<=, 否则可能存在死循环问题 while(left <= right) { // 注意越界问题 //mid = (left + right) / 2; mid = left + (right- left) / 2; if (pSep->array[mid] == x) { ret.isFind = TRUE; ret.index = mid; return ret; } else if (pSep->array[mid] > x) { right = mid - 1; } else { left = mid + 1; } } return ret; } #endif // __SEQ_LIST__ void Test1() { SeqList s; InitSeqList(&s); PushBack(&s, 1); PushBack(&s, 2); PushBack(&s, 3); PushBack(&s, 4); PushFront(&s, 0); PrintSeqList(&s); DestorySeqList(&s); } void Test2() { SeqList s; InitSeqList(&s); PushBack(&s, 6); PushBack(&s, 3); PushBack(&s, 5); PushBack(&s, 8); PushBack(&s, 4); PushBack(&s, 2); PushBack(&s, 1); PrintSeqList(&s); BubbleSort(&s); PrintSeqList(&s); BubbleSort(&s); PrintSeqList(&s); Swap(s.array + (s.size -1), s.array); PrintSeqList(&s); BubbleSort(&s); PrintSeqList(&s); DestorySeqList(&s); } void Test3() { DataType x; FindRet ret; SeqList s; InitSeqList(&s); PushBack(&s, 6); PushBack(&s, 3); PushBack(&s, 5); PushBack(&s, 8); PushBack(&s, 4); PushBack(&s, 2); PushBack(&s, 1); PrintSeqList(&s); SelectSort(&s); PrintSeqList(&s); x = 1; ret = BinarySearch(&s, x); if (ret.isFind ==TRUE) { printf("Binary Search%d Success: %d\n", x, ret.index); } x = 8; ret = BinarySearch(&s, x); if (ret.isFind ==TRUE) { printf("Binary Search%d Success: %d\n", x, ret.index); } x = 5; ret = BinarySearch(&s, x); if (ret.isFind ==TRUE) { printf("Binary Search%d Success: %d\n", x, ret.index); } x = 20; ret = BinarySearch(&s, x); if (ret.isFind ==FALSE) { printf("Binary Search%d Failed\n", x); } DestorySeqList(&s); }
0 0
- 静态顺序表
- 静态顺序表
- 静态顺序表
- 顺序表(静态)
- 静态顺序表
- 静态顺序表
- 静态顺序表
- 静态顺序表
- 简易静态顺序表
- 静态顺序表
- 静态顺序表
- 静态顺序表
- 静态顺序表
- 静态顺序表
- 顺序表(静态)
- 顺序表(静态)
- 静态,动态顺序表
- 静态顺序表
- jQuery.Deferred(func)总结
- STM32的串口烧录
- Zen Coding: 一种快速编写HTML/CSS代码的方法
- MySQL中用户名定义上的细节可能导致的错误
- 【Linux导论】Linux发行版本(Linux Distributions)
- 静态顺序表
- java匿名内部类总结
- 【IOS 开发学习总结-OC-8.2】★★ objective-c面向对象之——类和对象(下)
- MapReduce案例学习(6) 列出工资比公司平均工资要高的员工姓名及其工资
- 关于这学期的一个小小的项目
- linux常用命令(41):route 命令
- ubuntu下python2.7与python3.4共存及切换
- Delphi 完整的Bug决议工具EurekaLog的使用
- linux下查找包含关键字的文件