【Data_Structure笔记1】线性表的顺序存储【顺序表】

#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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值