前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C/C++常用算法【C语言顺序查找(顺序表)】【2】

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

作者头像
谙忆
发布于 2021-01-20 08:04:19
发布于 2021-01-20 08:04:19
1.1K00
代码可运行
举报
文章被收录于专栏:程序编程之旅程序编程之旅
运行总次数:0
代码可运行

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015/12/11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
线性表之顺序表(C语言实现)
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串等… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储.
初阶牛
2023/05/03
8890
线性表之顺序表(C语言实现)
动态顺序表的增删查改(C语言实现)
动态顺序表 准备工作 检查,扩容 头插头删,尾插尾删 顺序表查找 顺序表打印 在指定位置插入和删除x 完整版顺序表 准备工作 我们还是分一个头文件和两个源文件 sequence.h sequence.c test.c sequence.h #include <stdio.h> typedef struct Sequence_List { int* p;//顺序表的初始地址 int count;//元素数量 int capacity;//容量 }SL;//顺序表的动态储存 sequence.c
有礼貌的灰绅士
2023/03/28
6100
动态顺序表的增删查改(C语言实现)
数据结构初步(三)- 线性表之顺序表的分析与C语言实现
考虑到当pos == psl->size时是在顺序表尾部插入数据虽然是特殊情况,但是插入数据后其与前面的数据仍是连续的,所以这种情况时可以进行数据的插入。
怠惰的未禾
2023/04/27
4640
数据结构初步(三)- 线性表之顺序表的分析与C语言实现
【数据结构】C语言实现顺序表万字详解(附完整运行代码)
要编写一个顺序表项目,首先要明确我们想要达到的效果是什么样,下面我将用vs2022编译器来为大家演示一下顺序表运行时的样子:
修修修也
2024/04/01
6340
【数据结构】C语言实现顺序表万字详解(附完整运行代码)
【C语言入门数据结构】顺序表
前言:继【时间复杂度和空间复杂】度之后,本章我们来介绍数据结构中的顺序表和链表,若觉得文章不错,希望支持一下博主👍,如果发现有问题也欢迎❀大家在评论区指正。
阿伟@t
2023/10/10
2560
【C语言入门数据结构】顺序表
顺序表的应用——通讯录的创建
小编在前文写了关于顺序表的内容,但是顺序表并不局限于小编写的那个,顺序表的应用是很广泛的,下面小编开始讲述顺序表的应用,顺序表的实现。
用户11295429
2024/10/16
590
顺序表的应用——通讯录的创建
C语言实现线性表的顺序表示
#define MAXSIZE 100 宏定义顺序表的最大存储量,更方便改顺序表的存储大小,耦合性低。
忆想不到的晖
2020/07/15
2.1K0
C语言实现线性表的顺序表示
【数据结构】—— 顺序表的实现与优化:空间管理与增容策略
顺序表(Sequential List)是一种线性数据结构,它使用一段连续的内存空间来存储数据元素,通常以数组的形式存储。顺序表的优点在于可以通过索引快速访问任意元素,时间复杂度为O(1)。但是,顺序表也有它的缺点,尤其是在元素的插入和删除时,因为它可能需要移动大量元素,导致时间复杂度达到O(N)。
用户11286421
2025/01/20
530
数据结构【顺序表】
线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中⼴泛使⽤的 数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串...
逆向-落叶
2024/10/28
1240
数据结构【顺序表】
基于静态顺序表实现通讯录
我们需要根据菜单里面的选项来选择进行我们需要实现的功能,比如我们想添加联系人,我们就输入1就会进行用户假如的操作,我们想退出程序我们输入0就可以退出。可以利用switch选择语句来实现各自的功能。
走在努力路上的自己
2024/01/26
1530
基于静态顺序表实现通讯录
【数据结构】顺序表和链表详解&&顺序表和链表的实现
线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串..
用户10925563
2024/06/04
2070
【数据结构】顺序表和链表详解&&顺序表和链表的实现
顺序表示的线性表——顺序表
一、定义 线性表是由n个类型相同的数据元素组成的有限序列,记为(a1,a2,...,ai-1,ai,ai+1,...,an)。 二、特点 逻辑上相邻的元素,在物理上也相邻。只要确定了第一个元素的起始位置,线性表的任一元素都可以随机存取,因此,线性表的顺序存储结构是一种随机存取的存储结构。 三、存储结构 #define ListSize 100 typedef struct { DataType list[ListSize]; //DataType表示数据类型,list用于存储线性表中的数据元素
Zoctopus
2018/06/04
9630
c语言数据结构与算法--简单实现线性表(顺序表+链表)的插入与删除
线性表是由n个数据元素组成的有限序列,每个元素都有唯一的下标,下标从0开始递增。线性表的元素之间存在一对一的线性关系,即除首元素外,每个元素有且只有一个前驱元素,除尾元素外,每个元素有且只有一个后继元素。线性表可以通过顺序存储或链式存储来实现。线性表的基本操作包括初始化、创建、增加、删除和查找等。
用户11404404
2024/12/13
1200
c语言数据结构与算法--简单实现线性表(顺序表+链表)的插入与删除
顺序表的应用
这里我们想把 SL 换成 Contact,这样看上去更好理解,所以就要 typedef struct SeqList Contact; ,但是要使用struct SeqList 就要 #include “SeqList.h” ,但是这样会出现一个问题:
waves浪游
2024/04/14
710
顺序表的应用
通讯录----顺序表版本
对于通讯录,我们做的无非就是初始化,销毁。添加联系人数据,修改联系人数据,删除联系人数据,查找联系人数据,展示联系人数据;
阑梦清川
2025/02/24
330
通讯录----顺序表版本
数据结构之顺序表(C语言版)
GG Bond1
2024/06/14
1170
关于顺序表的C语言实现
严蔚敏老师的教材里用到引用传值,纯C语言无法实现,只能用CPP文件去编译,为此,特意将引用传值改为了指针作为参数。上例实现了创建、初始化、插入的封装。
休辞醉倒
2019/07/23
1.6K0
【实现报告】学生信息管理系统(顺序表)
(2) 程序要具有一定的健壮性,即当输入数据非法时,程序也能适当地做出反应,如插入删除时指定的位置不对等等。
走在努力路上的自己
2024/04/02
3390
【实现报告】学生信息管理系统(顺序表)
用c语言实现顺序表_顺序表代码讲解以及实现
1、 创建顺序表 2、 按数值查找 3、 按位置查找 4、 插一个数值 5、 删一个数值 6、 销毁顺序表 7、 求前驱算法 8、 求后继算法
全栈程序员站长
2022/11/15
1.9K0
【数据结构】线性表(一)线性表的定义及其基本操作(顺序表插入、删除、查找、修改)
② 当n=1时,线性表中仅有一个结点,该结点既是表头(head),又是表尾(tail);
Qomolangma
2024/07/30
3360
【数据结构】线性表(一)线性表的定义及其基本操作(顺序表插入、删除、查找、修改)
推荐阅读
相关推荐
线性表之顺序表(C语言实现)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文