您的位置:首页 > 其它

顺序表——简单实现(静态数组)

2018-03-14 16:27 363 查看
实现基于静态数组的顺序表的以下基本操作: 1. 初始化 2. 尾插 3. 尾删 4. 头插 5. 头删 6. 读任意位置元素 7. 修改任意位置元素 8. 查找指定元素值的下标 9. 在任意位置插入元素实现环境:Centos6.5 vim编辑器       大体的思路,头插尾插主要是建立在数组的最后位,而数组的下标是以0开始的,即给其数组的静态空间加上尾插的个数,而将尾插的数依次赋给数组的后边,尾删同样的道理,删除完后将空间减一即可。        头插头删,以头插一个元素为例,开辟的静态数组空间加一,依次由最后一个数替代上一个数,到最后空出来的是第一位,将值传给其空出来的即可。头删同样的道理i=i+1;依次循环将第一个值覆盖,留出最后一个空位置,然后减减。  先简单的写一下代码,后边有空将补上图解:SeqList.h文件:#pragma once //防止头文件包含#include<stdlib.h>#define SeqListMaxNum 1000typedef 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); //在下标为pos处插入元素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 "SeqList.h"#include<stdio.h>#include<assert.h>//初始化顺序表void SeqListInit(SeqList* seq){assert(seq);           //对指针操作时必须先判断是否为空seq->size=0;           //->也相当于解引用}//打印顺序表void SeqListPrint(SeqList* seq,char* ch){assert(seq);int i=0;printf("%s\n",ch);for( ;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){    //参数 往哪个元素中插  要插入的元素assert(seq);if(seq->size >= SeqListMaxNum){printf("顺序表已满,无法插入!\n\n");return;}else{seq->SeqListArr[seq->size]=value;seq->size++;}}//尾删一个元素void SeqListPopEnd(SeqList* seq){assert(seq);if(seq->size==0){printf("顺序表为空表,无法删除!\n\n");return;}else{seq->size--;}}//头插一个元素void SeqListPushStart(SeqList *seq,SeqListType value){assert(seq);if(seq->size >= SeqListMaxNum){printf("顺序表已满,无法插入!\n\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){assert(seq);if(seq->size ==0){printf("顺序表为空,无法删除!\n\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){assert(seq);if(seq->size >SeqListMaxNum){printf("顺序表已满,无法插入!\n\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];   //将pos元素后都后移,留出空间}seq->SeqListArr[pos]=value;seq->size++;}//删除下标为pos的元素void SeqListPopPosition(SeqList* seq, size_t pos){assert(seq);if (seq->size == 0){4000printf("顺序表为空表,无法删除!\n\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){assert(seq);if(pos>=seq->size){printf("非法坐标!\n\n");return;}else{seq->SeqListArr[pos]=value;}}//读下标为pos的元素SeqListType SeqListGetList(SeqList* seq,size_t pos){assert(seq);if(pos>=seq->size){printf("非法坐标!\n\n");return -1;}else{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;}}return -1;}//****************************////////////////////测试代码/////////////////****************************/////////测试初始化顺序表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,"***********在顺序表中尾删一个元素*******");print("空表情况:\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("非法坐标情况:\n");SeqListPushPosition(&seq,21,'r');}//测试删除下标为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("非法坐标情况(删除下标为8的元素):\n");SeqListPopPosition(&seq, 8);}//测试修改下标为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("非法坐标情况(修改下标为10的元素):\n");SeqListSetList(&seq, 10, 'k');}void TestSeqListGetList(){SeqList seq;SeqListInit(&seq);SeqListPushEnd(&seq, 'e');SeqListPushEnd(&seq, 'f');SeqListPushEnd(&seq, 'g');SeqListPushEnd(&seq, 'h');SeqListPrint(&seq,"*********在顺序表中读取指定位置元素******");char ch =SeqListGetList(&seq,1);printf("下标为1的元素为%c\n", ch);printf("非法坐标情况(读取下标为6的元素):\n");SeqListGetList(&seq, 6);}//测试查找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, 'h');printf("h元素的下标为%ld\n", pos);printf("非法情况(读取元素W的下标):\n");size_t pos1 = SeqListGetpos(&seq, 'W');printf("W元素的下标为%ld,坐标非法!\n\n", pos1);}int main(){TestSeqListInit();TestSeqListPushEnd();TestSeqListPopEnd();TestSeqListPushStart();TestSeqListPopStart();TestSeqListPushPosition();TestSeqListPopPosition();TestSeqListSetList();TestSeqListGetList();TestSeqListGetpos();return 0;}Makefile文件:SeqList:SeqList.cgcc $^ -o $@.PHONY:cleanclean:rm -rf *.o SeqList

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: