动态链表增删改查及排序功能
生活随笔
收集整理的這篇文章主要介紹了
动态链表增删改查及排序功能
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
主要功能的實(shí)現(xiàn):
#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位置的數(shù) {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;elseright = 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;//當(dāng)前的容量 }SeqList;typedef enum Tag {TRUE, // 真FALSE, // 假 }Tag;typedef struct FindRet {Tag isFind; // 是否找到的標(biāo)示size_t index; // 找到數(shù)據(jù)的下標(biāo) }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);}elseprintf("find failed!\n");x = 8;ret = BinarySearch(&s, x);if (ret.isFind == TRUE){printf("%d %d", x, ret.index);}elseprintf("find failed!\n");x = 1;ret = BinarySearch(&s, x);if (ret.isFind == TRUE){printf("%d %d\n", x, ret.index);}elseprintf("find failed!\n");x = 5;ret = BinarySearch(&s, x);if (ret.isFind == TRUE){printf("%d %d\n", x, ret.index);}elseprintf("find failed!\n");} int main() {test1();test2();//test3();test4();test5();test6();getchar();return 0; }
總結(jié)
以上是生活随笔為你收集整理的动态链表增删改查及排序功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 算法排序总结
- 下一篇: 未在本地计算机上注册“Microsoft