静态数组的顺序表

来源:互联网 发布:JAVA中 异常类型 编辑:程序博客网 时间:2024/04/30 03:30
实现基于静态数组的顺序表的以下基本操作: 

1. 初始化 

2. 尾插

3. 尾删 

4. 头插 

5. 头删 

6. 读任意位置元素 

7. 修改任意位置元素 

8. 查找指定元素值的下标 

9. 在任意位置插入元素


seqlist.h

#pragma once//防止头文件被重复包含#include <stdio.h>#include <stdlib.h>#include <assert.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);//尾部增加一个元素valuevoid SeqListPopEnd(SeqList *seq);//尾部删除一个元素void SeqListPushStart(SeqList *seq, SeqListType value);//头部增加一个元素valuevoid SeqListPopStart(SeqList *seq);//头部删除一个元素void SeqListPushPosition(SeqList *seq, size_t pos, SeqListType value);//在下标pos处插入一个元素valuevoid SeqListPopPosition(SeqList *seq, size_t pos);//删除下标为pos的元素void SeqListSetValue(SeqList *seq, size_t pos, SeqListType value);//修改下标为pos的元素SeqListType SeqListGetValue(SeqList *seq, size_t pos);//查询下标为pos的元素size_t SeqListGetPos(SeqList *seq, SeqListType value);//查询value元素所在的下标


seqlist.c

#include "seqlist.h"//初始化顺序表void SeqListInit(SeqList *seq){assert(seq);seq->size = 0;}//打印顺序表void SeqListPrint(SeqList *seq, char *ch){int i = 0;printf("%s\n", ch);for (i = 0; i < seq->size; i++){printf("下标为%d的元素是:%c\n", i, seq->SeqListArr[i]);}printf("size=%d\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 SeqListPushStart(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 SeqListPopStart(SeqList *seq){assert(seq);if (seq->size == 0){printf("当前顺序表为空\n");return;}int i = 0;for (; i < seq->size - 1; i++){seq->SeqListArr[i] = seq->SeqListArr[i + 1];}seq->size--;}//在下标pos处插入一个元素valuevoid SeqListPushPosition(SeqList *seq, size_t pos, SeqListType value){assert(seq);if (seq->size >= SeqListMaxArr){printf("当前顺序表已满\n");return;}if (pos < 0 || pos >= seq->size){printf("非法坐标\n");return;}int 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 SeqListPopPosition(SeqList *seq, size_t pos){assert(seq);if (seq->size == 0){printf("当前顺序表为空\n");return;}if (pos < 0 || pos >= seq->size){printf("非法坐标\n");return;}int i = 0;for (i = pos; i < seq->size - 1; i++){seq->SeqListArr[i] = seq->SeqListArr[i + 1];}seq->size--;}//修改下标为pos的元素void SeqListSetValue(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 -1;}return seq->SeqListArr[pos];}//查询value元素所在的下标size_t SeqListGetPos(SeqList *seq, SeqListType value){assert(seq);int i = 0;for (; i < seq->size; i++){if (seq->SeqListArr[i] == value){return i;}}printf("非法坐标\n");return -1;}


test.c

