1顺序表

//#include <stdio.h>             // c 库
#include <stdlib.h>                //maclloc 库
#include <iostream>                // c++ 库

// 有本句 ,下面cout 前面可以没有  std::
using namespace std;

#define MAXSIZE 10

//typedef struct { //  元素数据 以二项式为例
//    int p; //二项式系数
//    int e; ////
//}ElemType;

typedef char ElemType;  //元素数据 以字符型为例



//采用数组方式
//优点 节点存储密度大,o(1)存取表中任一元素
//缺点 需要连续空间,浪费空间  数据元素不能自由扩充  
//     插入删除时需要移动大量元素


//定义顺序表类型
typedef struct {
    ElemType* data;   //ElemType 数组,使用动态初始化
    int length;
}SqList;

//动态初始化顺序表
bool InitList(SqList& L) {
    L.data = (ElemType*)malloc(MAXSIZE * sizeof(ElemType));   //动态申请内存,起始地址赋给数组名指针(data)
    L.length = 0;
    return 1;
}

//销毁顺序表
bool  DestroyList(SqList& L) {
    if (L.data) {
        free(L.data);
        return 1;
    }
    else return 0;

}



//插入元素
    //平均复杂度 o(n)
bool InsertList(SqList& L, int i, ElemType e) {
    if (i<1 || i>L.length + 1)
        return 0;
    else if (L.length + 1 == MAXSIZE)
        return 0;
    else
    {
        for (int k = L.length - 1; k >= i - 1; k--) {  //从尾元素起,赋值给后一个,直到第i个元素
            L.data[k + 1] = L.data[k];
        }
        L.data[i - 1] = e;
        L.length++;
    }
}

//删除元素
    //平均复杂度 o(n)
bool DelElem(SqList& L, int i, char& del)
{
    if (i<0 || i>L.length)
        return 0;
    else
    {
        del = L.data[i - 1];
        for (int k = i - 1; k < L.length; k++)
            L.data[k] = L.data[k + 1];
        L.length--;
    }

}

//逐个按值查找元素
    //复杂度计算: 平均需要比较次数 =  1* 1/n + 2* 1/n +   + n * 1/n 
    //                           查第i 需要比较次数 * 第i个概率
    //平均复杂度 o(n)
int LocateElem(SqList L, ElemType e) {
    for (int i = 0; i < L.length; i++)
        if (L.data[i] == e)  return i + 1;  //多个return 第一次return 有效
    return 0; //只有循完,没有return 才输出0 。
}


int main()
{
    //定义及初始化
    SqList L;
    InitList(L);

    //插入元素
    InsertList(L, 1, 'a');
    InsertList(L, 2, 'b');
    InsertList(L, 3, 'c');
    InsertList(L, 4, 'd');
    InsertList(L, 5, 'e');

    //删除元素
    char del;
    DelElem(L, 3, del);



    //输出
    cout << "顺序表共" << L.length << "个元素" << endl;
    for (int j1 = 0; j1 < L.length; j1++)
        cout << L.data[j1] << " ";

    //按值查找   
    int x;
    x = LocateElem(L, 'c');
    cout << endl << endl << "要查找的的是第" << x << "个元素" << endl;

    //销毁
    int d1 = DestroyList(L);
    if (d1)
        cout << endl << "SqList has been Destroyed! " << endl;

 

posted @ 2021-08-15 23:39  abel2020  阅读(48)  评论(0)    收藏  举报