C/C++常用算法【C语言顺序查找(顺序表)】【2】

简介: 顺序表结构的存储方式非常容易理解,操作也十分方便。但是顺序表结构有如下一些缺点: 1.在插入或者删除结点时,往往需要移动大量的数据。 2.如果表比较大,有时难以分配足够的连续存储空间,往往导致内存分配失败,而无法存储。

顺序表结构的存储方式非常容易理解,操作也十分方便。但是顺序表结构有如下一些缺点:
1.在插入或者删除结点时,往往需要移动大量的数据。
2.如果表比较大,有时难以分配足够的连续存储空间,往往导致内存分配失败,而无法存储。
后面会有链表结构的章节。

直接上代码,代码中有详细注释,请自己领悟

#include <stdio.h>
#include <stdlib.h>

#define MAXLEN 100 //定义顺序表的最大长度

typedef struct {
    char key[10]; //结点的关键字
    char name[20];
    int age;
} DATA;
                  //定义结点类型

typedef struct{  //定义顺序表结构
    DATA ListData[MAXLEN+1]; //保存顺序表的结构数组
    int ListLen;  //顺序表已存结点的数量
} SLType;
/**定义了顺序表的最大长度MAXLEN,顺序表数据元素的类型DATA及顺序表的数据结构SLType。
    在数据结构SLType中,ListLen为顺序表已存结点的数量,也就是当前顺序表的长度,
    ListData是一个结构数组,用来存放各个数据结点。
    在这里可以认为该顺序表是一个班级学生的记录。其中,key为学号,
    name为学生的姓名,age为年龄。
    这里为了便于大家理解,从下标1开始记录数据结点,下标0不用。

**/

//初始化顺序表
void SLInit(SLType *SL){
    SL->ListLen=0;   //初始化为空表
}
/**这里并没有清空一个顺序表,你们可以采用相应的程序代码来清空。
    这里我们只需要简单的将结点数量ListLen设置为0即可,这样如果
    顺序表中原来已有数据,也将会被覆盖,并不影响操作,反而提高
    了处理的速度。
**/

//计算顺序表的长度
int SLLength(SLType *SL){
    return (SL->ListLen);   //返回顺序表的元素数量
}

//插入结点
int SLInsert(SLType *SL,int n,DATA data){
    int i;
    if(SL->ListLen>=MAXLEN){                 //顺序表结点数量已超过最大数量
        printf("顺序表已满,不能插入结点!\n");
        return 0;                       //返回0,表示插入不成功
    }
    if(n<1||n>SL->ListLen-1){  //插入结点序号不对
        printf("插入元素序列错误,不能插入元素!\n");
        return 0;                  //返回0,表示插入不成功
    }
    for(i=SL->ListLen;i>=n;i--){//将顺序表中的数据向后移
        SL->ListData[i+1]=SL->ListData[i];
    }
    SL->ListData[n]=data; //插入结点
    SL->ListLen++;         //顺序表结点数量加1
    return 1;          //成功插入,返回1
}
/**在这里,该程序中首先判断顺序表结点数量是否已超过最大数量,
    以及插入结点序号是否正确。当所有条件都满足后,便将顺序表中n
    之后的元素向后移动,同时插入结点,并更新结点数量ListLen。
**/

//追加结点
int SLAdd(SLType *SL,DATA data){//增加元素到顺序表尾部
    if(SL->ListLen>=MAXLEN){        //顺序表已满
        printf("顺序表已满,不能再添加结点了!\n");
        return 0;
    }
    (SL->ListData[++SL->ListLen])=data; //先自加一
    return 1;
}
/**简单的判断这个顺序表是否已经满了,然后再追加结点,并更新结点数量就可以了。
**/

//删除结点
int SLDeletd(SLType *SL,int n){//删除顺序表中的数据元素
    int i;
    if(n<1||n>SL->ListLen){   //删除结点序号不正确
        printf("删除结点序号错误,不能删除结点!\n");
        return 0;
    }
    for(i=n;i<SL->ListLen;i++){
        SL->ListData[i]=SL->ListData[i+1];
    }
    SL->ListLen--;  //顺序表元素减1
    return 1;
}
//先判断,然后移动结点,最后更新ListLen。

//按照序号查找结点
DATA *SLFindByNum(SLType *SL,int n){
    if(n<1||n>SL->ListLen+1){   //元素序号不正确
        printf("结点序号错误,不能返回结点!\n");
        return NULL;   //不成功,返回0;
    }
    return &(SL->ListData[n]);
}

