c/c++线性表实现附源码(超详解)

简介: c/c++线性表实现附源码(超详解)

*不是纯c语言有一部分c++的内容

*以图书管理系统为例子带你理解

线性表的基本概念:

具有相同数据类型的 n (n ≥ 0 n\ge0n≥0)个数据元素的有限序列在内存空间中各数据的存储位置是一个连续的存在。

线性表的特点

1存在唯一一个被称作第一个的数据元素

2存在唯一一个被称作最后一个的数据元素

3除第一个元素以外每个元素都有唯一的前驱

4除最后一个元素以外每个元素都有唯一的后继

3线性表的顺序表示

LOC(ai)=LOC(a1)+(i-)*l

看着挺复杂其实可以这样理解

数组是从第一个元素a[0]起的而我们把第一个元素称作1

即a[i]=i+1

4规范化

#define error -1
#difine ok 1

这样规范化书写可以让我们的操作是否成功可视化

5顺序表的存储结构

#define maxsize 100//顺序表的最大长度(这样写的好处是可以根据不同数据大小更改)
typedef struct //
{
    ElemType *date;//存储数据的地址
    int length;//记录当前线性表的长度
}SqList;//自定义一种结构体类型,它的名字是SqList
//ElemType是一种数据类型可以为int,char,struct等

举个例子如果写的是图书管理系统那么ElemType *date就指向book

typedef struct 
{
    char name[20];
    float price;
}library;
library book[maxsize];

6顺序表的初始化

status initlist (SqList &l)
{
    l.date=(ElemType *)malloc(sizeof( ElemType)*maxsize)//为顺序表分配一个maxsize大小的空间
    if(!l.date)//判断是否为空
    return error;
    l.length=0;//将空表长度设置为0
    return ok;
}

指针自身 = (指针类型*)malloc(sizeof(指针类型)*数据数量

同时还有另外一种写法c++

status initlist (SqList &l)
{
    l.date=new ElemType[maxsize];
    if(!l.date)
    return error;
    l.length=0;
    return ok;
}

7顺序表的取值

status getelem(SqList l,int i,ElemType &e)
{
    if(i<1 && i>maxsize)//判断的值是否合理
    return error;
    e=l.elem[i-1];//elem[i-1]的位置存储第i个数据
    return ok;
}

ElemType &e中的e可以是一个结构体类型的数据

其实还可以通过循环的方式输入数据以上述图书管理系统为例

status getelem(SqList l,int i)
{
    if(i<1 && i>maxsize)//判断的值是否合理
    return error;
    int j;
for(j=0;j<i;j++)//为线性表输入信息
{    
    scanf("%c",&l.date[j].name);
    scanf("%f",&l.date[j].price);
}
    return ok;//输入完毕返回
}

8线性表的查找

1按位查找

bool locateElem(SqList &l)
{
    int i;
    printf("你要找第几个元素:");
    scanf("%d", &i);
    if (i<1 || i>l.length + 1)//判断输入的i值是否合法
        {
            printf("查找失败\n");
            return error;//i值不合法
        }
    printf("第%d个元素是%d\n", i, L.data[i - 1]);
    return ok;
}

2按值查找

void LocateElem(SqList &L)
{
    int e;
    int k = 1;
    printf("输入你要查找的元素:");
    scanf("%d", &e);
    for (int i = 0; i < l.length; i++)
    if (l.data[i] == e)
    {
        printf("找到了,是第%d个元素\n", i + 1);
        k = 0;
        break;
    }
    if (k)
        printf("找不到元素%d\n", e);
}

9顺序表的插入

bool ListInsret(SqList &L)
{
    int i, e;
    printf("请输入要插入顺序表的元素和元素位置:");
    scanf("%d %d", &e, &i);
    if (i<1 || i>L.length + 1)//判断元素下标是否越界
        return error;
    if (l.length > l.maxsize)//判断顺序表存储空间是否满了
        return error;
    for (int j = l.length; j >= i; j--)
    {
        l.data[j] = l.data[j-1];//从后往前逐个后移元素
    }
    l.data[i-1] = e;//将新元素放入下标为i-1的位置
    l.length++;//表长+1
    printf("插入的元素是%d,插入的位置是%d\n", e, i);
    return ok;
}

10顺序表的删除

bool ListDelete(SqList &L)
{
    int i, e;
    printf("请输入要删除的元素位置:");
    scanf("%d",&i);
    if (i<1 || i>l.length + 1)//判断元素下标是否越界
        return false;
    if (!L.data)//判断是不是空表
    {
        printf("空表\n");
        return error;
    }
    e = l.data[i - 1];
    for (int j = i; j <= L.length; j++)
    {
        L.data[j-1] = L.data[j];
    }
    l.length--;//表长-1
    printf("删除的元素是%d,这个元素的位置是%d\n", e, i);
    return ok;
}

以上就是顺序表的增删改查本人初学如有错误请各位大佬指正


相关文章
|
1月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
47 2
|
3月前
|
存储 C++
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
|
3月前
|
存储 算法 数据可视化
【C++】C++旅游管理系统(源码+论文)【独一无二】
【C++】C++旅游管理系统(源码+论文)【独一无二】
|
3月前
|
存储 数据可视化 C++
【C++】C++ 职工信息管理系统(源码)【独一无二】
【C++】C++ 职工信息管理系统(源码)【独一无二】
|
3月前
|
存储 算法 C++
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
|
3月前
|
搜索推荐 数据处理 文件存储
【C++】C++ 培训报名系统 (源码+论文)【独一无二】
【C++】C++ 培训报名系统 (源码+论文)【独一无二】
|
3月前
|
存储 C++
【C++】C++公司人事管理系统(源码)【独一无二】
【C++】C++公司人事管理系统(源码)【独一无二】
|
3月前
|
存储 数据挖掘 C语言
【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】
【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】
|
3月前
|
存储 数据可视化 C++
【C++】C++-机房收费管理系统(源码+注释)【独一无二】
【C++】C++-机房收费管理系统(源码+注释)【独一无二】
|
3月前
|
数据可视化 C++
【C++】C++商店销售管理系统(源码+论文)【独一无二】
【C++】C++商店销售管理系统(源码+论文)【独一无二】