c语言实现静态顺序表 ------------第一次自己独立完成
2018-02-08 17:36
441 查看
Seqlist.h
这一次我不会在胜败未分的混沌中提早离席,希望一切都还来的及。-----------------------2018.2.8
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(size_t pos, DataType x, SeqList* s); void Erase(SeqList *s, size_t pos); void PrintSeqList(SeqList *s); 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);//选择排序1 void Swap(DataType * a, DataType*b); void SelectSortup(SeqList *s);//选择排序升级版 int BinarySearch(SeqList*s, DataType x);Seqlist.c
#include"Seqlist.h" void InitSeqList(SeqList *s)//初始化,不然里面数据全是随机值 { memset(s->array, 0, sizeof(DataType)*N); s->size = 0; } void PushBack(SeqList *s, DataType x) { //1.最先检查函数参数 assert(s); //2.先判断满没满 if (s->size == N) { printf("Seqlist is full"); return; } else { s->array[s->size] = x; s->size++; } } void PopBack(SeqList *s) {//1.检查参数 assert(s); //2.判断是否为空 if (s->size == 0) { printf("Seqlist is empty"); return; } s->array[s->size - 1] = 0; s->size--; } void PushFront(SeqList *s, DataType x) {//1.先判断参数 assert(s); //2.判断是否满了 if (s->size == N) { printf("Seqlist is full"); return; } for (int i = s->size-1 ; i>=0; i--) { s->array[i + 1] = s->array[i]; } s->array[0] = x; s->size++; } void PopFront(SeqList *s) {//1.检查参数 assert(s); //2.判断是否为空 if (s->size == 0) { printf("Seqlist is empty"); return; } for (int i = 1; i < s->size ; i++) { s->array[i - 1] = s->array[i]; } s->size--; } void PrintSeqList(SeqList *s)//可以不用传指针,因为不改变里面的值,但是最好传指针,如果传指针创建临时指针变量只是4字节,而如果不创建指针则是404字节 { assert(s); for (size_t i = 0; i < s->size; i++) { printf("%d ", s->array[i]); } printf("\n"); } //void Insert(size_t pos, DataType x, SeqList* s)//pos代表下标 //{ // //1.判断参数是否合法 // assert(s); // assert(pos <= s->size); // //2.判断满没满 // if (s->size == N) // { // printf("Seqlist is full"); // return; // } // for (size_t i = s->size-1; i > pos; i--) // { // s->array[i + 1] = s->array[i]; // } // s->array[pos] = x; // s->size++; //} void Insert(size_t pos, DataType x, SeqList* s)//pos代表下标 { //1.判断参数是否合法 assert(s); assert(pos <= s->size); //2.判断满没满 if (s->size == N) { printf("Seqlist is full"); return; } //错误 //for (size_t i = s->size - 1; i >= pos; i--)//注意此处越界访问 因为i为size_t类型,减到0,继续减又是一个很大的数。 //{ //有人就会说那就把size_t i改为int i 答案是还是错,因为pos还是size_t类型,pos与i相 // //比较又会把i进行整形提升为size_t类型。。。正确改法是把pos强转为int // s->array[i + 1] = s->array[i]; //} //正确1 /*for (int i = s->size - 1; i >= (int)pos; i--) { s->array[i + 1] = s->array[i]; }*/ //正确2 for (size_t i = s->size; i > pos; i--) { s->array[i] = s->array[i - 1]; } s->array[pos] = x; s->size++; } void Erase(SeqList *s, size_t pos) { //1.判断参数是否合法 assert(s); assert(pos < s->size); for (size_t i = pos; i < s->size-1; i++) { s->array[i] = s->array[i+1]; } s->size--; } int Find(SeqList *s, DataType x)//返回值int的含义 如果找到,返回找到元素的下标,如果没有找到返回-1 { //1.判断参数合法性 assert(s); for (int i = 0; i < s->size; i++) { if (s->array[i] == x) { return i; } } return -1; } void Modify(SeqList *s, size_t pos, DataType x) { //1.判断参数 assert(s); assert(pos < s->size); s->array[pos] = x; } int Remove(SeqList *s, DataType x) {//1.判断参数 assert(s); int pos = Find(s, x); if (pos != -1) { Erase(s,pos); return 0; } else { return -1; } } int RemoveAll(SeqList *s, DataType x)//用i找不等于x把不等于x的存下,等于x的不存 {//1.判断参数 assert(s); int i = 0; int j = 0; while (i < s->size) { if (s->array[i] != x) { s->array[j] = s->array[i]; i++; j++; } else if(s->array[i] == x) { i++; } } s->size = j; return (i == j) ? -1: 0; } void BubbleSort(SeqList *s) {//1.判断参数 assert(s); size_t end ; for (end = s->size; end > 0; end--)//交换多少趟 { size_t start = 0;//注意每趟结束把start置成0 int flag = 0; while (start + 1 < end)//一趟交换多少次。end控制冒到那个位置 { if (s->array[start] > s->array[start + 1]) { DataType tmp = s->array[start]; s->array[start] = s->array[start + 1]; s->array[start + 1] = tmp; flag = 1; } start++; } if (flag == 0) { break; } } } void Swap(DataType* a, DataType* b) { DataType tmp =*a; *a =*b; *b = tmp; } void SelectSort(SeqList *s) { for (size_t start = 0; start < s->size; start++) { size_t min = start; for (size_t i = start; i < s->size; i++)//选一个最小的数出来 { if (s->array[i] < s->array[min]) { min = i; } } Swap(s->array+min, s->array+start); } } void SelectSortop(SeqList *s) { size_t start = 0; size_t finish = s->size-1; for (; start <=finish; start++) { size_t max = start;//注意 :此处start不能放外面,因为start是每次都要更新的 size_t min = start; size_t i = start; for (; i <=finish;i++) { if (s->array[i]> s->array[max]) { max = i; } if (s->array[i] < s->array[min]) { min = i; } } Swap(s->array + min, s->array + start); if (start == max) { max = min; } Swap(s->array + max, s->array + finish); finish--; } } int BinarySearch(SeqList*s, DataType x) { int left = 0; int right = s->size - 1; while (left <= right) { int mid = (right - left) / 2 + left; if (s->array[mid] == x) return mid; if (s->array[mid] > x) { right = mid -1; } if (s->array[mid] <x) { left = mid+1; } } return -1; }test.c
#include"Seqlist.h" void test1() { SeqList s; InitSeqList(&s); PushBack(&s, 1); PushBack(&s, 2); PushBack(&s, 3); PushBack(&s, 4); PrintSeqList(&s); PopBack(&s); PopBack(&s); PrintSeqList(&s); } void test2() { SeqList s; InitSeqList(&s); PushFront(&s,1); PushFront(&s,2); PushFront(&s,3); PushFront(&s,4); PrintSeqList(&s); PopFront(&s); PopFront(&s); PrintSeqList(&s); Insert(2, 3, &s); PrintSeqList(&s); Insert(0, 0, &s); PrintSeqList(&s); } void test3() { SeqList s; InitSeqList(&s); PushBack(&s, 1); PushBack(&s, 2); PushBack(&s, 3); PushBack(&s, 4); PushBack(&s, 5); PrintSeqList(&s); Erase(&s, 0); PrintSeqList(&s); Erase(&s, 3); PrintSeqList(&s); } void test4() { SeqList s; InitSeqList(&s); PushBack(&s, 1); PushBack(&s, 2); PushBack(&s, 3); PushBack(&s, 4); PushBack(&s, 5); PrintSeqList(&s); int ret=Find(&s, 1); printf("ret=%d\n", ret); ret = Find(&s, 7); printf("ret=%d\n", ret); Modify(&s, 0, 9); PrintSeqList(&s); } void test5() { SeqList s; InitSeqList(&s); PushBack(&s, 1); PushBack(&s, 2); PushBack(&s, 3); PushBack(&s, 4); PushBack(&s, 5); Remove(&s, 4); PrintSeqList(&s); } void test6() { SeqList s; InitSeqList(&s); PushBack(&s, 4); PushBack(&s, 2); PushBack(&s, 4); PushBack(&s, 4); PushBack(&s, 5); PushBack(&s, 4); RemoveAll(&s,4); PrintSeqList(&s); } void test7() { SeqList s; InitSeqList(&s); PushBack(&s, 4); PushBack(&s, 2); PushBack(&s, 1); PushBack(&s, 8); PushBack(&s, 5); PushBack(&s, 4); BubbleSort(&s); PrintSeqList(&s); } void test8() { SeqList s; InitSeqList(&s); PushBack(&s, 4); PushBack(&s, 2); PushBack(&s, 1); PushBack(&s, 8); PushBack(&s, 5); PushBack(&s, 4); SelectSortop(&s); PrintSeqList(&s); } void test9() { SeqList s; InitSeqList(&s); PushBack(&s, 1); PushBack(&s, 2); PushBack(&s, 5); PushBack(&s, 8); PushBack(&s, 9); PushBack(&s,10); int ret = 0; /*ret = BinarySearch(&s, 5); printf("%d\n", ret);*/ ret = BinarySearch(&s, 8); printf("%d\n", ret); } int main() { test9(); system("pause"); return 0; }
这一次我不会在胜败未分的混沌中提早离席,希望一切都还来的及。-----------------------2018.2.8
相关文章推荐
- !-- 基于静态数组的顺序表相关操作C语言实现 --!
- 顺序表的静态存储c语言实现
- c语言实现静态顺序表
- c语言静态顺序表的相关功能实现
- C语言实现静态顺序表的功能(增,删,查,改,以及排序)
- 静态顺序表(C语言实现)
- 大家都说是水题。。好吧,那我就从水题开始做。。自己独立的做。正好最近在辅导大二的数据结构,自己也加强下对栈的理解和应用。 第一次那么完全的独立完成OJ的题,激动呐!读题目理解就废了我好多的时间,虽说英语过了
- 静态顺序表(C语言实现)
- C语言 顺序表的实现(静态)
- c语言实现静态顺序表
- 顺序表的静态存储(C语言实现)
- 【C语言】静态顺序表的实现(包括头插、头删、尾插、尾删、查找、删除指定位置)
- C语言实现顺序表--静态
- C语言 顺序表的实现 (静态)
- 静态顺序表的实现(C语言)
- 【数据结构】C语言实现顺序表(静态顺序表)
- 静态和动态顺序表的实现(c语言)
- C语言实现静态顺序表的实例详解
- 静态顺序表-c语言实现
- 静态顺序表------C语言实现