StaticSeqlist.h文件
#define _CRT_SECURE_NO_WARNINGS 1#ifndef _STATICSEQLIST_H__#define _STATICSEQLIST_H__#include<stddef.h>#include<assert.h>#include<string.h>#define MAXSIZE 10typedef int DataType;//#define DataType inttypedef struct Seqlist{ DataType array[MAXSIZE]; size_t size; //有效元素的个数}Seqlist,*PSeqlist;void IniSeqlist(PSeqlist seq);void PushBack(PSeqlist seq,DataType data);void PRintSeqlist(PSeqlist seq);void PopBack(PSeqlist seq);void PushFront(PSeqlist seq,DataType data);void PopFront(PSeqlist seq);void Insert(PSeqlist seq,DataType pos,DataType data);void Erase(PSeqlist seq,size_t pos);void Remove(PSeqlist seq,DataType data);void RemoveAll(PSeqlist seq,DataType data);void Bubblesort(PSeqlist seq);void Secletsort(PSeqlist seq);void Secletsort_OP(PSeqlist seq);int BinarySearch(PSeqlist seq,DataType data);int Size(PSeqlist seq);int Empty(PSeqlist seq);#endif //_STATICSEQLIST_H__StaticSeqlist.c文件#include"StaticSeqList.h"void IniSeqlist(PSeqlist seq) //初始化静态顺序表{ assert(seq); seq->size = 0; memset(seq->array, 0 ,sizeof(seq->array));}void PushBack(PSeqlist seq,DataType data) //静态顺序表数据后插{ assert(seq); if(seq->size == MAXSIZE) { return; } seq->array[seq->size++] = data;}void PopBack(PSeqlist seq) //静态顺序表数据后删{ assert(seq); if(seq->size == 0) { return; } seq->size--;}void PushFront(PSeqlist seq,DataType data) //静态顺序表数据前插{ DataType idx = 0; assert(seq); if(seq->size == MAXSIZE) { return; } for(idx=seq->size-1; idx>=0;--idx) { seq->array[idx+1] = seq->array[idx]; } seq->array[0] = data; seq->size ++;}void PopFront(PSeqlist seq) //静态顺序表数据前删{ int idx = 1; assert(seq); if(seq->size == 0) { return; } for(; idx<seq->size; ++idx) { seq->array[idx-1] = seq->array[idx]; } seq->size--;}void Insert(PSeqlist seq,size_t pos,DataType data) //静态顺序表数据任意位置插入数据{ int idx = 0; assert(seq); if(pos > seq->size) { return; } for(idx=seq->size-1; idx>=pos; --idx) { seq->array[idx+1] = seq->array[idx]; } seq->array[pos] = data; seq->size++;}void Erase(PSeqlist seq,size_t pos) //静态顺序表数据任意位置删除数据{ int idx = pos; assert(seq); if(pos>seq->size) { return; } for(; idx<seq->size-1; ++idx) { seq->array[idx] = seq->array[idx+1]; } seq->size--;}int Find(PSeqlist seq,DataType data) //查找静态顺序表data元素 返回下标{ int idx = 0; assert(seq); for(; idx<seq->size; ++idx) { if(seq->array[idx] == data) { return idx; } } return -1;}void Remove(PSeqlist seq,DataType data) //删除静态顺序表中值为data的元素{ int ret = 0; int idx = 0; assert(seq); if(seq->size == 0) { return; } if(-1 != (ret = Find(seq,data))) { Erase(seq,ret); }}void RemoveAll(PSeqlist seq,DataType data) //缺点 Find每次查找都要从第一个位置开始{ int pos = 0; assert(seq); while(-1!=(pos = Find(seq,data))) { Erase(seq,pos); }}void RemoveAll(PSeqlist seq,DataType data) //自己实现的删除所有data元素{ int idx = 0; int count = 0; assert(seq); if(seq->size == 0) { return; } for(; idx<seq->size; ++idx) { if(seq->array[idx] == data) { count++; Erase(seq,idx); } }}void RemoveAll(PSeqlist seq,DataType data) //(老师)上课所讲的方法删除所有data元素{ int count = 0; int idx= 0; assert(seq); for(; idx<seq->size; ++idx) { if(seq->array[idx] == data) { count++; } else { seq->array[idx-count] = seq->array[idx]; } } seq->size -= count;}void PrintSeqlist(PSeqlist seq) //打印顺序表{ int idx = 0; assert(seq); for(; idx<seq->size; ++idx) { printf("%d ",seq->array[idx]); } printf("/n");}void Bubblesort(PSeqlist seq) //冒泡排序{ DataType i = 0; DataType j = 0; DataType flag = 0; assert(seq); for(i=0; i<seq->size-1; ++i) { flag = 0; for(j=0; j<seq->size-i-1; ++j) { if(seq->array[j]>seq->array[j+1]) { DataType tmp = seq->array[j]; seq->array[j] = seq->array[j+1]; seq->array[j+1] = tmp; flag = 1; } } if(flag == 0) { break; //防止当已排序成功但循环没有结束 } }}void Secletsort(PSeqlist seq) //选择排序法{ DataType i = 0; DataType j = 0; DataType pos = 0; DataType tmp = 0; assert(seq); for(i=0; i<seq->size-1; ++i) { pos = 0; for(j=1; j<seq->size-i; ++j) { if(seq->array[pos]<seq->array[j]) { pos = j; } } if(pos != seq->size-i) { tmp = seq->array[pos]; seq->array[pos] = seq->array[seq->size-i-1]; seq->array[seq->size-i-1] = tmp; } }}void Secletsort_OP(PSeqlist seq) //优化后的选择排序法{ DataType j = 0; DataType begin = 0; DataType end = 0; DataType maxPos = 0; DataType minPos = 0; DataType tmp = 0; assert(seq); end = seq->size-1; while(begin<end) { maxPos = begin; minPos = begin; for(j=begin+1; j<=end; ++j) { if(seq->array[maxPos]<seq->array[j]) { maxPos = j; } if(seq->array[minPos]>seq->array[j]) { minPos = j; } } if(end != maxPos) { tmp = seq->array[maxPos]; seq->array[maxPos] = seq->array[end]; seq->array[end] = tmp; } if(begin != minPos) { tmp = seq->array[minPos]; seq->array[minPos] = seq->array[begin]; seq->array[begin] = tmp; } end--; begin++; }}int BinarySearch(PSeqlist seq,DataType data) //二分查找{ DataType left = 0; DataType right = 0; DataType mid = 0; assert(seq); right = seq->size; while(left<right) { mid = left-((left-right)>>1); if(seq->array[mid]>data) { right = mid; } else if(seq->array[mid]<data) { left = mid+1; } else { return mid; } } return -1;}int Size(PSeqlist seq){ assert(seq); return seq->size;}int Empty(PSeqlist seq){ assert(seq); if(seq->size == 0) { return -1; } return 0;}test.c文件#include"StaticSeqList.h"void Funtest(){ DataType ret = 0; Seqlist seq; IniSeqlist(&seq); PushBack(&seq,0); PushBack(&seq,1); PushBack(&seq,2); PushBack(&seq,3); PushBack(&seq,4); PushBack(&seq,5); PushBack(&seq,6); PrintSeqlist(&seq); PopBack(&seq); PrintSeqlist(&seq); PushFront(&seq,0); PrintSeqlist(&seq); PopFront(&seq); PrintSeqlist(&seq); Insert(&seq,3,8); PrintSeqlist(&seq); Erase(&seq,3); PrintSeqlist(&seq); Remove(&seq,3); PrintSeqlist(&seq); RemoveAll(&seq,2); Bubblesort(&seq); Secletsort(&seq); Secletsort_OP(&seq); ret = BinarySearch(&seq,2); PrintSeqlist(&seq); ret = Size(&seq); printf("%d/n",ret); }int main(){ Funtest(); system("pause"); return 0;}
新闻热点
疑难解答