线性表的顺序存储(传统写法---数据结点和顺序存储算法不分离)

    科技2024-11-21  16

    1.线性表的顺序存储,通常通过数组模拟,其主要核心是插入和删除的算法

    1.1 插入算法

    1.2 删除算法

    2.代码实现

    seqlist_01.h代码如下:

    //定义线性表的基本数据结构 #define MAXSIZE 20 /*存储空间初始分配量*/ typedef int ElemType; //传值还是传指针就是看要写还是要读,如果读的话直接传值就可以了 //如果想修改线性表里的内容要传地址 typedef struct tag_SqList { ElemType data[MAXSIZE]; int length; }SqList; //线性表的接口api //1.初始化一个线性表,创建一个线性表 int InitSeqList(SqList *list); //2.线性表长度 int GetSeqListLength(SqList list); //3.在线性表的pos位置插入一个新元素e int InsertSeqList(SqList *list, int pos, ElemType e); //4.删除线性表中的第pos个位置,并且用e把值返回给上层 int DeleteSeqList(SqList *list, int pos, ElemType*e); //5.将线性表清空 int ClearSeqList(SqList *list); //6.将线性表中的第pos个位置,返回给e int GetElemSeqList(SqList list, int pos, ElemType*e); //7.定位元素,如果查找成功,则返回对应的序号,如果查找失败,返回-1; int LocateElem(SqList list, ElemType e);

    seqlist_01.cpp代码如下:

    #include "seqlist_01.h" #include<iostream> using namespace std; //打桩实现接口 //线性表的接口api //1.初始化一个线性表,创建一个线性表 int InitSeqList(SqList *list) { list->length = 0; return 0; } //2.线性表长度 int GetSeqListLength(SqList list) { return list.length; } //3.在线性表的pos位置插入一个新元素e int InsertSeqList(SqList *list, int pos, ElemType e) { if (list->length == MAXSIZE)//线性表已经满了 { return -1; } if (pos < 0||pos>list->length)//当pos比第一个位置小,或者比最后一个位置后一位置还要大 { return -1; } //对情况进行判断,看是不是在表尾进行插入 if (pos<=list->length-1)/*若插入数据位置不在表尾*/ { for (int i = list->length - 1; i >= pos; i--) { list->data[i + 1] = list->data[i]; } } list->data[pos] = e; //表长度加1 list->length++; return 0; } //4.删除线性表中的第pos个位置,并且用e把值返回给上层 int DeleteSeqList(SqList *list, int pos, ElemType*e) { if (list->length == 0)//线性表为空,返回错误 { return -1; } if (pos < 0 || pos>list->length-1)//当pos比第一个位置小,或者比最后一个位置还要大 无法定位返回错误 { return -1; } *e = list->data[pos]; if (pos <= list->length - 1)/*若删除数据位置不在表尾*/ { for (int i = pos; i <= list->length - 1; i++) { list->data[i] = list->data[i + 1]; } } //表长度-1 list->length--; return 0; } //5.将线性表清空 int ClearSeqList(SqList *list) { list->length = 0; return 0; } //6.将线性表中的第pos个位置,返回给e int GetElemSeqList(SqList list, int pos, ElemType*e) { *e = list.data[pos]; return 0; } //7.定位元素,如果查找成功,则返回对应的序号,如果查找失败,返回-1; int LocateElem(SqList list, ElemType e) { int i = 0; for (i = 0; i < list.length; i++) { if (e == list.data[i]) { break; } } if (i == GetSeqListLength(list)) { return -1; } return i; }

    测试程序框架如下:

    #include<iostream> #include"seqlist_01.h" using namespace std; int main(int argc, char*argv[]) { int tmpe = 0; //创建一个线性表 SqList s1; InitSeqList(&s1); //插入一个元素 InsertSeqList(&s1, 0, 1); InsertSeqList(&s1, 0, 2); InsertSeqList(&s1, 0, 3); //遍历线性表 for (int i = 0; i < GetSeqListLength(s1); i++) { int e; GetElemSeqList(s1, i, &e); printf("第[%d]个元素[%d]\n",i,e); } //删除线性表 DeleteSeqList(&s1, 0, &tmpe); printf("删除第0个元素[%d]\n", tmpe); //清空线性表 ClearSeqList(&s1); return 0; }

    输出结果如下图所示:

     

    Processed: 0.010, SQL: 8