代码功能
//SeqList.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#define SeqListMaxArr 1000
typedef 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);//尾部增加一个元素value
void SeqListPopEnd(SeqList *seq);//尾部删除一个元素
void SeqListPushFirst(SeqList *seq, SeqListType value);//头部增加一个元素value
void SeqListPopFirst(SeqList *seq);//头删一个元素
void SeqListPushMiddle(SeqList *seq, size_t pos,SeqListType value);//在位置[pos]插入一元素value
void SeqListPopMiddle(SeqList *seq, size_t pos);//删除下标为[pos]的元素
void SeqListSet(SeqList *seq, size_t pos, SeqListType value);//将下标为[pos]的元素改为value
SeqListType 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);
}
//尾部增加一个元素value
void 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--;
}
//头部增加一个元素value
void 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]插入一元素value
void 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]的元素改为value
void 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");
else
printf("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");
else
printf("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;
}