线性表的顺序储存结构(静态)实现

来源:互联网 发布:vb.net 选择文件夹 编辑:程序博客网 时间:2024/05/21 15:49

线性表的顺序储存结构(静态)实现线性表的初始化、插入、查找、删除和显示等功能(C++实现)


代码实例:

/*    function:线性表的顺序储存结构定义(静态)实现线性表的初始化、插入、查找、删除和显示等功能    created by : xilong    date: 2017.1.31*/#include "iostream" // 包含c++的头文件using namespace std; // 使用命名空间 std#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 20 #define LIST_INIT_SIZE 100 //初始分配量typedef int ElemType;typedef int Status; // Status是函数的类型,typedef struct {    ElemType data[MAXSIZE]; //数组元素    int length; // 数组的长度} SqList;/*     功能:查找第i个元素    Status:是函数的类型,     条件:顺序线性表已存在,1 <= i <= Length    操作结果:将查找到第 i 个元素的结果放到指针 e 所指的变量中*/Status GetElem(SqList L, int i, ElemType *e){    if (L.length == 0 || i <1 || i > L.length)    {        return ERROR;    }    *e = L.data[i-1]; // 将找到的值放入指针e所指的变量中    return OK;}// 在线性表中第i个元素位置上,插入一个元素e// 数组下标是从0开始的,而我们实际是从1开始的,所以下面是i-1.// 功能:在线性表 L 的第 i 个位置插入元素e。Status ListInsert(SqList *L, int i, ElemType e){    int k;    if (L->length == MAXSIZE)    {        return ERROR; // 顺序线性表已经满了    }    if (i < 1 || i > L->length)    {        return ERROR; // i输入不规范    }    if (i <= L->length) // 如果待插入的值不在表尾     {        for (k = L->length; k >= i - 1; k--) // 从最后一个元素往前遍历,直到i-1(待插入的位置)        {            L->data[k + 1] = L->data[k];  // 从最后一个元素到第i-1个元素,将这些元素的下标统一向后移一位        }    }    L->data[i - 1] = e; // 在线性表 L 的第 i 个位置插入元素e    L->length++; // 线性表的长度加一    return OK;}// 删除元素// 在线性表 L 的第 i 个位置删除元素eStatus ListDelete(SqList *L, int i, ElemType *e){    int k;    if (L->length == 0) return ERROR; // 线性顺序表为空。    if (i < 1 || i > L->length) return ERROR; // i输入不规范    *e = L->data[i - 1];    if (i < L->length) // 如果待删除的的值不在表尾     {        for (k = i; k <= L->length; k++) // 从删除位置的元素往后遍历,直到最后一个元素        {            L->data[k - 1] = L->data[k]; // 从删除位置的元素往后遍历,将这些元素的下标统一向前移一位        }    }    L->length--;    return OK;}/*    功能:初始化一个空的线性表L    因为内存是静态分配,所以不用malloc函数,直接设置线性表的长度为0就ok*/Status InitList(SqList *L){    //int i;    //L->length = (int)malloc(LIST_INIT_SIZE * sizeof(int));    //L->data[MAXSIZE] = {9};    /*if (!L->data)    {        printf("初始化失败!");        exit(0);    }*/    L->length = 0;    return OK;}// 遍历线性表Status listTraverse(SqList *L){    int i;    for (i = 0; i < L->length; i++){        printf("%d ", L->data[i]);    }    printf("\n");    return OK;}//自动创建 5 个元素,并赋值为0,为插入操作提供准备Status createList(SqList *L){    int i;    for (i = 0; i < 5; i++){        L->data[i] = 0;    }    L->length = 5;    return OK;}// 给定e,查找线性表 L 中有没有元素 e。Status locateData(SqList *L, ElemType e){    int i;    for (i = 0; i < L->length; i++)    {        if (e == L->data[i])        {            return i;        }    }    return ERROR;}void main(){    SqList L;    ElemType e;    InitList(&L);// 初始化。    createList(&L); // 创建了5个元素,为接下来的插入操作提供准备    ListInsert(&L, 1, 4);  // 在第一个位置插入4(不是下标)    ListInsert(&L, 4, 8); // 在第4个位置插入8(不是下标)    cout << "----ListInsert start-------------" << endl;    if (ListInsert(&L, 3, 21)){        cout << "插入成功!" << endl;    }    else{        cout << "插入失败!" << endl;    }    cout << "----ListInserts start-------------" << endl;    listTraverse(&L);    cout << "----GetElem start-------------" << endl;    if (GetElem(L, 3, &e)){ // 找到第3个元素,并将第三个元素放到变量e中。        cout << "第三个元素的值为:" << e << endl; // 打印变量e的值。    }    else cout << "没有找到." << endl;    cout << "----GetElem end-------------" << endl;     int index = locateData(&L, 4); // 将返回的下标放入变量index中    cout << index+1 << endl; // 打印元素在第几个位置    cout << "------ListDelete start-----------" << endl;    if (ListDelete(&L, 1, &e)){ // 找到第3个元素,并将第三个元素放到变量e中。        cout << e << "已经删除" << endl; // 打印变量e的值。        listTraverse(&L);    }    else cout << "没有找到." << endl;    cout << "------ListDelete end---------" << endl;    cout << L.data[2] << endl;    cout << L.length << endl;    system("pause");}

运行截图

这里写图片描述

总结

  线性表顺序存储结构,在执行插入或者删除时,时间复杂度都是O(n),这就说明,此算法比较适合元素个数比较稳定,不经常插入和删除元素,插入和删除操作需要移动大量元素,容易造成存储空间的“碎片”。

0 0
原创粉丝点击