当前位置: 首页 > news >正文

[数据结构笔记] 1. 顺序表 内含所有函数C语言代码,完全无伪代码

线性表

由 n(n>=0) 个数据特性相同的元素构成的有限序列,称为线性表。

顺序表

用一组连续的内存单元依次存储线性表的各个元素,也就是说,逻辑上相邻的元素,实际的物理存储空间也是连续的。

直接写数组存储

类型定义

#define MAXSIZE 100
typedef int ElemType;//给数据类型起别名

typedef struct {
	ElemType data[MAXSIZE];//直接开数组表示顺序表
	int length;
}SeqList;

初始化

void initList(SeqList* L)
{
	L->length = 0;
}

尾插法即在尾部添加元素

  1. data[i]处的值为e
  2. length++
int appendElem(SeqList*L , ElemType e)
{
    if (L->length >= MAXSIZE)
    {
        printf("顺序表已满\n");
        return 0;
    }
    L->data[L->length] = e;
    L->length++;
    return 1;
}

遍历

写一个遍历数组的循环,输出语句写为输出i地址对应的值

void listElem(SeqList *L)
{
    for (int i = 0; i < L->length; i++)
    {
        printf("%d ",L->data[i]);//输出L上i位置对应的值
    }
    printf("\n");
}

插入元素

  1. 判断是否能插入(是否满, 是否插入在顺序表前(顺序表外)) 判断根据需求来, 可以增加程序的鲁棒性
  2. 遍历使原来 该位置 以及 该位置之后 的元素后移
  3. 令 该位置的值 为插入值
  4. length++
int insertElem(SeqList*L, int pos, ElemType e)
{
    /*
    if (L->length >=  MAXSIZE)
    {
        printf("表已经满了\n");
        return 0;
    }
    if (pos < 1 || pos > L->length)
    {
    	printf("插入位置错误\n");
        return 0;
    }
        */

    if (pos <= L->length)
    {
        //pos-1 是因为说要插在第五个元素位置时, 实际上插在下标为4的位置上
        for (int i = L->length - 1; i >= pos - 1; i--)
        {
            L->data[i + 1] = L->data[i];
        }
        L->data[pos - 1] = e;
        L->length++;
    }
    return 1;
}

删除元素

  1. 如果删除的不是最后一位元素,将该位之后的所有元素依次前移, 覆盖该元素的值
  2. length--
int deleteElem(SeqList* L, int pos, ElemType* e)
{
    //第一行是将 要删除的值保存在第三个参数中, 如果有需要可以打印被删除的值
    *e = L->data[pos - 1];//若不需要保存可以删去本行和上面的第三个参数,两个参数即可
    if (pos < L->length)
    {
        for (int i = pos; i < L->length; i++)
        {
            L->data[i - 1] = L->data[i];
        }
    }
    L->length--;
    return 1;
}

查找元素

遍历顺序表, 如果找到则返回该元素位置(下标+1), 找不到则返回0

int findElem(SeqList*L, ElemType e)
{

    for (int i = 0; i < L->length; i++)
    {
        if (L->data[i] == e)
        {
            return i + 1;
        }
    }
    return 0;
}

以上声明和函数对应的main函数

int main(int argc, char const* argv[])
{
    //声明一个线性表并初始化
    //SeqList list;
    //initList(&list);

    printf("初始化成功,目前长度占用 %d\n",list.length);
    printf("目前占用内存 %zu字节\n", sizeof(list.data));
    appendElem(&list, 88);
    appendElem(&list, 45);
    appendElem(&list, 43);
    appendElem(&list, 17);
    listElem(&list);//遍历

    //插入元素
    //insertElem(&list, 2, 18);
    //listElem(&list);//遍历

    //删除元素
    //ElemType delData;
    //deleteElem(&list, 2, &delData);
    //printf("被删除的数据为:%d\n", delData);
    //listElem(&list);

    //查找元素
    printf("%d\n", findElem(&list,43));

    return 0;
}

动态分配内存地址初始化

new的底层代码?

以上函数完全不用修改,只是修改初始化

main函数中 & 删除, .改为->

//动态分配内存实现
typedef struct {
    ElemType* data;
    int length;
}SeqList;
SeqList* initList()
{
    SeqList *L= (SeqList*)malloc(sizeof(SeqList));
    L->data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
    L->length = 0;
    return L;
}

故新的main函数:

int main(int argc, char const* argv[])
{
    //动态分配内存
    SeqList* list = initList();


    printf("初始化成功,目前长度占用 %d\n",list->length);
    printf("目前占用内存 %zu字节\n", sizeof(list->data));
    appendElem(list, 88);
    appendElem(list, 45);
    appendElem(list, 43);
    appendElem(list, 17);
    listElem(list);//遍历

    //插入元素
    //insertElem(list, 2, 18);
    //listElem(list);//遍历

    //删除元素
    //ElemType delData;
    //deleteElem(list, 2, delData);
    //printf("被删除的数据为:%d\n", delData);
    //listElem(list);

    printf("%d\n", findElem(list,43));

    return 0;
}

