Pace 11 (顺序表的增删改查)

来源:互联网 发布:母婴店软件 编辑:程序博客网 时间:2024/06/16 16:28

代码功能

//SeqList.h#pragma once#include <stdio.h>#include <stdlib.h>#define SeqListMaxArr 1000typedef char SeqListType;typedef struct SeqList{SeqListType SeqListArr[SeqListMaxArr];size_t size;}SeqList;void SeqListInit(SeqList *seq);//初始化顺序表void SeqListPrint(SeqList *seq, char *ch);//打印顺序表void SeqListPushEnd(SeqList *seq, SeqListType value);//尾部增加一个元素valuevoid SeqListPopEnd(SeqList *seq);//尾部删除一个元素void SeqListPushFirst(SeqList *seq, SeqListType value);//头部增加一个元素valuevoid SeqListPopFirst(SeqList *seq);//头删一个元素void SeqListPushMiddle(SeqList *seq, size_t pos,SeqListType value);//在位置[pos]插入一元素valuevoid SeqListPopMiddle(SeqList *seq, size_t pos);//删除下标为[pos]的元素void SeqListSet(SeqList *seq, size_t pos, SeqListType value);//将下标为[pos]的元素改为valueSeqListType SeqListGetValue(SeqList *seq, size_t pos);//查询下标为[pos]的元素size_t SeqListGetPos(SeqList *seq, SeqListType value);//查询value元素所在的下标/////////////////////////////////////////////////////////////新增功能//删除顺序表中指定的值, 如果存在重复元素, 只删除第一个int SeqListRemove(SeqList* seq, SeqListType to_delete);//删除顺序表中所有的指定的值, 另外要实现一个时间复杂度为 O(N) 的优化版本void SeqListRemoveAll(SeqList* seq, SeqListType to_delete);//获取顺序表元素个数size_t SeqListSize(SeqList* seq);//判定顺序表是否为空int SeqListEmpty(SeqList* seq);//冒泡排序void SeqListBubbleSort(SeqList* seq);//冒泡排序升级版void SeqListBubbleSortEx(SeqList* seq, int(*cmp)(SeqListType, SeqListType));//利用回调函数对顺序表排序进行简化int cmp(SeqListType a, SeqListType b);


