实现基于静态数组的顺序表的以下基本操作:
- 初始化
- 尾插
- 尾删
- 头插
- 头删
- 读任意位置元素
- 修改任意位置元素
- 查找指定元素值的下标
- 在任意位置插入元素
seqlist.h
#pragma once //防止头文件重复包含
#include<stdlib.h>
#define SeqListMaxNum 1000 //数组最大元素个数
typedef char SeqListType; //重定义类型
typedef struct SeqList{
SeqListType SeqListArr[SeqListMaxNum];
size_t size; //元素个数
}SeqList;
void SeqListInit(SeqList* seq); //初始化顺序表
void SeqListPrint(SeqList* seq,char* ch); //打印顺序表
void SeqListPushEnd(SeqList* seq,SeqListType value); //尾插一个元素
void SeqListPopEnd(SeqList* seq); //尾删一个元素
void SeqListPushStart(SeqList* seq,SeqListType value); //头插一个元素
void SeqListPopStart(SeqList* seq); //头删一个元素
void SeqListPushPosition(SeqList* seq,size_t pos,SeqListType value)
void SeqListPopPosition(SeqList* seq,size_t pos); //删除下标为pos的元素
void SeqListSetList(SeqList* seq,size_t pos,SeqListType value); //在下标为pos处插入元素
SeqListType SeqListGetList(SeqList* seq,size_t pos); //读下标为pos处的元素
size_t SeqListGetPos(SeqList* seq,SeqListType value); //查找value元素值的下标
seqlist.c
#include <stdio.h>
#include"seqlist.h"
//初始化顺序表
void SeqListInit(SeqList* seq){
if(seq == NULL){
return;
}
seq->size = 0;
}
//打印顺序表
void SeqListPrint(SeqList* seq, char* ch){
if(seq == NULL){
return;
}
int i = 0;
printf("%s\n", ch);
for(i = 0; i < seq->size; i++){
printf("下标为%d的元素是:[%c]\n",i,seq->SeqListArr[i]);
}
printf("size = %ld\n\n", seq->size);
}
//尾插一个元素
void SeqListPushEnd(SeqList* seq, SeqListType value){
if(seq == NULL){
return;
}
if (seq->size >= SeqListMaxNum) {
printf("当前顺序表已满!\n");
return;
}
else{
seq->SeqListArr[seq->size] = value;
seq->size++;
}
}
//尾删一个元素
void SeqListPopEnd(SeqList* seq){
if(seq == NULL){
return;
}
if (seq->size == 0){
printf("当前顺序表为空表!\n");
return;
}
else{
--seq->size;
}
}
//头插一个元素
void SeqListPushStart(SeqList* seq, SeqListType value){
if(seq == NULL){
return;
}
if (seq->size >= SeqListMaxNum){
printf("当前顺序表已满!\n");
return;
}
else {
int i = seq->size - 1;
for (; i >= 0; i--){
seq->SeqListArr[i + 1] = seq->SeqListArr[i];
}
seq->SeqListArr[0] = value;
++seq->size;
}
//头删一个元素
void SeqListPopStart(SeqList* seq){
if(seq == NULL){
return;
}
if (seq->size == 0){
printf("当前顺序表为空表!\n");
return;
}
else{
int i = 0;
for (; i < seq->size - 1;i++){
seq->SeqListArr[i] = seq->SeqListArr[i+1];
}
--seq->size;
}
}
//在下标为pos处插入元素
void SeqListPushPosition(SeqList* seq, size_t pos, SeqListType value){
if(seq == NULL){
return;
}
if (seq->size >= SeqListMaxNum){
printf("当前顺序表已满!\n");
return;
}
else if (pos >= seq->size){
printf("非法坐标!\n\n");
return;
}
else{
int i = seq->size - 1;
for (; i >= pos; i--){
seq->SeqListArr[i + 1] = seq->SeqListArr[i];
}
seq->SeqListArr[pos] = value;
++seq->size;
}
}
//删除下标为pos的元素
void SeqListPopPosition(SeqList* seq, size_t pos){
if(seq == NULL){
return;
}
if (seq->size == 0){
printf("当前顺序表为空表!\n");
return;
}
else if (pos >= seq->size){
printf("非法坐标!\n\n");
return;
}
else
{
int i = pos;
for (; i < seq->size - 1; i++){
seq->SeqListArr[i] = seq->SeqListArr[i + 1];
}
--seq->size;
}
}
//修改下标为pos的元素
void SeqListSetList(SeqList* seq, size_t pos, SeqListType value){
if(seq == NULL){
return;
}
if (pos >= seq->size){
printf("非法坐标!\n\n");
return;
}
else{
seq->SeqListArr[pos] = value;
}
}
//读下标为pos的元素
SeqListType SeqListGetList(SeqList* seq, size_t pos)
{
if(seq == NULL){
return;
}
if (pos >= seq->size){
printf("非法坐标!\n\n");
return -1;
}
else{
return seq->SeqListArr[pos];
}
}
//查找value元素值的下标
size_t SeqListGetPos(SeqList* seq, SeqListType value){
if(seq == NULL){
return;
}
int i = 0;
for (; i < seq->size; i++){
if (seq->SeqListArr[i] == value){
return i;
}
}
return -1;
}
///////////////////////////////////////
//////////以下为测试代码/////////////////
///////////////////////////////////////
#include"seqlist.h"
#include<stdio.h>
//测试初始化顺序表
void TestSeqListInit(){
SeqList seq;
SeqListInit(&seq);
SeqListPrint(&seq,"*****初始化顺序表*****");
}
//测试尾插一个元素
void TestSeqListPushEnd(){
SeqList seq;
SeqListInit(&seq);
SeqListPushEnd(&seq,'a');
SeqListPushEnd(&seq,'b');
SeqListPushEnd(&seq,'c');
SeqListPushEnd(&seq,'d');
SeqListPrint(&seq, "*****尾插四个元素到顺序表*****");
}
//测试尾删一个元素
void TestSeqListPopEnd(){
SeqList seq;
SeqListInit(&seq);
SeqListPushEnd(&seq, 'a');
SeqListPushEnd(&seq, 'b');
SeqListPushEnd(&seq, 'c');
SeqListPushEnd(&seq, 'd');
SeqListPopEnd(&seq);
SeqListPrint(&seq, "*****在顺序表中尾删一个元素*****");
printf("空表情况:\n");
SeqListInit(&seq);
SeqListPopEnd(&seq);
}
//测试头插一个元素
void TestSeqListPushStart(){
SeqList seq;
SeqListInit(&seq);
SeqListPushEnd(&seq, 'a');
SeqListPushEnd(&seq, 'b');
SeqListPushEnd(&seq, 'c');
SeqListPushEnd(&seq, 'd');
SeqListPushStart(&seq, 'e');
SeqListPrint(&seq, "*****头插一个元素至顺序表*****");
}
//测试头删一个元素
void TestSeqListPopStart(){
SeqList seq;
SeqListInit(&seq);
SeqListPushEnd(&seq, 'a');
SeqListPushEnd(&seq, 'b');
SeqListPushEnd(&seq, 'c');
SeqListPushEnd(&seq, 'd');
SeqListPopStart(&seq);
SeqListPrint(&seq, "*****在顺序表中头删一个元素*****");
printf("空表情况:\n");
SeqListInit(&seq);
SeqListPopStart(&seq);
}
//测试在下标为pos处插入元素
void TestSeqListPushPosition(){
SeqList seq;
SeqListInit(&seq);
SeqListPushEnd(&seq, 'a');
SeqListPushEnd(&seq, 'b');
SeqListPushEnd(&seq, 'c');
SeqListPushEnd(&seq, 'd');
SeqListPushPosition(&seq, 2, 's');
SeqListPrint(&seq, "*****在顺序表中指定位置插入一个元素*****");
printf("非法情况(在下标为10的位置插入元素):\n");
SeqListPushPosition(&seq, 10, 'w');
}
//测试删除下标为pos的元素
void TestSeqListPopPosition(){
SeqList seq;
SeqListInit(&seq);
SeqListPushEnd(&seq, 'a');
SeqListPushEnd(&seq, 'b');
SeqListPushEnd(&seq, 'c');
SeqListPushEnd(&seq, 'd');
SeqListPopPosition(&seq, 2);
SeqListPrint(&seq, "*****在顺序表中指定位置删除一个元素*****");
printf("非法情况(删除下标为6的元素):\n");
SeqListPopPosition(&seq, 6);
}
//测试修改下标为pos的元素
void TestSeqListSetList(){
SeqList seq;
SeqListInit(&seq);
SeqListPushEnd(&seq, 'a');
SeqListPushEnd(&seq, 'b');
SeqListPushEnd(&seq, 'c');
SeqListPushEnd(&seq, 'd');
SeqListSetList(&seq, 1, 'o');
SeqListPrint(&seq, "*****在顺序表中修改指定位置的元素*****");
printf("非法情况(修改下标为8的元素):\n");
SeqListSetList(&seq, 8,'y');
}
//测试读取下标为pos的元素
void TestSeqListGetList(){
SeqList seq;
SeqListInit(&seq);
SeqListPushEnd(&seq, 'e');
SeqListPushEnd(&seq, 'f');
SeqListPushEnd(&seq, 'g');
SeqListPushEnd(&seq, 'h');
SeqListPrint(&seq, "*****在顺序表中读取指定位置元素*****");
char ch = SeqListGetList(&seq, 3);
printf("下标为3的元素为%c\n", ch);
printf("非法情况(读取下标为7的元素):\n");
SeqListGetList(&seq, 7);
}
//测试查找value元素值的下标
void TestSeqListGetPos(){
SeqList seq;
SeqListInit(&seq);
SeqListPushEnd(&seq, 'e');
SeqListPushEnd(&seq, 'f');
SeqListPushEnd(&seq, 'g');
SeqListPushEnd(&seq, 'h');
SeqListPrint(&seq, "*****在顺序表中读取指定位置元素下标*****");
size_t pos = SeqListGetPos(&seq, 'g');
printf("g元素的下标为%ld\n", pos);
printf("非法情况(读取元素q的下标):\n");
size_t pos1 = SeqListGetPos(&seq, 'q');
printf("q元素的下标为%ld,坐标非法!/n", pos1);
}
int main(){
TestSeqListInit();
TestSeqListPushEnd();
TestSeqListPopEnd();
TestSeqListPushStart();
TestSeqListPopStart();
TestSeqListPushPosition();
TestSeqListPopPosition();
TestSeqListSetList();
TestSeqListGetList();
TestSeqListGetPos();
return 0;
}
运行结果: