顺序链表的插入删除等操作 C语言

//顺序表的操作
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
//定义表的最大长度
#define MAXLEN 100
//定义结点的关键字
typedef struct  
{
char key[10];
char name[10];
int age;
}DATA;
//定义顺序表的结构
typedef struct  
{
DATA ListData[MAXLEN+1];
//表的长度
int Listlen;
}SLType;
//初始化顺序表
void SLInit(SLType *SL)
{
SL->Listlen=0;
//SL->ListData=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[n]=data;
//插入节点后长度增加1
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+1)
{
printf("删除错误结点,不能删除!\n");
return 0;
}
//删除后顺序表中的数据前移
for(i=0;i<SL->Listlen;i++)
{
SL->ListData[i]=SL->ListData[i++];
}
SL->Listlen--;//元素个数减少1
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 i;
}
//否则就没找到  ?
return 0;
}
//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个结点为:(%d,%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",pdata->key,pdata->name,pdata->age);
getchar();
return 0;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小白学开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值