//SeqList.c#include "SeqList.h"#include <assert.h>//初始化数组void SeqListInit(SeqList *seq){assert(seq);seq->size = 0;}//打印顺序表void SeqListPrint(SeqList *seq,char *ch){size_t i = 0;printf("%s\n", ch);for (i = 0; i < seq->size; i++){printf("下标为%d个元素是 : [  %c  ]  地址是 : [  %p  ]\n", i, seq->SeqListArr[i], &(seq->SeqListArr[i]));}printf("size = %ld\n", seq->size);}//尾部增加一个元素valuevoid SeqListPushEnd(SeqList *seq, SeqListType value){assert(seq);if (seq->size >= SeqListMaxArr){printf("当前顺序表满\n");return;}seq->SeqListArr[seq->size] = value;seq->size++;}//尾部删除一个元素void SeqListPopEnd(SeqList *seq){assert(seq);if (seq->size == 0){printf("当前为空表\n");return;}seq->size--;}//头部增加一个元素valuevoid SeqListPushFirst(SeqList *seq, SeqListType value){assert(seq);if (seq->size >= SeqListMaxArr){printf("当前顺序表满\n");return;}int i = 0;for (i = seq->size - 1; i >= 0; i--){seq->SeqListArr[i + 1] = seq->SeqListArr[i];}seq->SeqListArr[0] = value;seq->size++;}//头删一个元素void SeqListPopFirst(SeqList *seq){assert(seq);if (seq->size == 0){printf("当前为空表\n");return;}size_t i = 0;for (i = 0; i < seq->size - 1; i++){seq->SeqListArr[i] = seq->SeqListArr[i + 1];}seq->size--;}//在位置[pos]插入一元素valuevoid SeqListPushMiddle(SeqList *seq, size_t pos, SeqListType value){assert(seq);if (pos < 0 || pos >= seq->size){printf("输入位置不合法\n");return;}size_t i = 0;for (i = seq->size - 1; i >= pos; i--){seq->SeqListArr[i + 1] = seq->SeqListArr[i];}seq->SeqListArr[pos] = value;seq->size++;}//删除下标为[pos]的元素void SeqListPopMiddle(SeqList *seq, size_t pos){assert(seq);if (pos < 0 || pos >= seq->size){printf("当前位置不合法\n");return;}size_t i = 0;for (i = pos; i < seq->size - 1; i++){seq->SeqListArr[i] = seq->SeqListArr[i + 1];}seq->size--;}//将下标为[pos]的元素改为valuevoid SeqListSet(SeqList *seq, size_t pos, SeqListType value){assert(seq);if (pos < 0 || pos >= seq->size){printf("当前位置不合法\n");return;}seq->SeqListArr[pos] = value;}//查询下标为[pos]的元素SeqListType SeqListGetValue(SeqList *seq, size_t pos){assert(seq);if (pos < 0 || pos >= seq->size){printf("当前位置不合法\n");return (SeqListType)0;}return seq->SeqListArr[pos];}//查询value元素所在的下标size_t SeqListGetPos(SeqList *seq, SeqListType value){assert(seq);size_t i = 0;for (i = 0; i < seq->size; i++){if (seq->SeqListArr[i] == value)return i;}return -1;}///////////////////////////////////////////////////////////////新增功能代码//删除顺序表中指定的值, 如果存在重复元素, 只删除第一个int SeqListRemove(SeqList* seq, SeqListType to_delete){assert(seq);size_t i = 0;for (; i < seq->size; i++){if (seq->SeqListArr[i] == to_delete)break;}if (i < seq->size){for (size_t j = i; j < seq->size - 1; j++){seq->SeqListArr[j] = seq->SeqListArr[j + 1];}seq->size--;}else{printf("列表中没有所要删除的值\n");return -1;}return i;}//删除顺序表中所有的指定的值, 另外要实现一个时间复杂度为 O(N) 的优化版本void SeqListRemoveAll(SeqList* seq, SeqListType to_delete){assert(seq);size_t i = SeqListRemove(seq, to_delete);while (i < seq->size)i = SeqListRemove(seq, to_delete);}//获取顺序表元素个数size_t SeqListSize(SeqList* seq){assert(seq);return seq->size;}//判定顺序表是否为空int SeqListEmpty(SeqList* seq){assert(seq);if (seq->size == 0)return 0;return 1;}//冒泡排序void SeqListBubbleSort(SeqList* seq){assert(seq);size_t i = 0;size_t j = 0;for (i = 0; i < seq->size - 1; i++){for (j = 0; j < seq->size - i - 1; j++){if (seq->SeqListArr[j] > seq->SeqListArr[j + 1]){SeqListType tmp = seq->SeqListArr[j];seq->SeqListArr[j] = seq->SeqListArr[j + 1];seq->SeqListArr[j + 1] = tmp;}}}}//利用回调函数对顺序表进行排序,只用改变cmp函数的if()条件,就可以改变排序方法//以下采用由大到小排序int cmp(SeqListType a, SeqListType b){if (a < b)return 1;return 0;}//冒泡排序升级版void SeqListBubbleSortEx(SeqList* seq, int(*cmp)(SeqListType, SeqListType)){assert(seq);size_t i = 0;size_t j = 0;for (i = 0; i < seq->size - 1; i++){for (j = 0; j < seq->size - i - 1; j++){if (cmp(seq->SeqListArr[j], seq->SeqListArr[j + 1])>0){SeqListType tmp = seq->SeqListArr[j];seq->SeqListArr[j] = seq->SeqListArr[j + 1];seq->SeqListArr[j + 1] = tmp;}}}}

