千家信息网

C语言线性表中顺序表的示例分析

发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,小编给大家分享一下C语言线性表中顺序表的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、本章重点1.线性表和顺序
千家信息网最后更新 2025年02月03日C语言线性表中顺序表的示例分析

小编给大家分享一下C语言线性表中顺序表的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一、本章重点

1.线性表和顺序表的概念

2.动态和静态顺序表接口实现

3.在线0j训练

二、线性表

满足下列条件的即为线性表:

  • 线性表(linear list)是n个具有相同特性的数据元素的有限序列。

  • 线性表在逻辑上是线性结构,但是在物理结构上并不一定是连续的。(这里的物理结构一般指物理地址空间)。

三、顺序表

满足下列条件的即为顺序表:

  • 是线性表

  • 物理结构上是连续的

顺序表一般可以分为:

  • 静态顺序表:使用定长数组存储。

  • 动态顺序表:使用动态开辟的数组存储。

四、静态顺序表接口实现

4.1顺序表初始化

void SeqListInint(SeqList* s){        assert(s);        memset(s->a, 0, sizeof(SeqListDataType) * MAXSIZE);        s->size = 0;}

还有一种简单初始化的方式:

在创建顺序表s的时候直接赋值0,即SeqList s = { 0 };

4.2顺序表打印

void SeqListPrint(SeqList* s){        int i = 0;        for (i = 0; i < s->size; i++)        {                printf("%d ", s->a[i]);        }        printf("\n");}

传顺序表的地址,使用for循环语句,逐步打印数组元素。

4.3顺序表尾插

void SeqListPushBack(SeqList* s, int x){        assert(s);        if (s->size == MAXSIZE)        {                printf("当前空间已满,无法继续添加\n");                exit(1);        }        s->a[s->size] = x;        s->size++;}

先检查s是否位空,如果为空则报错,再检查是否满了,如果满了,则提示已满并结束程序。

4.4顺序表尾删

void SeqListPopBack(SeqList* s){        assert(s);        if (s->size == 0)        {                printf("当前顺序表为空,无法删除\n");                exit(1);        }        s->size--;}

直接s->size--即可,不需要把最后的元素置为0.

4.5顺序表头插

void SeqListPushFront(SeqList* s, int x){        if (s->size == MAXSIZE)        {                printf("空间已满,无法继续添加\n");                exit(1);        }        if (s->size == 0)        {                s->a[s->size] = x;                s->size++;                return;        }        else        {                int j = 0;                for (j = s->size - 1; j >= 0; j--)                {                        s->a[j + 1] = s->a[j];                }                s->a[0] = x;                s->size++;        }}

先将元素往后移动,移动完之后再放入要插入的元素。

4.6顺序表头删

void SeqListPopFront(SeqList* s){        if (s->size == 0)        {                printf("当前顺序表为空,无法删除\n");                exit(1);        }        int j = 0;        for (j = 1; j size; j++)        {                s->a[j - 1] = s->a[j];        }        s->size--;}

使用移动元素的方式,覆盖前面的内容,达到删除的目的。

4.7顺序表任意位置插入

void SeqListInsert(SeqList* s, int pos, int x){        if (s->size == MAXSIZE)        {                printf("当前空间已满,无法继续添加\n");                exit(1);        }        if (pos < 0||pos>s->size)        {                printf("插入位置有误,无法插入\n");                exit(1);        }        if (pos == s->size)        {                s->a[s->size] = x;                s->size++;                return;        }        for (int j = s->size - 1; j >= pos; j--)        {                s->a[j + 1] = s->a[j];        }        s->a[pos] = x;        s->size++;}

找到元素位置,移动元素,再将要插入的元素放入。

4.8顺序表任意位置删除

void SeqListErase(SeqList* s, int pos){        assert(s);        if (s->size == 0)        {                printf("顺序表为空,删除失败\n");                exit(1);        }        if (pos >= s->size || pos < 0)        {                printf("删除位置不存在\n");                exit(1);        }        int j = 0;        for (j = pos; j < s->size-1; j++)        {                s->a[j] = s->a[j + 1];        }        s->size--;}

找到要删除的位置,通过移动覆盖要删除的元素。

五、动态顺序表接口实现

5.1顺序表的初始化

void SeqListInint(SeqList* s){        assert(s);        s->a = (DataType*)malloc(10 * sizeof(DataType));        s->size = 0;        s->capacity = 10;}

将元素个数size置为0

开辟a的空间

初始容量设置为10

5.2顺序表打印

void SeqListPrint(SeqList* s){        assert(s);        int i = 0;        for (i = 0; i < s->size; i++)        {                printf("%d ", s->a[i]);        }        printf("\n");}