//按照关键字查找结点(这里用key作为关键字)
int SLFindByCont(SLType *SL,char *key){
    int i;
    for(i=1;i<=SL->ListLen;i++){
        if(strcmp(SL->ListData[i].key,key)==0){//函数返回0,说明这2个字符数组相等
            //如果找到所需结点
            return i;
        }
    }
    return 0;
}

//显示所有的结点
int SLAll(SLType *SL){
    int i;
    for(i=1;i<=SL->ListLen;i++){
        printf("(%s,%s,%d)\n",SL->ListData[i].key,SL->ListData[i].name,SL->ListData[i].age);
    }
    return 0;
}

int main(){
    int i;
    SLType SL; //定义顺序表变量
    DATA data; //定义结点保存数据类型变量
    DATA *pdata;  //定义结点保存指针变量
    char key[10];  //保存关键字


    printf("顺序表操作演示!\n");
    SLInit(&SL);    //初始化顺序表
    printf("...\n");
    printf("初始化顺序表完成!\n");

    do{    //循环添加结点数据
        printf("请输入添加的结点(学号 姓名 年龄):  ");
        fflush(stdin);                              ///清空输入缓存区
        scanf("%s%s%d",&(data.key),&data.name,&data.age);
        if(data.age){  //若年龄不为0,也就是年龄为0时退出循环
            if(!SLAdd(&SL,data)){ //若添加结点失败
                break;
            }
        }else{  //如果年龄为0
            break;  //退出死循环
        }
    }while(1);

    printf("\n顺序表中结点顺序为:\n");
    SLAll(&SL);   //显示所有结点

    fflush(stdin);   //清空缓冲区
    printf("\n请输入要取出的结点的序号: ");
    scanf("%d",&i);
    pdata = SLFindByNum(&SL,i);
    if(pdata){//若返回的结点指针不为NULL
        printf("第%d个结点为:(%s,%s,%d)",i,pdata->key,pdata->name,pdata->age);
    }

    fflush(stdin);
    printf("\n请输入要查找结点的关键字: ");
    scanf("%s",key);
    i=SLFindByCont(&SL,key);
    pdata=SLFindByNum(&SL,i);
    if(pdata){//若返回的结点指针不为NULL
        printf("第%d个结点为:(%s,%s,%d)",i,pdata->key,pdata->name,pdata->age);
    }
    getch();

    return 0;
}

目录
相关文章
|
17天前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
41 1
|
28天前
|
存储 算法 C++
Windows共享文件:探秘C++实现的B树索引算法奇境
在数字化时代,Windows共享文件的高效管理至关重要。B树算法以其自平衡多路搜索特性,在文件索引与存储优化中表现出色。本文探讨B树在Windows共享文件中的应用,通过C++实现具体代码,展示其构建文件索引、优化数据存储的能力,提升文件检索效率。B树通过减少磁盘I/O操作,确保查询高效,为企业和个人提供流畅的文件共享体验。
|
2月前
|
运维 监控 算法
解读 C++ 助力的局域网监控电脑网络连接算法
本文探讨了使用C++语言实现局域网监控电脑中网络连接监控的算法。通过将局域网的拓扑结构建模为图(Graph)数据结构,每台电脑作为顶点,网络连接作为边,可高效管理与监控动态变化的网络连接。文章展示了基于深度优先搜索(DFS)的连通性检测算法,用于判断两节点间是否存在路径,助力故障排查与流量优化。C++的高效性能结合图算法,为保障网络秩序与信息安全提供了坚实基础,未来可进一步优化以应对无线网络等新挑战。
|
2月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
85 15
|
2月前
|
存储 算法 数据处理
公司局域网管理中的哈希表查找优化 C++ 算法探究
在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
|
1月前
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
51 4
|
2月前
|
存储 算法 安全
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
58 8
|
3月前
|
存储 监控 算法
员工屏幕监控系统之 C++ 图像差分算法
在现代企业管理中,员工屏幕监控系统至关重要。本文探讨了其中常用的图像差分算法,该算法通过比较相邻两帧图像的像素差异,检测屏幕内容变化,如应用程序切换等。文中提供了C++实现代码,并介绍了其在实时监控、异常行为检测和数据压缩等方面的应用,展示了其实现简单、效率高的特点。
90 15
|
3月前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
99 12
|
3月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
56 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