数据结构 c语言实现 顺序表(Sequential List)
本系列日志为操作练习代码,参考书《C/C++常用算法手册 》。
//顺序表 Sequential List
#include<stdio.h>
#include<string.h>
#define MAXLEN 100 //定义顺序表的最大长度typedef struct //定义节点类型
{
char key[10]; //节点的关键字
char name[20];
int age;
}DATA;typedef struct //定义顺序表结构
{
DATA ListData[MAXLEN+1]; //保存顺序表的结构数组,从下标1开始记录数据节点,下标0位置不使用
int ListLen; //顺序表已存节点数量
}SLType;void SLInit(SLType *SL) //初始化顺序表
{
SL->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;
}
if(n<1||n>SL->ListLen-1)
{
printf("插入元素序号错误,不能插入!\n");
return 0;
}
for(i=SL->ListLen;i>=n;i--) //顺序表节点后移
{
SL->ListData[i+1]=SL->ListData[i];
}
SL->ListData[i]=data;
SL->ListLen++;
return 1;
}int SLAdd(SLType *SL,DATA data) //追加节点
{
if(SL->ListLen>=MAXLEN)
{
printf("顺序表已满,不能插入节点!\n");
return 0;
}
SL->ListData[++SL->ListLen]=data;
return 1;
}int SLDelete(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--;
return 1;
}DATA *SLFindByNum(SLType *SL,int n) //按序号查找节点
{
if(n<1||n>SL->ListLen+1)
{
printf("节点序号错误,不能返回节点!\n");
return NULL;
}
return &(SL->ListData[n]);
}int SLFindByCont(SLType *SL,char *key) //按关键字查找节点
{
int i;
for(i=1;i<SL->ListLen;i++)
{
if(strcmp(SL->ListData[i].key,key)==0)
{
return 1;
}
}
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");do{
printf("输入添加的节点(学号 姓名 年龄):");
fflush(stdin);
scanf("%s%s%d",&data.key,&data.name,&data.age);
if(data.age)
{
if(!SLAdd(&SL,data))
{
break;
}
}
else
{
break;
}
}while(1);
printf("\n顺序表中的节点顺序为:\n");
SLAll(&SL);
fflush(stdin);
printf("\n要取出节点的序号:");
scanf("%d",&i);
pdata=SLFindByNum(&SL,i);
if(pdata)
{
printf("第%d个节点为:(%s,%s,%d)\n",i,pdata->key,pdata->name,pdata->age);
}
fflush(stdin);
printf("\n输入要查找的关键字:");
scanf("%s",key);
i=SLFindByCont(&SL,key);
pdata=SLFindByNum(&SL,i);
if(pdata)
{
printf("第%d个节点为:(%s,%s,%d)\n",i,pdata->key,pdata->name,pdata->age);
}
printf("\n输入要删除的节点序号:");
scanf("%d",&i);
SLDelete(&SL,i);
SLAll(&SL);
getchar();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端