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

简介: C/C++常用算法【C语言顺序查找(顺序表)】【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;
}


image.png

目录
相关文章
|
1月前
|
安全 编译器 C语言
C++入门1——从C语言到C++的过渡
C++入门1——从C语言到C++的过渡
59 2
|
22天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
22天前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
56 3
|
22天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明
|
1月前
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
470 0
高精度算法(加、减、乘、除,使用c++实现)
|
1月前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
20 2
|
1月前
|
C语言
链式顺序表实现(C语言描述)
本文介绍了如何在C语言中实现链式顺序表,包括数据结构的定义、节点的创建、数据的插入和删除以及链表的打印和销毁。
39 2
|
1月前
|
C语言
顺序表数组法构建(C语言描述)
如何使用C语言通过数组方法构建有序顺序表,包括顺序表的创建、插入、删除和打印等。
20 2
|
1月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
23 0
|
1月前
|
算法
【顺序表】算法题 --- 力扣
【顺序表】算法题 --- 力扣
下一篇
无影云桌面