#ifndef _DATA_STRUCTURE_SEQLIST_H_
#define _DATA_STRUCTURE_SEQLIST_H_
#include<iostream>
#include<string>
#define MAXSIZE 100 //【0】定义线性表的最大长度
typedef struct //【1】定义顺序表【节点的数据的数据类型】【自定义数据类型】
{
char strKey[15];
char strName[20];
int iAge;
}DATA;
typedef struct //【2】定义【顺序表】结构,此时,这个顺序表就是一个【数据类型】,和基本型一致
{
DATA listData[MAXSIZE]; //【1】存储顺序表数据的静态数组
int iListLength; //【2】顺序表的长度,顺序表中实际存储数据元素的个数
}SeqList;
/*************************************************************************************************************************************
模块说明:
顺序表的八大基本操作
*************************************************************************************************************************************/
void SeqListInit(SeqList* SL); //【1】顺序表的初始化操作。构造一个空的线性表
int SeqListLength(SeqList* SL); //【2】求表的长度
int SeqListInsert(SeqList* SL,int pos,DATA data); //【3】在顺序表SL的第pos的索引位置插入一个数据元素data
int SeqListDelete(SeqList* SL,int pos); //【4】删除顺序表中的第pos个位置上的数据元素
int SeqListLocate(SeqList* SL,char* key); //【5】按关键字进行查找
DATA* SeqListGet(SeqList* SL,int pos); //【6】按序号返回元素
bool IsEmpty(SeqList* SL); //【7】判空
#endif // !_DATA_STRUCTURE_SEQLIST_H_
#include"SeqList.h"
/***********************************************************************************************************
函数说明:
初始化顺序表为空表
***********************************************************************************************************/
void SeqListInit(SeqList* SL)
{
SL->iListLength = 0;
}
/***********************************************************************************************************
函数说明:
求解顺序表的长度,顺序表中实际存储数据元素的个数
***********************************************************************************************************/
int SeqListLength(SeqList* SL)
{
return SL->iListLength;
}
/***********************************************************************************************************
函数说明:
判断顺序表是否为空
***********************************************************************************************************/
bool IsEmpty(SeqList* SL)
{
if (SL->iListLength == 0)
{
return true;
}
else
{
false;
}
}
/***********************************************************************************************************
函数说明:
顺序表的插入操作
操作步骤:
[1]插入先判满,并且判断插入的位置是否正确
[2]向后移动数据元素
[3]插入
[4]表长加1
***********************************************************************************************************/
int SeqListInsert(SeqList* SL, int pos, DATA data)
{
if (SL->iListLength >= MAXSIZE)
{
std::cout << "[NOTICE]当前存储空间已满,不能插入新的数据!" << std::endl;
#ifdef DEBUG
std::system("pause");
#else
return 0;
#endif // DEBUG
}//if
if (pos<0 || pos>SL->iListLength)
{
std::cout <<"[NOTICE]插入节点的位置不正确!" << std::endl;
#ifdef DEBUG
std::system("pause");
#else
return 0;
#endif // DEBUG
}//if
for (int i = SL->iListLength; i > pos; i--)
{
SL->listData[i] = SL->listData[i-1];
}
SL->listData[pos] = data;
SL->iListLength++;
return 1;
}
/***********************************************************************************************************
函数说明:
顺序表的删除操作
操作步骤:
[1]删除先判空,并且判断删除的位置是否合法
[2]将Apos----Alength-1的元素向前移动
[3]修改表长
***********************************************************************************************************/
int SeqListDelete(SeqList* SL, int pos)
{
if (IsEmpty(SL))
{
std::cout << "[NOTICE]顺序表是空表,不能删除元素!" << std::endl;
#ifdef DEBUG
std::system("pause");
#else
return 0;
#endif // DEBUG
}
if (pos < 1 || pos>SL->iListLength)
{
std::cout <<"[NOTICE]删除的结点有误,不能删除此节点!" << std::endl;
#ifdef DEBUG
std::system("pause");
#else
return 0;
#endif // DEBUG
}
for (int i = pos; i < SL->iListLength; i++)
{
SL->listData[i - 1] = SL->listData[i];
}
SL->iListLength--;
return 1;
}
/***********************************************************************************************************
函数说明:
根据关键字进行查找
***********************************************************************************************************/
int SeqListLocate(SeqList* SL, char* key)
{
for (int i = 0; i < SL->iListLength; i++)
{
if (std::strcmp(SL->listData[i].strKey, key) == 0)
{
return (i+1);
}
}
return 0;
}
/***********************************************************************************************************
函数说明:
根据序号进行查找
***********************************************************************************************************/
DATA* SeqListGet(SeqList* SL, int pos)
{
if (pos<0 || pos>(SL->iListLength - 1))
{
std::cout <<"[NOTICE]查找元素结点的序号是错误的,不能返回节点值!"<< std::endl;
#ifdef DEBUG
std::system("pause");
#else
return 0;
#endif // DEBUG
}
return &(SL->listData[pos]);
}
/***************************************************************************************************************************
文件说明:
【顺序表】的实现代码
详细说明:
[1]线性表示具有【相同数据类型】n(n>=)个数据元素的【有限序列】。
[2]【线性表】是一种逻辑结构,表示元素之间是一对一的相邻关系。【顺序表】和【链表】是一种存储结构。
基本分类:
[1]逻辑结构:
1---一般线性表
2---操作受限的线性表结构:栈、队列、数组、广义表、串
3---树:一般树形结构,二叉树(平衡二叉树,满二叉树,完全二叉树等)
4---图:有向图、无向图
【顺序表】:
[1]【线性表】的【顺序存储】称为【顺序表】,它是用一组【地址连续的存储单元】依次存储线性表中的数据元素,从而使得逻辑
上相邻的存储单元,物理位置上相邻。
[2]【顺序表】是一种可以【随机存储】的数据结构。
[3]【顺序表的缺点】是,在插入和删除操作的时候,需要移动大量的数据元素,这样会严重影响插入和删除操作的效率,由于顺序
表存在这个缺点,所有后面又引出了【线性表的链式存储】结构
运行环境:
Win10+VS2015
时间地点:
陕西师范大学 文津楼 2017 8.18
作 者:
九 月
****************************************************************************************************************************/
#include"SeqList.h"
void SeqListPrint(SeqList* SL)
{
for (int i = 0; i < SL->iListLength; i++)
{
std::cout <<"【"<<i<<"】"<<"<key,name,age> = " << SL->listData[i].strKey <<" "<< SL->listData[i].strName << " " << SL->listData[i].iAge << std::endl;
}
}
int main(int argc,char* argv[])
{
SeqList SL; //【0】定义顺序表数据类型的变量
DATA data;
DATA dataP;
char strKey[15];
SeqListInit(&SL); //【1】初始化顺序表
int i = 0;
while (true)
{
std::cout <<"[NOTICE]输入添加的结点(学号,姓名,年龄):"<<std::endl;
std::cin >> data.strKey;
//std::cout<<std::endl;
std::cin >> data.strName;
//std::cout << std::endl;
std::cin >> data.iAge;
//std::cout << std::endl;
if (data.iAge)
{
if (!SeqListInsert(&SL, i, data))
{
break;
}
}
else
{
break;
}
i++;
}
std::cout << "[NOTICE]显示顺序表中的所有数据!" << std::endl;
SeqListPrint(&SL);
std::system("pause");
return 0;
}