全部代码

#include<iostream>
using namespace std;

#define MAXSIZE 100
typedef int ElemType;//给数据类型起别名

//非动态分配内存实现
//typedef struct {
//	ElemType data[MAXSIZE];//直接开数组表示顺序表
//	int length;
//}SeqList;
//
//void initList(SeqList* L)
//{
//	L->length = 0;
//}

//动态分配内存实现
typedef struct {
    ElemType* data;
    int length;
}SeqList;
SeqList* initList()
{
    SeqList *L= (SeqList*)malloc(sizeof(SeqList));
    L->data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
    L->length = 0;
    return L;
}


//尾插
int appendElem(SeqList*L , ElemType e)
{
    if (L->length >= MAXSIZE)
    {
        printf("顺序表已满\n");
        return 0;
    }
    L->data[L->length] = e;
    L->length++;
    return 1;
}

void listElem(SeqList *L)
{
    for (int i = 0; i < L->length; i++)
    {
        printf("%d ",L->data[i]);
    }
    printf("\n");
}

int insertElem(SeqList*L, int pos, ElemType e)
{
    if (L->length >=  MAXSIZE)
    {
        printf("表已经满了\n");
        return 0;
    }

    if (pos < 1 || pos > L->length)
    {
        printf("插入位置错误\n");
        return 0;
    }
    if (pos <= L->length)
    {
        for (int i = L->length - 1; i >= pos - 1; i--)//pos-1 是因为说要插在第五个元素位置时, 实际上插在下标为4的位置上
        {
            L->data[i + 1] = L->data[i];
        }
        L->data[pos - 1] = e;
        L->length++;
    }
    return 1;
}

int deleteElem(SeqList* L, int pos, ElemType* e)
{
    *e = L->data[pos - 1];
    if (pos < L->length)
    {
        for (int i = pos; i < L->length; i++)
        {
            L->data[i - 1] = L->data[i];
        }
    }
    L->length--;
    return 1;
}

int findElem(SeqList*L, ElemType e)
{
    if (L->length == 0)
    {
        printf("空链表\n");
        return 0;
    }
    for (int i = 0; i < L->length; i++)
    {
        if (L->data[i] == e)
        {
            return i + 1;
        }
    }
    return 0;
}


int main(int argc, char const* argv[])
{
    //声明一个线性表并初始化
    //SeqList list;
    //initList(&list);

    //动态分配内存
    SeqList* list = initList();


    printf("初始化成功,目前长度占用 %d\n",list->length);
    printf("目前占用内存 %zu字节\n", sizeof(list->data));
    appendElem(list, 88);
    appendElem(list, 45);
    appendElem(list, 43);
    appendElem(list, 17);
    listElem(list);//遍历

    //插入元素
    //insertElem(list, 2, 18);
    //listElem(list);//遍历

    //删除元素
    //ElemType delData;
    //deleteElem(list, 2, delData);
    //printf("被删除的数据为:%d\n", delData);
    //listElem(list);

    printf("%d\n", findElem(list,43));

    return 0;
}

相关文章:

  • 使用串口工具实现tcp与udp收发
  • Leetcode2717:半有序排列
  • 【原创工具】同文件夹PDF文件合并 By怜渠客
  • 安全见闻4
  • 多功能免费网络测速及问题诊断工具
  • 【C++】:STL详解 —— vector类
  • C++知识整理day9——继承(基类与派生类之间的转换、派生类的默认成员函数、多继承问题)
  • Linux(Centos 7.6)命令详解:uniq
  • 【愚公系列】《Python网络爬虫从入门到精通》034-DataFrame简单数据计算整理
  • 表单制作代码,登录动画背景前端模板
  • 2025网络安全等级测评报告,信息安全风险评估报告(Word模板)
  • DeepSeek开源周Day2:DeepEP - 专为 MoE 模型设计的超高效 GPU 通信库
  • win11 24h2 远程桌面 频繁断开 已失去连接 2025
  • 通过Python编程语言实现“机器学习”小项目教程案例
  • Ollama微调
  • 猿大师播放器:网页内嵌VLC/FFPlayer在Web端直接播放RTSP/RTMP/H.265视频流
  • (Arrow)试时间处理变得更简单
  • 【Linux Oracle】time命令+oracle exp压缩
  • 分享httprunner 结合django实现平台接口自动化方案
  • QT各种版本下载安装
  • 佛山龙江做网站的/怎么写软文推广
  • 重庆网站建设哪家专业/网店运营是做什么的
  • 广州设计网站建设/站长号
  • 传媒公司主要做什么/优化网络培训
  • 阿里巴巴的网站怎么做/二级域名网址查询
  • 微信网站 手机网站/白云百度seo公司