栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言解决线性表删除给定所有元素含测试源码

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言解决线性表删除给定所有元素含测试源码

文章目录
    • 题目再现
    • 测试效果
    • 解题思路
    • 核心源码
    • 复杂度分析
    • 完整源码
    • 源码跑路
      • i = 0
      • i = 1
      • i = 2
      • i = 3
      • i = 4
      • i = 5 跳出循环!
    • 参考文献
    • 临别赠语

题目再现

设计一个算法,删除顺序表L中所有具有给定值x的元素

测试效果

解题思路

算法用指针i向后继方向逐个检查顺序表中元素,用k记录压缩含x结点以后的后续结点应移动到哪个位置。一趟扫描完成删除顺序表所有含x结点的元素。
按照复合条件判断的短路原则,当L.data[i]==x时不再判++k!=i.算法时间复杂度为O(n).最好情况是序列中没有值等于x的元素或所有元素的值都等于x,不需要移动元素.

核心源码
void deletevalue(SeqList& L,DataType x) {
    int k = -1;
    for(int i =0;i 
复杂度分析 

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

完整源码
#include
#include
#define initSize 100
typedef int DataType;
typedef struct{
    DataType *data;
    int maxSize,n;
}SeqList;


void initList(SeqList& L) {
    //调用方式initList(L),输入:未初始化的顺序表L;输出;已初始化的顺序表L
    L.data = (DataType *) malloc(initSize*sizeof(DataType));
    if(!L.data) {
        printf("分配有误....n");
        exit(1);
    }
    L.maxSize = initSize;
    L.n = 0;
}



void createList(SeqList &L,DataType A[],int n) {
    initList(L);
    for(int i = 0;i 
源码跑路 

假如我们输入的是{5,2,9,2,1},传入删除2按照代码的正常运行结果是{5,9,1}

i = 0

L.data[0] = 5 != 2 && ++(-1) == 0
for循环继续 k = 0

i = 1

L.data[1] == 2
for循环继续 k = 0

i = 2

L.data[2] = 9 != 2 && 1 != 2
L.data[1] = L.data[2]
这里已经发生前移,本质上利用了i和k的差值进行赋值
for循环继续 k=1

i = 3

L.data[3]=2 == 2
for 循环继续 k=1

i = 4

L.data[4] = 1 != 2 && 2 != 4
L.data[2] = L.data[4]
for 循环继续 k = 2

i = 5 跳出循环! 参考文献

殷人昆著.数据结构与算法解析.北京:清华大学出版社,2021.4

临别赠语

挺巧妙的一个算法,利用了彼此的差值,进行赋值!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/304289.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号