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; }
原文地址:http://9815936.blog.51cto.com/9805936/1639494