顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。
1.顺序表的结构体声明
#define MAX_SIZE 5 //定义数组的大小 typedef int DataType; typedef struct SeqList { DataType array[MAX_SIZE]; size_t size; }SeqList;
2.顺序表的初始化
void InitSeqList(SeqList* pSeq) //址传递要用到指针 { assert(pSeq); memset(pSeq->array, 0, sizeof(DataType)*MAX_SIZE); //初始化数组 pSeq->size = 0; }
3.顺序表 尾插、尾删、打印
//1.检查参数 //2.边界条件的检查 //3.完成功能函数 //尾插 void PushBack(SeqList* pSeq, DataType x) { assert(pSeq); //检查参数 if (pSeq->size >= MAX_SIZE) //边界条件检查 { printf("SeqList is Full !"); printf("\n"); return; } pSeq->array[pSeq->size++] = x; } //尾删 void PopBack(SeqList* pSeq) { assert(pSeq); //检查参数 if (pSeq->size <=0) //边界条件检查 { printf("SeqList is empty !"); printf("\n"); return; } //pSeq->array[--pSeq->size] = 0; --pSeq->size; } //打印 void PrintSeqList(SeqList* pSeq) { assert(pSeq); //检查参数 int i = 0; for (; i < pSeq->size; i++) { printf("%d ", pSeq->array[i]); } printf("\n"); }
4.头插
void PushFront(SeqList* pSeq, DataType x) { assert(pSeq); //检查参数 int begin = pSeq->size - 1; if (pSeq->size >= MAX_SIZE) //边界条件检查 { printf("SeqList is Full !"); printf("\n"); return; } //把已经存好的数据依次向后挪动一位后,在顺序表的首位置插入x for (; begin >= 0; --begin) { pSeq->array[begin + 1] = pSeq->array[begin]; } pSeq->array[0] = x; ++pSeq->size; }
5.头删
void PopFront(SeqList* pSeq) { assert(pSeq); //检查参数 int begin = 0; if (pSeq->size <= 0) //检查边界条件,顺序表可能为空 { printf("SeqList is empty !\n"); } //把顺序表的数据依次向前挪一位 for (; begin <pSeq->size-1; begin++) { pSeq->array[begin] = pSeq->array[begin + 1]; } --pSeq->size; }
6.固定位置插入数据和删除数据
//固定位置插入数据 void Insert(SeqList* pSeq, size_t pos, DataType x) { assert(pSeq); //检查参数 assert(pos<=pSeq->size); //检查位置的有效性 int begin = pSeq->size - 1; if (pSeq->size >= MAX_SIZE) //检查边界条件,如果顺序表已满则无法插入 { printf("SeqList is Full !"); printf("\n"); return; } //把从pos开始后面的数据依次向后挪,再在pos位置处添加数据x for (; begin >=(int) pos; begin--) //begin和pos的数据类型要相同再比较 { pSeq->array[begin+1] = pSeq->array[begin]; } pSeq->array[pos] = x; ++pSeq->size; //添加数据后size自增一 } //固定位置删除数据 void Erase(SeqList* pSeq, size_t pos) { assert(pSeq); //检查参数的有效性 assert(pos < pSeq->size); //检查位置的有效性 int begin = pos; if (pSeq->size <= 0) //检查边界条件 { printf("SeqList is empty !"); printf("\n"); return; } //把pos后的数据依次向前挪一位 for (; begin <= pSeq->size - 1; begin++) { pSeq->array[begin] = pSeq->array[begin + 1]; } --pSeq->size; }
7.查找数据、找到数据并删除它
//查找 int Find(SeqList* pSeq, size_t pos, DataType x) { assert(pSeq); //检查参数 int i= pos; for (;i < pSeq->size; i++) { if (pSeq->array[i] == x) return i; } return -1; } //查找并删除 int Remove(SeqList* pSeq, DataType x) { assert(pSeq); //检查参数 int pos = Find(pSeq, 0,x); //先找到x并返回它的位置,如果找到就删了它 if (pos != -1) { Erase(pSeq, pos); } return pos; }
8.删除顺序表中所有相同的x
//删除所有x void RemoveAll(SeqList* pSeq, DataType x) { //从第一个数开始找,找到就删除,删了后再从下一个位置接着找 assert(pSeq); //检查参数 int pos = Find(pSeq, 0, x); while (pos !=-1) { Erase(pSeq, pos); pos = Find(pSeq,pos, x); } } //优化(遍历一遍就把所有的x删除,并把后面的数据向前挪动相应个的位置) void removeall(SeqList* pSeq, DataType x) { assert(pSeq); int i = 0; int count = 0; for (; i < pSeq->size; i++) { if (pSeq->array[i] == x) { count++; } else { pSeq->array[i-count] = pSeq->array[i]; } } pSeq->size -= count; //删完挪完后size要删多少就减多少 }
9.顺序表的二分查找
int BinarySearch(SeqList* pSeq, DataType x) { assert(pSeq); int left = 0; //int right = pSeq->size - 1; // [ ] 注意边界 int right = pSeq->size; // [ ) //while (left <= right) while (left<right) { int mid = left - (left - right) / 2; //防止溢出 if (pSeq->array[mid] == x) { return mid; } else if (pSeq->array[mid]>x) { right = mid - 1; //right = mid; } else if (pSeq->array[mid]<x) { left = mid + 1; } } return -1; }
10.冒泡排序
void BubbleSort(SeqList* pSeq) { assert(pSeq); //检查参数 int i, j; int ret = 0; for (i = 0; i < pSeq->size - 1; i++) { int exchange=0; for (j = 0; j < pSeq->size - i - 1; j++) { if (pSeq->array[j]> pSeq->array[j + 1]) { ret = pSeq->array[j]; pSeq->array[j] = pSeq->array[j + 1]; pSeq->array[j + 1] = ret; exchange=1; } } if(exchange==0) //如果没有发生交换,说明次序已经排好 { return ; } } }
11.选择排序
//一次选出最大最小的数据分别放在序列的两端 void Swap(DataType* left,DataType*right) { DataType tmp = *left; *left = *right; *right = tmp; } void SeclectSort(SeqList* pSeq) { assert(pSeq); int left = 0; int right = pSeq->size - 1; int ret ,min,max; while (left<right) { min = left; max = right; for (int i = left; i<right; ++i) { if (pSeq->array[min]>pSeq->array[i]) { Swap(&pSeq->array[min], &pSeq->array[i]); } if (pSeq->array[max]<pSeq->array[i]) { Swap(&pSeq->array[max], &pSeq->array[i]); } } ++left; --right; } }
简单的测试与主函数
void Test() { SeqList seq; InitSeqList(&seq); PushBack(&seq, 1); PushBack(&seq, 4); PushBack(&seq, 5); PushBack(&seq, 2); PushBack(&seq, 3); PrintSeqList(&seq); SeclectSort(&seq); PrintSeqList(&seq); } int main() { Test(); system("pause"); return 0; }