动态顺序表的实现,插入删除查找修改...

来源:互联网 发布:广州知不足幼儿园官网 编辑:程序博客网 时间:2024/05/19 13:28

每天进步一点点!


以下为纯代码,在vs2012下测试通过:


//打印线性表void PrintSeqList(SeqList* pSeq){int i = 0;assert(pSeq);for(; i<pSeq->size; i++){//格式控制,每行打印10个if(0 == i%10){printf("\n");}printf("%-4d", pSeq->data[i]);}printf("\n\n");}//初始化线性表void InitSeqList(SeqList* pSeq){assert(pSeq);//申请内存pSeq->data = (DataType*)malloc(sizeof(DataType)*CAPACITY);if(NULL == pSeq->data){perror("malloc");exit(1);}//初始化容量和有效数据个数pSeq->size = 0;pSeq->cap = CAPACITY;}//自增int IncSeqList(SeqList* pSeq){DataType* new_data = NULL;assert(pSeq);//申请新内存new_data = (DataType*)realloc(pSeq->data, (pSeq->cap+INCREASMENT)*sizeof(DataType));if(NULL == new_data){perror("realloc");exit(2);}pSeq->data = new_data;pSeq->cap += INCREASMENT;//printf("Inc success!\n");//自增成功return 1;}//摧毁void DestroySeqList(SeqList* pSeq){assert(pSeq);free(pSeq->data);}//判满//满:1//未满:0int IsFull(SeqList* pSeq){assert(pSeq);if(pSeq->size >= pSeq->cap){return 1;}return 0;}//判空//空:1//不空:0int IsEmpty(SeqList* pSeq){assert(pSeq);if(0 == pSeq->size){return 1;}return 0;}//求当前有效元素个数int SizeSeqList(SeqList* pSeq){assert(pSeq);return pSeq->size;}//求容量int CapSeqList(SeqList* pSeq){assert(pSeq);return pSeq->cap;}//尾插void PushBack(SeqList* pSeq, DataType _data){assert(pSeq);//如果未满则直接插入,如果已满则自增后再插入if(0 == IsFull(pSeq) || IncSeqList(pSeq)){pSeq->data[pSeq->size] = _data;pSeq->size++;}}//删除最后一个元素void PopBack(SeqList* pSeq){assert(pSeq);if(!IsEmpty(pSeq)){pSeq->size--;}}//头插一个元素void PushFront(SeqList* pSeq, DataType data){int i = pSeq->size;assert(pSeq);//未满或自增成功才头插入if(!IsFull(pSeq) || IncSeqList(pSeq)){//将所有元素后移一位for(; i>0; i--){pSeq->data[i] = pSeq->data[i-1];}pSeq->data[0] = data;pSeq->size++;}}// 删除顺序表头部元素void PopFront(SeqList* pSeq){int i = 0;assert(pSeq);//不空才删除if(!IsEmpty(pSeq)){//将所有元素前移一个位置for(; i<pSeq->size-1; i++){pSeq->data[i] = pSeq->data[i+1];}pSeq->size--;}}//在pos位置上插入值为data的元素void Insert(SeqList* pSeq, size_t pos, DataType data){int i = 0;assert(pSeq);//插入位置需合法且表需未满,若满则自增if((pos>0 && pos<=pSeq->size+1) && (!IsFull(pSeq) || IncSeqList(pSeq))){for(i = pSeq->size; i>=pos; i--){pSeq->data[i] = pSeq->data[i-1];}pSeq->data[pos-1] = data;pSeq->size++;}}// 删除顺序表中pos位置上的元素void Erase(SeqList* pSeq, size_t pos){int i = 0;assert(pSeq);//不空且位置合法才删除if( !IsEmpty(pSeq) && pos>0 && pos<=pSeq->size){for(i = pos-1; i<pSeq->size-1; i++){pSeq->data[i] = pSeq->data[i+1];}pSeq->size--;}}// 在顺序表中查找值为data的元素,找到返回该元素的位置,否则返回-1int Find(SeqList* pSeq, DataType data){int i = 0;assert(pSeq);for(; i<pSeq->size; i++){if(data == pSeq->data[i]){return i+1;}}return -1;}// 删除顺序表中第一个值为data的元素void Remove(SeqList* pSeq, DataType data){size_t pos = Find(pSeq, data);assert(pSeq);if(!IsEmpty(pSeq)){if(-1 != pos){Erase(pSeq, pos);}}}// 删除顺序表中所有值为data的元素void RemoveAll(SeqList* pSeq, DataType data){//size_t pos = pSeq->size;size_t i = 0;assert(pSeq);/*while(-1 != Find(pSeq, data)){Remove(pSeq, data);}*/while(i < pSeq->size){if(data == pSeq->data[i]){Erase(pSeq, i+1);}i++;}}//交换static void swap(DataType* x, DataType* y ){*x ^= *y;*y ^= *x;*x ^= *y;}// 使用冒泡排序给顺序表中的元素排序void BubbleSort(SeqList* pSeq){int i = 0, j = 0, pos = 0;assert(pSeq);for(i = 0; i<pSeq->size-1; i++){for(j = 0; j<pSeq->size-i-1; j++){if(pSeq->data[j] > pSeq->data[j+1]){pos = 1;swap(&pSeq->data[j], &pSeq->data[j+1]);}}if(0 == pos){break;}}}// 使用选择排序给顺序表中的元素排序//即:找最小(大)值与第一个值交换,再找次小(大)值与第二个交换,依此类推。void SelectSort(SeqList* pSeq){int i = 0, j = 0, pos = 0;assert(pSeq);for(i = 0; i<pSeq->size-1; i++){pos = i;//记录最小(大)值下标for(j = i+1; j<pSeq->size; j++){if(pSeq->data[j] < pSeq->data[pos]){pos = j;}}if(pos != i){swap(&pSeq->data[pos], &pSeq->data[i]);}}}// 使用二分查找在顺序表中查找值为data的元素,找到返回位置,否则返回-1int BinarySearch(SeqList* pSeq, DataType data){int left = 0, right = pSeq->size-1, mid = 0;assert(pSeq);while(left<=right){mid = (left&right)+((left^right)>>1);if(data < pSeq->data[mid]){right = mid-1;//调整范围}else if(data > pSeq->data[mid]){left = mid+1;//调整范围}else{return mid+1;//返回值为元素位置}}return -1;}


成于坚持,败于止步!

0 0
原创粉丝点击