C++中如何建立一个顺序表
准备数据
#define MAXLEN 100 //定义顺序表的最大长度
struct DATA
{
char key[10]; //结点的关键字
char name[20];
int age;
};
struct SLType //定义顺序表结构
{
DATA ListData[MAXLEN+1];//保存顺序表的结构数组
int ListLen; //顺序表已存结点的数量
};
定义了顺序表的最大长度MAXLEN、顺序表数据元素的类型DATA以及顺序表的数据结构SLType。
在数据结构SLType中,Listen为顺序表已存结点的数量,也就是当前顺序表的长度,ListData是一个结构数组,用来存放各个数据结点。
我们认为该顺序表是一个班级学生的记录。其中,key为学号,name为学生的名称,age为年龄。
因为数组都是从下标0开始的,为了使用方便,我们从下标1开始记录数据结点,下标0的位置不可用。
初始化顺序表
void SLInit(SLType * SL) //初始化顺序表
{
SL->Listlen=0;
}
计算线性表的长度
int SLLenght(SLType *SL)
{
return(SL->ListLen); //返回顺序表的元素数量
}
插入结点
int SLInsert(SLType *SL,int n,DATA data)
{
int i;
if(SL->ListLen>=MAXLEN) //顺序表结点数量已超过最大数量
{
cout<<"顺序表已满,不能插入结点!"<<endl;
return 0; //返回0表示插入不成功
}
if(n<1||n>SL->ListLen) //插入结点的序号不合法
{
cout<<"插入序号错误!"<<endl;
return 0;
}
for(i=SL->ListLen;i>=n;i--) //将顺序表中的数据向后移动
{
SL->ListData[i+1]=SL->ListData[i];
}
SL->ListData[n]=data;
SL->ListLen++;
return 1;
}
在程序中首先判断顺序表结点数量时候已超过最大数量,以及插入点的序号是否正确。前面条件都瞒住以后,便将顺序表中的数据向后移动,同时插入结点,并更新结点数量ListLen。
追加结点
int SLAdd(SLType * SL,DATA data)
{
if(SL->ListLen>=MAXLEN)
{
cout<<"顺序表已满,不能再添加结点了!"<<endl;
return 0;
}
SL->ListData[++SL->ListLen]=data;
return 1;
}
删除结点
int SLDelete(SLType *SL,int n) //删除顺序表中的数据元素
{
int i;
if(n<1||n>SL->ListLen) //删除结点的序号不合法
{
cout<<"删除序号错误!"<<endl;
return 0;
}
for(i=n;i<SL->ListLen;i++)//将顺序表中的数据向前移动
{
SL->ListData[i]=SL->ListData[i+1];
}
SL->ListLen--; //顺序表元素数量减1
return 1; //成功删除返回1
}
查找结点
按照序号查找结点
DATA * SLFindByNum(SLType *SL,int n)//根据呼号返回数据元素
{
if(n<1||n>SL->ListLen) //查询结点的序号不合法
{
cout<<"查询序号错误!"<<endl;
return 0;
}
return &(SL->ListData[n]);
}
按照关键字查找结点
int SLFindByCont(SLType * 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
}
显示所有的结点
void SLALL(SLType *SL)
{
int i;
for(i=1;i<SL->ListLen;i++)
{
cout<<"key:"<<SL->ListData[i].key<<endl;
cout<<"name:"<<SL->ListData[i].name<<endl;
cout<<"age:"<<SL->ListData[i].age<<endl;
cout<<"============================="<<endl;
}
}
顺序表操作完整示例:
#include<iostream>
#include<string>
using namespace std;
#define MAXLEN 100 //定义顺序表的最大长度
/**************顺序表的定义部分*****************/
struct DATA
{
string key; //结点的关键字
string name;
int age;
};
struct SLType //定义顺序表结构
{
DATA ListData[MAXLEN+1];//保存顺序表的结构数组
int ListLen; //顺序表已存结点的数量
};
/************顺序表的初始化函数*****************/
void SLInit(SLType * SL) //初始化顺序表
{
SL->ListLen=0;
}
/***********计算线性表的长度*******************/
int SLLenght(SLType *SL)
{
return(SL->ListLen); //返回顺序表的元素数量
}
/*********插入结点*******************************/
int SLInsert(SLType *SL,int n,DATA data)
{
int i;
if(SL->ListLen>=MAXLEN) //顺序表结点数量已超过最大数量
{
cout<<"顺序表已满,不能插入结点!"<<endl;
return 0; //返回0表示插入不成功
}
if(n<1||n>SL->ListLen) //插入结点的序号不合法
{
cout<<"插入序号错误!"<<endl;
return 0;
}
for(i=SL->ListLen;i>=n;i--) //将顺序表中的数据向后移动
{
SL->ListData[i+1]=SL->ListData[i];
}
SL->ListData[n]=data;
SL->ListLen++;
return 1; //成功插入,返回1
}
/***********************追加结点*************************/
int SLAdd(SLType * SL,DATA data)
{
if(SL->ListLen>=MAXLEN)
{
cout<<"顺序表已满,不能再添加结点了!"<<endl;
return 0;
}
SL->ListData[++SL->ListLen]=data;
return 1;
}
/***********************删除结点*************************/
int SLDelete(SLType *SL,int n) //删除顺序表中的数据元素
{
int i;
if(n<1||n>SL->ListLen) //删除结点的序号不合法
{
cout<<"删除序号错误!"<<endl;
return 0;
}
for(i=n;i<SL->ListLen;i++)//将顺序表中的数据向前移动
{
SL->ListData[i]=SL->ListData[i+1];
}
SL->ListLen--; //顺序表元素数量减1
return 1; //成功删除返回1
}
/*******************按照序号查找结点********************/
DATA * SLFindByNum(SLType *SL,int n)//根据序号返回数据元素
{
if(n<1||n>SL->ListLen) //查询结点的序号不合法
{
cout<<"查询序号错误!"<<endl;
return 0;
}
return &(SL->ListData[n]);
}
/*******************按照关键字查找结点********************/
DATA *SLFindByCont(SLType * SL,string name)//按关键字查询结点
{
int i;
for(i=1;i<=SL->ListLen;i++)
{
if(SL->ListData[i].name==name)//如果找到结点
{
return &(SL->ListData[i]);
}
}
return 0; //在整个表中都没有找到,返回0
}
/*******************显示所有的结点********************/
void SLALL(SLType *SL)
{
int i;
for(i=1;i<=SL->ListLen;i++)
{
cout<<"key:"<<SL->ListData[i].key<<",name:"<<SL->ListData[i].name<<",age:"<<SL->ListData[i].age<<endl;
}
}
int main()
{
int i;
SLType SL; //定义顺序表变量
DATA data; //定义结点保存数据类型变量
DATA *pdata;//定义指向结点的指针变量
string name;
cout<<"顺序表操作演示:"<<endl;
SLInit(&SL);//初始化顺序表
do
{ //循环添加结点数据
cout<<"请输入要添加的结点(学号 姓名 年龄):";
cin>>data.key>>data.name>>data.age;
if(data.age) //若年龄不为0
{
if(!SLAdd(&SL,data))//若添加结点失败
{
break; //退出循环
}
}else
{
break;
}
}while(1);
cout<<"顺序表中的结点顺序为:" <<endl;
SLALL(&SL); //显示所有的结点
cout<<"请输入要取出的结点序号:";
cin>>i;
pdata=SLFindByNum(&SL,i);//按序号查找结点
if(pdata)
{
cout<<"第"<<i<<"个结点为:key:"<<pdata->key<<",name:"<<pdata->name<<",age:"<<pdata->age<<endl;
}
cout<<"请输入要查找的姓名:";
cin>>name;
pdata=SLFindByCont(&SL,name);
if(pdata)
{
cout<<"key:"<<pdata->key<<",name:"<<pdata->name<<",age:"<<pdata->age<<endl;
}
cout<<"请输入您要删除的结点的序号:";
cin>>i;
if(SLDelete(&SL,i))
{
cout<<"数据删除成功"<<endl;
SLALL(&SL);
}
cout<<"请输入您要插入的结点的序号:";
cin>>i;
cout<<"请输入第"<<i<<"号结点的key,name,以及age"<<endl;
cin>>data.key>>data.name>>data.age;
if(SLInsert(&SL,i,data))
{
cout<<"插入数据成功"<<endl;
SLALL(&SL);
}
return 0;
}
运行界面:
C++中如何建立一个顺序表的更多相关文章
- 临远大神,你为啥要建立一个 TASK表。HumanTaskDTO
临远大神,你为啥要建立一个 TASK表.HumanTaskDTO HumanTask这张表的作用是什么. 为了实现理想中的任务中心.TaskCenter. 首先,工作流可能会完全不包含任何人工节点,全 ...
- 3、顺序表、内存、类型、python中的list
1.内存.类型本质.连续存储 1.内存本质 2.C 语言实例-计算 int, float, double 和 char 字节大小 使用 sizeof 操作符计算int, float, double 和 ...
- 数据结构学习-数组A[m+n]中依次存放两个线性表(a1,a2···am),(b1,b2···bn),将两个顺序表位置互换
将数组中的两个顺序表位置互换,即将(b1,b2···bn)放到(a1,a2···am)前边. 解法一: 将数组中的全部元素(a1,a2,···am,b1,b2,···bn)原地逆置为(bn,bn-1, ...
- C:数据结构与算法之顺序表
顺序表作为数据结构的开端,说明这里面很多基础要学,初学者一开始都会混淆,今天我们来一步一步来建立一个完整的顺序表,可以任我们控制的顺序表,首先先定义一个顺序表 /* Note:Your choice ...
- 数据结构Java实现01----线性表与顺序表
一.线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素: (2)第一个数据元素没有前驱数据元素: (3)最后一个数据元素没有 ...
- 查找->静态查找表->分块查找(索引顺序表)
文字描述 分块查找又称为索引顺序查找,是顺序查找的一种改进方法.在此查找算法中,除表本身外, 还需要建立一个”索引表”.索引表中包括两项内容:关键字项(其值为该字表内的最大关键字)和指针项(指示该子表 ...
- [Python] 数据结构--实现顺序表、链表、栈和队列
说明: 本文主要展示Python实现的几种常用数据结构:顺序表.链表.栈和队列. 附有实现代码. 来源主要参考网络文章. 一.顺序表 1.顺序表的结构 一个顺序表的完整信息包括两部分,一部分是表中元素 ...
- C语言实现顺序表(顺序存储结构)
顺序表(顺序存储结构)及初始化过程详解 顺序表,全名顺序存储结构,是线性表的一种.通过<线性表>一节的学习我们知道,线性表用于存储逻辑关系为"一对一"的数据,顺序表自然 ...
- c++顺序表基本功能
头文件 #define LIST_MAX_SIZE 5#define LISTINCREMENT 2#include<assert.h>#include<string>temp ...
随机推荐
- 写PPT的方法
这个方法是今天同事的方法,看到他的PPT简洁高效,明了,记下了他的方法: 写文字:写框架,这个框架或者内容可以是word形式的,目的是展示内容 找模板:在搜集到的各种ppt模板中选几个适合自己文字的页 ...
- 免费自学Cocos2d-x3.0final2014原创视频教程(56集)(适用于Cocos2d-x3.1 Cocos2d-x3.2版本号全)
Cocos2d-x3.0final(适用于Cocos2d-x3.1 Cocos2d-x3.2版本号全) 视频播放地址:http://yun.itxdl.cn/course/62 视频下载地址:http ...
- NOT 运算符
NOT运算符不是独立的,它是一个可以放在任何逻辑表达式前面的修饰符,能得到与结果相反的结果.所以,如果一个表达式是真,就会得到假:如果是假,就会得到真.有时测试查找条件的反面更容易.不过,NOT运算符 ...
- MVC 界面开发
1.什么是设计模式 mvc只是其中一种,对某一类具体问题,总结出来的一套最优的解决方案 1.MVC: 1.Model(模型) View(视图) Controller(控制器) 的缩写 M ...
- 调用[[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPad判断设备
将模拟器改为Ipad时,调用[[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPad判断设备是否为Ipad,但程序并 ...
- 1207--ATM自动取款机的实现
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> //提示用户操作 void alert(ch ...
- UIAlertController(警告栏) 自学之初体验
UIAlertController有两种样式 preferredStyle: UIAlertControllerStyleAlert (位于屏幕的中部) UIAlertControllerStyle ...
- CSS网页元素居中
1.水平居中:行内元素解决方案 只需要把行内元素包裹在一个属性display为block的父层元素中,并且把父层元素添加如下属性即可: text-align: center 适用元素:文字,链接,及其 ...
- jQuery对checkbox的各种操作
//注意: 操作checkbox的checked,disabled属性时jquery1.6以前版本用attr,1.6以上(包含)建议用prop //1.根据id获取checkbox $("# ...
- web.xml中配置log4j
1.将 commons-logging.jar和 log4j.jar加入你的项目中:2.在src/下创建log4j.properties|log4j.xml文件:3.在web.xml中配置log4j的 ...