#include "seqlist.h"//测试初始化顺序表void TestSeqListInit(){SeqList seq;SeqListInit(&seq);SeqListPrint(&seq, "*****初始化顺序表*****");}//测试尾部增加一个元素void TestSeqListPushEnd(){SeqList seq;SeqListInit(&seq);SeqListPushEnd(&seq, 'a');SeqListPushEnd(&seq, 'b');SeqListPushEnd(&seq, 'c');SeqListPrint(&seq, "\n*****尾部增加三个元素至顺序表*****");}//测试尾部删除一个元素void TestSeqListPopEnd(){SeqList seq;SeqListInit(&seq);SeqListPushEnd(&seq, 'a');SeqListPushEnd(&seq, 'b');SeqListPushEnd(&seq, 'c');SeqListPopEnd(&seq);SeqListPrint(&seq, "\n*****在顺序表尾部删除一个元素*****");printf("顺序表为空的情况:\n");SeqListInit(&seq);SeqListPopEnd(&seq);}//测试头部增加一个元素void TestSeqListPushStart(){SeqList seq;SeqListInit(&seq);SeqListPushEnd(&seq, 'c');SeqListPushEnd(&seq, 'd');SeqListPushEnd(&seq, 'e');SeqListPushStart(&seq, 'a');SeqListPushStart(&seq, 'b');SeqListPrint(&seq, "\n*****头部增加两个元素至顺序表*****");}//测试头部删除一个元素void TestSeqListPopStart(){SeqList seq;SeqListInit(&seq);SeqListPushEnd(&seq, 'a');SeqListPushEnd(&seq, 'b');SeqListPushEnd(&seq, 'c');SeqListPushEnd(&seq, 'd');SeqListPushEnd(&seq, 'e');SeqListPopStart(&seq);SeqListPopStart(&seq);SeqListPrint(&seq, "\n*****在顺序表头部删除两个元素*****");printf("顺序表为空的情况:\n");SeqListInit(&seq);SeqListPopStart(&seq);}//测试在下标pos处插入一个元素void TestSeqListPushPosition(){SeqList seq;SeqListInit(&seq);SeqListPushEnd(&seq, 'a');SeqListPushEnd(&seq, 'b');SeqListPushEnd(&seq, 'c');SeqListPushPosition(&seq, 2, 'd');SeqListPrint(&seq, "\n*****在顺序表中指定位置插入一个元素*****");printf("非法坐标情况:\n");SeqListPushPosition(&seq, 50, 'd');}//测试删除下标为pos的元素void TestSeqListPopPosition(){SeqList seq;SeqListInit(&seq);SeqListPushEnd(&seq, 'a');SeqListPushEnd(&seq, 'b');SeqListPushEnd(&seq, 'c');SeqListPushEnd(&seq, 'd');SeqListPopPosition(&seq, 2);SeqListPrint(&seq, "\n*****在顺序表中指定位置删除一个元素*****");printf("非法坐标情况:\n");SeqListPopPosition(&seq, 100);}//测试修改下标为pos的元素void TestSeqListSetValue(){SeqList seq;SeqListInit(&seq);SeqListPushEnd(&seq, 'a');SeqListPushEnd(&seq, 'b');SeqListPushEnd(&seq, 'c');SeqListSetValue(&seq, 2, 'd');SeqListPrint(&seq, "\n*****在顺序表中修改指定位置的元素*****");printf("非法坐标情况:\n");SeqListSetValue(&seq, 10, 'd');}//测试查询下标为pos的元素void TestSeqListGetValue(){SeqList seq;SeqListInit(&seq);SeqListPushEnd(&seq, 'a');SeqListPushEnd(&seq, 'b');SeqListPushEnd(&seq, 'c');SeqListPrint(&seq, "\n*****在顺序表中查询指定位置的元素*****");SeqListType value = SeqListGetValue(&seq, 2);printf("下标为2的元素是%c\n", value);printf("非法坐标情况:\n");SeqListGetValue(&seq, 50);}//测试查询value元素所在的下标void TestSeqListGetPos(){SeqList seq;SeqListInit(&seq);SeqListPushEnd(&seq, 'a');SeqListPushEnd(&seq, 'b');SeqListPushEnd(&seq, 'c');SeqListPrint(&seq, "\n*****在顺序表中查询指定元素的下标*****");size_t pos = SeqListGetPos(&seq, 'b');printf("元素b的下标为%d\n", pos);printf("非法坐标情况:\n");SeqListGetPos(&seq, 'd');}int main(){TestSeqListInit();TestSeqListPushEnd();TestSeqListPopEnd();TestSeqListPushStart();TestSeqListPopStart();TestSeqListPushPosition();TestSeqListPopPosition();TestSeqListSetValue();TestSeqListGetValue();TestSeqListGetPos();system("pause");return 0;}

结果演示