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 ------------------------------------*/
2. 顺序表操作测试
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;
}