动态链表增删改查及排序功能
主要功能的实现:
#include "SeqList.h" void InitSeqList(SeqList * pSeq)//初始化 { assert(pSeq); pSeq->array = (DataType*)malloc(sizeof(DataType)*DEFAULT_CAPICITY); pSeq->size = 0; pSeq->capicity = DEFAULT_CAPICITY; } void PrintSeqList(SeqList* pSeq)//打印 { assert(pSeq); size_t i = 0; for (; i < pSeq->size; i++) { printf("%d", pSeq->array[i]); } printf("\n"); } void CheckExpandCapicity(SeqList* pSeq)//检查容量 { assert(pSeq); if (pSeq->size == pSeq->capicity) { DataType *tmp = (DataType *)malloc(pSeq->capicity * 2 * sizeof(DataType)); memcpy(tmp, pSeq->array, sizeof(DataType)*pSeq->size); free(pSeq->array); pSeq->array = tmp; pSeq->capicity = pSeq->capicity * 2; } } void PushFront(SeqList* pSeq, DataType x)//头插 { int i = 0; assert(pSeq); CheckExpandCapicity(pSeq); for (i = pSeq->size; i >= 1; i--) { pSeq->array[i] = pSeq->array[i - 1]; } pSeq->array[0] = x; pSeq->size++; } void PopFront(SeqList* pSeq)//头删 { size_t i = 0; assert(pSeq); for (; i < pSeq->size - 1; i++) { pSeq->array[i] = pSeq->array[i + 1]; } pSeq->size--; } void PushBack(SeqList* pSeq, DataType x)//尾插 { assert(pSeq); CheckExpandCapicity(pSeq); pSeq->array[pSeq->size] = x; pSeq->size++; } void PopBack(SeqList* pSeq)//尾删 { assert(pSeq); pSeq->size--; } void Insert(SeqList* pSeq, size_t index, DataType x)//在index位置插入 { size_t i = pSeq->size; assert(pSeq); assert(index < pSeq->size); CheckExpandCapicity(pSeq); for (; i >index; i--) { pSeq->array[i] = pSeq->array[i - 1]; } pSeq->array[index] = x; pSeq->size++; } void Modify(SeqList* pSeq, size_t index, DataType x)//改动 { assert(pSeq); assert(index < pSeq->size); pSeq->array[index] = x; } void Remove(SeqList* pSeq, size_t index)//删除index位置的数 { size_t i = index; assert(pSeq); assert(index < pSeq->size); for (; i < pSeq->size - 1; i++) { pSeq->array[i] = pSeq->array[i + 1]; } pSeq->size--; } void Swap(DataType* left, DataType* right) { DataType tmp = *left; *left = *right; *right = tmp; } void BubbleSort(SeqList* pSeq)//冒泡排序 { size_t index, end; int exchange = 0; assert(pSeq); for (end = pSeq->size - 1; end > 0; --end) { exchange = 0; for (index = 0; index < end; index++) { if (pSeq->array[index]>pSeq->array[index + 1]) { Swap(pSeq->array + index, pSeq->array + index + 1); exchange = 1; } } if (exchange == 0) { break; } } } void SelectSort(SeqList* pSeq)//选择排序 { size_t MinIndex, index, begin; assert(pSeq); for (begin = 0; begin < pSeq->size - 1; begin++) { MinIndex = begin; for (index = begin + 1; index < pSeq->size; index++) { if (pSeq->array[MinIndex]>pSeq->array[index]) { MinIndex = index; } } if (MinIndex != begin) { Swap(pSeq->array + MinIndex, pSeq->array + begin); } } } FindRet BinarySearch(SeqList* pSeq, DataType x)//二分查找 { size_t left=0; size_t right = pSeq->size - 1;; size_t middle; FindRet ret; ret.isFind = FALSE; assert(pSeq); while (left<=right) { middle = (left + right) / 2; if (x == pSeq->array[middle]) { ret.isFind = TRUE; ret.index = middle; return ret; } else if (x>pSeq->array[middle]) left = middle + 1; else right = middle - 1; } return ret; }
头文件:
#pragma once #define DEFAULT_CAPICITY 3 typedef int DataType; #include<stdio.h> #include<string.h> #include<assert.h> #include<malloc.h> typedef struct SeqList { DataType *array; size_t size; size_t capicity;//当前的容量 }SeqList; typedef enum Tag { TRUE, // 真 FALSE, // 假 }Tag; typedef struct FindRet { Tag isFind; // 是否找到的标示 size_t index; // 找到数据的下标 }FindRet; void InitSeqList(SeqList *pSeq); void PrintSeqList(SeqList *pSeq); void CheckExpandCapicity(SeqList* pSeq); void PushFront(SeqList *pSeq, DataType x); void PopFront(SeqList *pSeq); void PushBack(SeqList *pSeq, DataType x); void PopBack(SeqList *pSeq); void Insert(SeqList *pSeq, size_t index, DataType x); void Modify(SeqList *pSeq, size_t index, DataType x); void Remove(SeqList *pSeq, size_t index); void Swap(DataType* left, DataType* right); void BubbleSort(SeqList* pSeq); void SelectSort(SeqList* pSeq); FindRet BinarySearch(SeqList* pSep, DataType x);
測试程序部分:
#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); PrintSeqList(&s); } void test2()//測试头插、头删 { SeqList s; InitSeqList(&s); PushFront(&s, 3); PushFront(&s, 4); PushFront(&s, 5); PushFront(&s, 6); PrintSeqList(&s); PopFront(&s); PrintSeqList(&s); } void test3()//測试在index位置插入、改动index位置的值、删除index位置的值 { SeqList s; InitSeqList(&s); PushBack(&s, 1); PushBack(&s, 2); PushBack(&s, 3); PushBack(&s, 4); PrintSeqList(&s); Insert(&s, 2, 8); PrintSeqList(&s); Modify(&s,2,5); PrintSeqList(&s); Remove(&s, 2); PrintSeqList(&s); } void test4()//測试冒泡排序 { SeqList s; InitSeqList(&s); PushBack(&s, 3); PushBack(&s, 1); PushBack(&s, 5); PushBack(&s, 4); PushBack(&s, 2); PrintSeqList(&s); BubbleSort(&s); PrintSeqList(&s); } void test5()//測试选择排序 { SeqList s; InitSeqList(&s); PushBack(&s, 3); PushBack(&s, 1); PushBack(&s, 5); PushBack(&s, 4); PushBack(&s, 2); PrintSeqList(&s); SelectSort(&s); PrintSeqList(&s); } void test6()//測试二分搜索 { DataType x; FindRet ret; SeqList s; InitSeqList(&s); PushBack(&s, 1); PushBack(&s, 2); PushBack(&s, 3); PushBack(&s, 4); PushBack(&s, 5); x = 4; ret = BinarySearch(&s, x); if (ret.isFind == TRUE) { printf("%d %d\n",x,ret.index); } else printf("find failed!\n"); x = 8; ret = BinarySearch(&s, x); if (ret.isFind == TRUE) { printf("%d %d", x, ret.index); } else printf("find failed!\n"); x = 1; ret = BinarySearch(&s, x); if (ret.isFind == TRUE) { printf("%d %d\n", x, ret.index); } else printf("find failed!\n"); x = 5; ret = BinarySearch(&s, x); if (ret.isFind == TRUE) { printf("%d %d\n", x, ret.index); } else printf("find failed!\n"); } int main() { test1(); test2(); //test3(); test4(); test5(); test6(); getchar(); return 0; }
posted on 2017-04-21 08:03 gavanwanggw 阅读(347) 评论(0) 编辑 收藏 举报