Seqlish.h
#include<stdio.h>
#include<string.h>
#define MAXSIZE 100 //定义线性表的最大长度
typedef struct //定义顺序表结构
{
DATA ListData [MAXSIZE+1];//保存顺序表的数组
int ListLen; // 顺序表已存节点 的数量
} SeqListType;
void SeqListInit (SeqListType *SL); // 初始化顺序表
int SeqListLength(SeqListType *SL); // 返回顺序表的元素 数量
int SeqListAdd(SeqListType *SL, DATA data); // 向顺序表中添加元素
int SeqListInsert (SeqListType *SL , int n , DATA data);// 向顺序表中插入元素
int SeqListDelete(SeqListType *SL, int n); // 删除顺序表中的元素
DATA *SeqListFindByNum(SeqListType *SL,int n);//根据序号返回元素
int SeqListFindByCont(SeqListType *SL, char *key);//按关键字查找
int SeqListAll(SeqListType *SL);//遍历顺序表中的内容
Seqlish.c
void SeqListInit(SeqListType *SL)//初始化顺序表
{
SL->ListLen=0; //初始化时,设置顺序表长度为零0
}
int SeqListLength(SeqListType *SL)//返回顺序表元素的数量
{
return (SL->ListLen);
}
int SeqListAdd(SeqListType *SL,DATA data)//增加元素到顺序表尾部
{
if(SL->ListLen>=MAXSIZE)
{
printf("顺序已满,不能再添加节点了!\n");// 顺序表已满
return 0;
}
SL->ListData[++SL->ListLen]=data;
return 1;
}
int SeqListInsret(SeqListType *SL,int n,DATA data)
{
int i;
if(SL->ListLen>=MAXSIZE) //顺序表节点数量已超过最大数量
{
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++; // 顺序表节点数量增加
return 1; // 返回成功插入
}
int SeqListDelete(SeqListType *SL, int n) // 删除顺序表中数据元素
{
int i;
if(n<1 || n>SL->ListLen+1)
{
printf("删除节点序号错误,不能删除节点!\n");
return 0; // 返回0 , 表示删除不成功
}
for(i=n;i<SL->ListLen;i++) // 将顺序表中元素向前移动
SL->ListData[i]=SL->ListData[i+1];
SL->ListLen--; // 顺序表元素数量减
return 1; // 返回成功删除
}
DATA *SeqListFindByNum(SeqListType *SL , int n) // 根据序号返回数据元素
{
if(n<1 || n>SL->ListLen+1) // 元素序号不正确
{
printf("节点序号错误,不能返回节点!\n");
return NULL; // 返回0 , 表示不成功
}
return &(SL->ListData[n]);
}
int SeqListFindByCont(SeqListType *SL, char *key) // 按关键字查询节点?
{
int i;
for(i=1;i<=SL->ListLen;i++)
if(strcmp(SL->ListData[i].key,key)==0) // 如果找到所需节点
return i; // 返回节点序号
return 0; // 遍历后任没有找到,则返回0
}
SeqlishTest.c
#include<stdio.h>
typedef struct
{
char key[15]; // 节点关键字
char name[20];
int age;
}DATA; // 定义节点类型 , 可定义为整型, 也可定义为结构
#include "Seqlish.h"
#include "Seqlish.c"
int SeqListAll(SeqListType *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);
}
int main()
{
int i;
SeqListType SL; // 定义顺序表变量
DATA data, *data1; //定义节点保存数据类型变量和指针变量
char key[15]; // 保存关键字
SeqListInit(&SL); // 初始化顺序表
do{ // 循环添加节点数量
printf("输入添加的节点(学号 姓名 年龄):");
fflush(stdin); // 清空输入缓存区
scanf("%s%s%d",&data.key,&data.name,&data.age);
if(data.age)
{
if(!SeqListAdd(&SL,data))
break;
}else
break;
}while(1);
printf("\n顺序表中节点的顺序为:\n");
SeqListAll(&SL);
fflush(stdin);
printf("\n要取出节点的序号:");
scanf("%d,&i"); // 输入节点序号
data1 = SeqListFindByNum(&SL,i);
if(data1)
printf("第%d个节点为: (%s,%s,%d)\n",i,data1->key,data1->name,data1->age);
fflush(stdin);
printf("\n 要查找节点的关键字:") ;
scanf("%s",key); // 输入关键字
i=SeqListByCont(&SL,key);
data1 = SeqListFindByNum(&SL,i);
if(data1) //若节点指针不为null
printf("第%d个节点为: (%s,%s,%d)\n",i,data1->key,data1->name,data1->age);
getch();
return 0;
}
转载于:https://blog.51cto.com/9815936/1639494