您的位置:首页 > 其它

静态顺序表的实现(增删查改排序)

2017-09-17 23:12 417 查看
[align=center]
顺序表的各种操作实现
[/align]
#define _CRT_SECURE_NO_WARNINGS 1#include <assert.h>#include <stdio.h>#include <stdlib.h>#include <string.h>typedef int DataType;#define N 100//结构体定义typedef struct SeqList{DataType array; // 数组size_t size;       // 有效数据的个数}SeqList;void InitSeqList(SeqList* s);void PushBack(SeqList* s, DataType x);void PopBack(SeqList* s);void PushFront(SeqList* s, DataType x);void PopFront(SeqList* s);void Insert(SeqList* s, size_t pos, DataType x);void Erase(SeqList* s, size_t pos);int Find(SeqList* s, DataType x);void Modify(SeqList* s, size_t pos, DataType x);int Remove(SeqList* s, DataType x);int RemoveAll(SeqList* s, DataType x);void BubbleSort(SeqList* s);void SelectSort(SeqList* s);void SelectSort_OP(SeqList* s);int BinarySearch(SeqList* s, DataType x);//初始化void InitSeqList(SeqList* s){memset(s->array, 0, sizeof(DataType)*N);s->size = 0;}//打印顺序表void PrintSeqlist(SeqList *s){for (size_t i = 0; i < s->size; ++i){printf("%d", s->array[i]);}printf("\n");}//尾插void PushBack(SeqList* s, DataType x){assert(s);if (s->size == N){printf("array is full");return;}s->array[s->size] = x;s->size++;}//尾删void PopBack(SeqList* s){int start = 0;if (s->size == 0){printf("SeqList is kong");return;}s->array[s->size-1] = 0;s->size--;}//头插void PushFront(SeqList* s, DataType x){assert(s);if (s->size == 0){printf("SeqList is kong");}for (int end = s->size-1; end >= 0; --end){s->array[end + 1] = s->array[end];}s->array[0] = x;s->size++;}//头删void PopFront(SeqList* s){assert(s);if (s->size = ""){printf("SeqLsit is kong");}for (int start = 0; start < s->size; ++start){s->array[start] = s->array[start + 1];}s->size--;}//指定位置插入void Insert(SeqList* s, size_t pos, DataType x){assert(s);if (s->size == N){printf("arrar is full");}for (size_t end = s->size; end >= pos; --end){s->array[end + 1] = s->array[end];}s->array[pos] = x;s->size++;}//指定位置删除void Erase(SeqList* s, size_t pos){assert(s);if (s->size == 0){printf("array is kong");}for (int mid = pos; mid < s->size; ++mid){s->array[mid] = s->array[mid + 1];}s->size--;}//查找数据int Find(SeqList* s, DataType x){assert(s);if (s->size == 0){printf("array is kong");}for (int start = 0; start < s->size; ++start){if (s->array[start] == x){return start;}}return 0;}//修改指定位置void Modify(SeqList* s, size_t pos, DataType x){assert(s);if (s->size == 0){printf("array is kong");}s->array[pos] = x;}//删除int Remove(SeqList* s, DataType x){assert(s);if (s->size == 0){printf("array is kong");}int rel = Find(s, x);if (rel != 0){Erase(s, rel);return 0;}else{return -1;}/*if (rel == 0){return 0;}if (rel != 0){for (int pos = rel; pos < s->size; ++pos){s->array[pos] = s->array[pos + 1];}return 1;}s->size--;*/}//删除所有数据int RemoveAll(SeqList* s, DataType x){int ret;assert(s);ret = Remove(s, x);while (ret == 0 && Rem4000ove(s, x) == 0){;}return ret;}void Swap(DataType* left, DataType* right){DataType temp = *left;*left = *right;*right = temp;}//顺序表冒泡排序void BubbleSort(SeqList* s){int start = 0;int end = 0;assert(s);for (end = s->size; end > 0; --end){int i = 0;while (start+1 < end ){Swap(s->array + start, s->array + start + 1);i = 1;}++start;}}//顺序表选择排序void SelectSort(SeqList* s){size_t start = 0;assert(s);for (; start < s->size; ++start){size_t i = start;size_t min = start;for (; i < s->size; ++i){if (s->array[min]>s->array[i]){min = i;}}Swap(s->array + start, s->array + min);}}//选择排序从头从尾向中间走void SelectSort_OP(SeqList* s){size_t start = 0;size_t finish = s->size - 1;assert(s);while (start < finish){size_t i = start;size_t min = start;size_t max = start;while (i <= finish){if (s->array[i] < s->array[min]){min = i;}if (s->array[i]>s->array[max]){max = i;++i;}Swap(s->array + start, s->array + min);if (start == max){max = min;}Swap(s->array + finish, s->array + max);start++;finish--;}}}//二分查找int BinarySearch(SeqList* s, DataType x){//size_t pos = (s -> size) / 2;int left = 0;int right = s->size;assert(s);if (s->size == 0){printf("array is kong");}while (left <= right){size_t pos = (left + right) / 2;if (x == s->array[pos]){return pos;}else if (x < s->array[pos]){right = pos - 1;}else if (x>s->array[pos]){left = pos + 1;}}return 0;}void TestSeqlist(){SeqList s;InitSeqList(&s);PushBack(&s, 1);PushBack(&s, 2);PushBack(&s, 3);PushBack(&s, 4);PushBack(&s, 5);PushBack(&s, 6);PrintSeqlist(&s);int pos = BinarySearch(&s, 2);//Remove(&s, 3);//int pos = Find(&s, 2);printf("%d\n", pos);//PushFront(&s, 0);//Insert(&s, 2, 9);//PrintSeqlist(&s);}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: