1. 顺序表结构和操作定义
SeqList.h
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; #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); //功能:遍历顺序表 /*----------------------------------函数实现 start ------------------------------------*/ //功能:初始化顺序表 void SeqListInit(SeqListType *SL){ SL->ListLen = 0; } //功能:求顺序表长度 int SeqListLength(SeqListType *SL){ return SL->ListLen; } //功能:添加元素 int SeqListAdd(SeqListType *SL, DATA data){ if(SL->ListLen >= MAXSIZE){ printf("顺序表已满,不能再添加元素!"); return 0; } SL->ListData[++SL->ListLen] = data; //保存数据到顺序表最后 return 1; } //功能:在指定位置插入元素 int SeqListInsert(SeqListType *SL, int n, DATA data){ if(SL->ListLen >= MAXSIZE){ printf("顺序表已满,不能再插入数据!"); return 0; } if(n<1 || n>SL->ListLen){ printf("插入位置不合适!"); return 0; } for(int 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){ if(n<1 || n>SL->ListLen){ printf("删除节点序号不正确,无法执行删除操作!!\n"); return 0; } for(int i=n; i< SL->ListLen; i++) SL->ListData[i] = SL->ListData[i+1]; SL->ListLen--; printf("成功删除节点!\n"); return 1; } //功能:按序号查找节点 DATA *SeqListFindByNum(SeqListType *SL, int n){ if(n<1 || n>SL->ListLen){ printf("节点序号超出了顺序表范围,无法执行查找操作!!\n"); return NULL; } return &(SL->ListData[n]); } //功能:按关键字查找节点 int SeqListFindByCont(SeqListType *SL, char *key){ for(int i=1; i<=SL->ListLen; i++) if(strcmp(SL->ListData[i].key, key)==0) return i; return 0; } /*----------------------------------函数实现 end ------------------------------------*/
SeqListTest.cpp
#include<stdio.h> #include <conio.h> #include<iostream> using namespace std; typedef struct{ char key[15]; char name[20]; int age; }DATA; #include "SeqList.h" //功能:遍历顺序表元素 int SeqListAll(SeqListType *SL){ for(int 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 select; int len, num; char key[15]; DATA data, *data1; SeqListType SL; do{ printf("---------------------------\n"); printf("1.初始化顺序表 2.获取顺序表元素数量\n"); printf("3.在顺序表末尾添加元素 4.在顺序表指定位置插入元素\n"); printf("5.删除指定位置的数据 6.返回指定位置的元素\n"); printf("7.按关键字查找 8.遍历顺序表\n"); printf("0.退出\n"); printf("请选择执行的操作序号:"); //select = getch(); fflush(stdin); scanf("%d", &select); switch(select){ case 1: printf("开始初始化顺序表\n"); SeqListInit(&SL); printf("初始化顺序表结束\n"); break; case 2: len = SeqListLength(&SL); printf("顺序表包括%d个元素!\n", len); break; case 3: printf("请输入添加的节点(学号 姓名 年龄):"); fflush(stdin); scanf("%s %s %d", &data.key, &data.name, &data.age); SeqListAdd(&SL, data); break; case 4: printf("请输入插入位置:"); fflush(stdin); scanf("%d", &num); printf("请输入添加的节点(学号 姓名 年龄):"); fflush(stdin); scanf("%s %s %d", &data.key, &data.name, &data.age); SeqListInsert(&SL, num, data); break; case 5: printf("请输入删除节点的序号:"); fflush(stdin); scanf("%d", &num); SeqListDelete(&SL, num); break; case 6: printf("请输入要取出节点的序号:"); fflush(stdin); scanf("%d", &num); data1 = SeqListFindByNum(&SL, num); if(data1) printf("取出的第%d个节点为:(%s,%s,%d)\n", num, data1->key, data1->name, data1->age); break; case 7: printf("请输入要茶轴节点的关键字:"); fflush(stdin); scanf("%s", key); num = SeqListFindByCont(&SL, key); printf("所查元素是第%d个节点\n", num); break; case 8: printf("顺序表遍历结果为:\n"); SeqListAll(&SL); break; } }while(select != 0); system("pause"); return 0; }