静态数组顺序表

实现基于静态数组的顺序表的以下基本操作:

  1. 初始化
  2. 尾插
  3. 尾删
  4. 头插
  5. 头删
  6. 读任意位置元素
  7. 修改任意位置元素
  8. 查找指定元素值的下标
  9. 在任意位置插入元素

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;
}           

运行结果:
这里写图片描述
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/tao934798774/article/details/79840684