5.3顺序表尾插

void SeqListPushBack(SeqList* s, DataType x){        assert(s);        SeqListCheckCapacity(s);        s->a[s->size] = x;        s->size++;}

5.4顺序表尾删

void SeqListPopBack(SeqList* s){        assert(s);        if (s->size == 0)        {                printf("当前顺序表为空,删除失败\n");                exit(1);        }        s->size--;}

5.5顺序表头插

void SeqListPushFront(SeqList* s, DataType x){        assert(s);        SeqListCheckCapacity(s);        if (s->size == 0)        {                s->a[0] = x;                s->size++;        }        else        {                int end = s->size - 1;                while (end >= 0)                {                        s->a[end + 1] = s->a[end];                        end--;                }                s->a[0] = x;                s->size++;        }}

5.6顺序表头删

void SeqListPopFront(SeqList* s){        assert(s);        if (s->size == 0)        {                printf("当前顺序表为空,无法删除\n");                exit(1);        }        if (s->size == 1)        {                s->size--;                return;        }        else        {                int i = 0;                for (i = 0; i <=s->size-2 ; i++)                {                        s->a[i] = s->a[i + 1];                }                s->size--;        }}

5.7顺序表任意位置插入

void SeqListInsert(SeqList* s, int pos, DataType x){        assert(s);        SeqListCheckCapacity(s);        if (pos<0 || pos>s->size)        {                printf("插入位置不存在\n");                exit(1);        }        else if(pos==s->size)        {                s->a[s->size] = x;                s->size++;        }        else        {                int i = 0;                for (i = s->size - 1; i >= pos; i--)                {                        s->a[i + 1] = s->a[i];                }                s->a[pos] = x;                s->size++;        }}

5.8顺序表任意位置删除

void SeqListErase(SeqList* s, int pos){        assert(s);        if (s->size == 0)        {                printf("当前顺序表为空,删除失败\n");                exit(1);        }        if (pos<0||pos>s->size-1)        {                printf("要删除的位置不存在\n");                exit(1);        }        else        {                int i = 0;                for (i = pos; i <= s->size - 2; i++)                {                        s->a[i] = s->a[i + 1];                }                s->size--;        }}

六、在线0j练习

一、移除元素(力扣)

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

例一:

输入:nums = [0,1,2,2,3,0,4,2], val = 2 输出:5, nums = [0,1,4,0,3] 解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

思路:用两个指针,一个用来遍历数组,另一个指向你要存数据的地方。

如果可以申请额外的空间的话,一般来说,我们可以这样做:申请一个新的数组空间,用来存放非val值的数据。其实这个新的空间我们可以直接把nums数组原空间直接当做新空间使用,我们只需遍历一遍nums数组即可。

int removeElement(int* nums, int numsSize, int val){    int i = 0;    int j = 0;    for(i=0;i

二、合并两个有序数组(力扣)

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n

例一

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 输出:[1,2,2,3,5,6] 解释:需要合并 [1,2,3] 和 [2,5,6] 。 合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

思路:从后往前放,nums1和nums2中较大的数。(参考一)

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){    int end1 = m-1;    int end2 = n-1;    int k = m + n -1;    while(end1>=0 && end2>=0)    {        if(nums1[end1] >= nums2[end2])        {            nums1[k]=nums1[end1];            k--;            end1--;        }        else        {            nums1[k]=nums2[end2];            k--;            end2--;        }    }    while(end2>=0)    {        nums1[k]=nums2[end2];        k--;        end2--;    }}

以上是"C语言线性表中顺序表的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

顺序 元素 数组 空间 位置 线性 长度 移动 两个 物理 结构 表头 内容 动态 接口 数据 篇文章 静态 存储 输入 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库表中查询条件 京东慧采服务器网卡销量 我想看网络安全手抄报最简单的 承德广东软件开发哪家好 在mysql数据库中如何修改 河北c语言软件开发哪家正规 json数据存储数据库 私人网络服务器哪个好 江西服务器托管云服务器 天津高远网络技术恐龙世界 如何查询手机数据库app 阿里巴巴国际站服务器怎么开 数据库事务提交例子 河北it软件开发高品质的选择 华为V3服务器管理raid 网络技术在企业的应用与发展 大连创瑞网络技术有限公司 远程服务器开启任务管理器 不是每个人都能从事软件开发 信息与网络安全管理证书 国内关于网络安全的研究 小鸿哥软件开发 小白转行网络安全销售 河北c语言软件开发哪家正规 战舰少女台服账号数据库 服务器怎么设置广播ip 数据库显示时间是10位数字 软件开发环境系统 惠普服务器电源固件 美国数据库检索字段
0