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;
}

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


相关文章
|
4天前
|
算法 调度 C++
【C/C++ 数据结构 线性表】C/C++中队列的原理与实现:从基础到循环队列
【C/C++ 数据结构 线性表】C/C++中队列的原理与实现:从基础到循环队列
44 0
|
4天前
|
算法 API 计算机视觉
[opencv学习笔记] jiazhigang 30讲源码C++版本(含Makefile)
[opencv学习笔记] jiazhigang 30讲源码C++版本(含Makefile)
31 0
|
4天前
|
存储 人工智能 数据安全/隐私保护
【C++面向对象】C++考试题库管理系统(源码)【独一无二】
【C++面向对象】C++考试题库管理系统(源码)【独一无二】
|
4天前
|
存储 人工智能 搜索推荐
【C语言/C++】电子元器件管理系统(C源码)【独一无二】
【C语言/C++】电子元器件管理系统(C源码)【独一无二】
|
4天前
|
存储 人工智能 机器人
【C++面向对象】C++图书管理系统 (源码)【独一无二】
【C++面向对象】C++图书管理系统 (源码)【独一无二】
|
4天前
|
存储 人工智能 机器人
【C/C++】C语言 学生信息管理系统(源码)【独一无二】
【C/C++】C语言 学生信息管理系统(源码)【独一无二】
|
4天前
|
人工智能 机器人 测试技术
【C/C++】C语言 21点桌牌游戏 (源码) 【独一无二】
【C/C++】C语言 21点桌牌游戏 (源码) 【独一无二】
|
4天前
|
存储 人工智能 机器人
【C/C++】C++学籍信息管理系统(源码+报告)【独一无二】
【C/C++】C++学籍信息管理系统(源码+报告)【独一无二】
|
4天前
|
存储 人工智能 搜索推荐
【C/C++】C/C++招聘信息管理系统(源码)【独一无二】
【C/C++】C/C++招聘信息管理系统(源码)【独一无二】
|
4天前
|
人工智能 机器人 测试技术
【C++面向对象】C++飞机购票订票系统(源码+说明)【独一无二】
【C++面向对象】C++飞机购票订票系统(源码+说明)【独一无二】