#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];//保存顺序表的结构数组
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[n]=data;//插入节点
SL->ListLen++;//顺序表节点数量增加1
return 1;//成功插入返回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=n;i<SL->ListLen;i++)
{
SL->ListData[i]=SL->ListData[i+1];
}
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;
}
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)//若年龄不为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)\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)//若节点指针不为NULL
{
printf("第%d个节点为:(%s,%s,%d)\n",i,pdata->key,pdata->name,pdata->age);
}
getch();
return 0;
}
顺序表
最新推荐文章于 2024-04-27 10:52:57 发布