//test.c#include "SeqList.h"#include <assert.h>#include <stdio.h>void TestSeqListInit(){SeqList seqlist;SeqListInit(&seqlist);SeqListPrint(&seqlist, "【测试初始化顺序表】");}void TestSeqListPushEnd(){SeqList seqlist;SeqListInit(&seqlist);SeqListPushEnd(&seqlist, 'a');SeqListPushEnd(&seqlist, 'b');SeqListPushEnd(&seqlist, 'c');SeqListPushEnd(&seqlist, 'd');SeqListPushEnd(&seqlist, 'e');SeqListPrint(&seqlist, "【测试尾增5元素】");}void TestSeqListPopEnd(){SeqList seqlist;SeqListInit(&seqlist);SeqListPushEnd(&seqlist, 'a');SeqListPushEnd(&seqlist, 'b');SeqListPushEnd(&seqlist, 'c');SeqListPushEnd(&seqlist, 'd');SeqListPushEnd(&seqlist, 'e');SeqListPopEnd(&seqlist);SeqListPopEnd(&seqlist);SeqListPrint(&seqlist, "【测试尾删2元素】");printf("\n【测试尾删特殊情况(表空)】\n");SeqListInit(&seqlist);SeqListPopEnd(&seqlist);}void TestSeqListPushFirst(){SeqList seqlist;SeqListInit(&seqlist);SeqListPushEnd(&seqlist, 'a');SeqListPushEnd(&seqlist, 'b');SeqListPushEnd(&seqlist, 'c');SeqListPushEnd(&seqlist, 'd');SeqListPushEnd(&seqlist, 'e');SeqListPushFirst(&seqlist, 'z');SeqListPrint(&seqlist, "【测试头增1元素】");}void TestSeqListPopFirst(){SeqList seqlist;SeqListInit(&seqlist);SeqListPushEnd(&seqlist, 'a');SeqListPushEnd(&seqlist, 'b');SeqListPushEnd(&seqlist, 'c');SeqListPushEnd(&seqlist, 'd');SeqListPushEnd(&seqlist, 'e');SeqListPopFirst(&seqlist);SeqListPrint(&seqlist, "【测试头删1元素】");printf("\n【测试头删特殊情况(表空)】\n");SeqListInit(&seqlist);SeqListPopFirst(&seqlist);}void TestSeqListPushMiddle(){SeqList seqlist;SeqListInit(&seqlist);SeqListPushEnd(&seqlist, 'a');SeqListPushEnd(&seqlist, 'b');SeqListPushEnd(&seqlist, 'c');SeqListPushEnd(&seqlist, 'd');SeqListPushEnd(&seqlist, 'e');SeqListPushMiddle(&seqlist, 2, 'X');SeqListPrint(&seqlist, "【测试在下标[2]处插入‘X’】");printf("\n【测试插入特殊情况(pos不在[0~size-1]之间)】\n");SeqListPushMiddle(&seqlist, 100, 'Y');}void TestSeqListPopMiddle(){SeqList seqlist;SeqListInit(&seqlist);SeqListPushEnd(&seqlist, 'a');SeqListPushEnd(&seqlist, 'b');SeqListPushEnd(&seqlist, 'c');SeqListPushEnd(&seqlist, 'd');SeqListPushEnd(&seqlist, 'e');SeqListPopMiddle(&seqlist, 2);SeqListPrint(&seqlist, "【测试删除原本下标为[2]的元素‘c’】");printf("\n【测试删除特殊情况(pos不在[0~size-1]之间)】\n");SeqListPopMiddle(&seqlist, 100);}void TestSeqListSet(){SeqList seqlist;SeqListInit(&seqlist);SeqListPushEnd(&seqlist, 'a');SeqListPushEnd(&seqlist, 'b');SeqListPushEnd(&seqlist, 'c');SeqListPushEnd(&seqlist, 'd');SeqListPushEnd(&seqlist, 'e');SeqListSet(&seqlist, 2, 'X');SeqListPrint(&seqlist, "【测试原本下标为[2]的元素改为‘X’】");printf("\n【测试修改元素特殊情况(pos不在[0~size-1]之间)】\n");SeqListSet(&seqlist, 100, 'X');}void TestSeqListGetValue(){SeqList seqlist;SeqListInit(&seqlist);SeqListPushEnd(&seqlist, 'a');SeqListPushEnd(&seqlist, 'b');SeqListPushEnd(&seqlist, 'c');SeqListPushEnd(&seqlist, 'd');SeqListPushEnd(&seqlist, 'e');SeqListPrint(&seqlist, "【查询下标为[2]的元素】");char ch = SeqListGetValue(&seqlist, 2);printf("下标为2的元素是 %c\n", ch);printf("\n【测试查询元素特殊情况(pos不在[0~size-1]之间)】\n");SeqListGetValue(&seqlist, 100);}void TestSeqListGetPos(){SeqList seqlist;SeqListInit(&seqlist);SeqListPushEnd(&seqlist, 'a');SeqListPushEnd(&seqlist, 'b');SeqListPushEnd(&seqlist, 'c');SeqListPushEnd(&seqlist, 'd');SeqListPushEnd(&seqlist, 'e');SeqListPrint(&seqlist, "【查询'c'的下标】");size_t pos = SeqListGetPos(&seqlist, 'c');printf("c的下标为 %ld\n", pos);printf("\n【测试查询下标特殊情况(找不到value)】\n");size_t poserror = SeqListGetPos(&seqlist, 'A');printf("c的下标为 %lu\n", poserror); //结果为一个很大的数即找不到}void TestSeqListRemove(){SeqList seqlist;SeqListInit(&seqlist);SeqListPushEnd(&seqlist, 'a');SeqListPushEnd(&seqlist, 'b');SeqListPushEnd(&seqlist, 'c');SeqListPushEnd(&seqlist, 'd');SeqListPushEnd(&seqlist, 'e');SeqListRemove(&seqlist, 'c');SeqListPrint(&seqlist, "【删除存在元素'c'】");SeqListRemove(&seqlist, 'z');SeqListPrint(&seqlist, "【删除不存在元素'z'】");}void TestSeqListRemoveAll(){SeqList seqlist;SeqListInit(&seqlist);SeqListPushEnd(&seqlist, 'a');SeqListPushEnd(&seqlist, 'b');SeqListPushEnd(&seqlist, 'c');SeqListPushEnd(&seqlist, 'c');SeqListPushEnd(&seqlist, 'c');SeqListPushEnd(&seqlist, 'd');SeqListPushEnd(&seqlist, 'c');SeqListPushEnd(&seqlist, 'e');SeqListRemoveAll(&seqlist, 'c');SeqListPrint(&seqlist, "【删除多次存在元素的'c'】");}void TestSeqListSize(){SeqList seqlist;SeqListInit(&seqlist);SeqListPushEnd(&seqlist, 'a');SeqListPushEnd(&seqlist, 'b');SeqListPushEnd(&seqlist, 'c');SeqListPushEnd(&seqlist, 'd');SeqListPushEnd(&seqlist, 'e');SeqListRemove(&seqlist, 'c');size_t i = SeqListSize(&seqlist);printf("顺序表元素个数为%d\n", i);}void TestSeqListEmpty(){SeqList seqlist;SeqListInit(&seqlist);SeqListPrint(&seqlist, "【顺序表空时】");int i = SeqListEmpty(&seqlist);if (i == 0)printf("SeqList NULL\n");elseprintf("SeqList NOT NULL\n");SeqListPushEnd(&seqlist, 'a');SeqListPushEnd(&seqlist, 'b');SeqListPushEnd(&seqlist, 'c');SeqListPushEnd(&seqlist, 'd');SeqListPushEnd(&seqlist, 'e');SeqListPrint(&seqlist, "【顺序表非空时】");i = SeqListEmpty(&seqlist);if (i == 0)printf("SeqList NULL\n");elseprintf("SeqList NOT NULL\n");}void TestSeqListBubbleSort(){SeqList seqlist;SeqListInit(&seqlist);SeqListPushEnd(&seqlist, 'a');SeqListPushEnd(&seqlist, 'e');SeqListPushEnd(&seqlist, 'd');SeqListPushEnd(&seqlist, 'b');SeqListPushEnd(&seqlist, 'c');SeqListPrint(&seqlist, "【排序前】");SeqListBubbleSort(&seqlist);SeqListPrint(&seqlist, "【排序后】");}void TsetSeqListBubbleSortEx(){SeqList seqlist;SeqListInit(&seqlist);SeqListPushEnd(&seqlist, 'a');SeqListPushEnd(&seqlist, 'e');SeqListPushEnd(&seqlist, 'd');SeqListPushEnd(&seqlist, 'b');SeqListPushEnd(&seqlist, 'c');SeqListPrint(&seqlist, "【升级排序前】");SeqListBubbleSortEx(&seqlist, cmp);SeqListPrint(&seqlist, "【升级排序后】");}int main(){TestSeqListInit();TestSeqListPushEnd();TestSeqListPopEnd();TestSeqListPushFirst();TestSeqListPopFirst();TestSeqListPushMiddle();TestSeqListPopMiddle();TestSeqListSet();TestSeqListGetValue();TestSeqListGetPos();TestSeqListRemove();TestSeqListRemoveAll();TestSeqListSize();TestSeqListEmpty();TestSeqListBubbleSort();TsetSeqListBubbleSortEx();system("pause");return 0;}



原创粉丝点击