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 ...
随机推荐
- Deep Compression Compressing Deep Neural Networks With Pruning, Trained QuantizationAnd Huffman Coding
转载请注明出处: http://www.cnblogs.com/sysuzyq/p/6200613.html by 少侠阿朱
- Swiper滑动Html5手机浏览器自适应
手机网页能通过window.screen.height, width获取屏幕分辨率,于是能够通过分辨率比率来计算高度. window.onload=function(){ var swiper = d ...
- VB中DateDiff 函数解释
VB中DateDiff 函数使用方法 DateDiff (interval, Date1 , Date2[,firstweekofyear[,firstweekofyear]]) 返回一个Varia ...
- js获取某个标签中的信息
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- 传输中文乱码js解决方法
encodeURI要编码两次 var a="我的"; //编译两次 //window.location.href = "http://127.0.0.1:8080/kab ...
- Java中的编码格式
Java中的编码 gbk编码 中文占用2个字节,英文占1个字节; utf-8编码 中文占用3个字节.,英文占用1个字节; Java是双字节编码 (utf-16be) utf -16be 中文占2个字节 ...
- oracle 10g 数据库字符集更改
1.更改数据库字符集为GBK SHUTDOWN IMMEDIATE; STARTUP MOUNT EXCLUSIVE; ALTER SYSTEM ENABLE RESTRICTED SESSION;A ...
- C++菱形继承的构造函数
网上搜了很多,大多是关于菱形虚继承的构造函数应该怎么写,或者就是最简单的,四个类都不带参数的构造函数. 本文旨在记录一下困扰了博主1h的问题,非常浅显,有帮助固然好,如果侮辱谁的智商还见谅,当然无限欢 ...
- ASP.NET中多个相同name的控件在后台正确取值
有兽, 页面上可能有多个相同name的Html表单控件, 一般在后台使用Request.Form[“name”]取值,并用‘,’分隔. 但是当值中包含逗号时, 取值就会出现异常, ...
- VB短信猫开发包,支持超长短信
一.短信猫开发包(长短信/异步调用)说明: 短信猫开发包以OCX控件的形式提供,支持Windows平台下常用的开发工具:如VB.VB.net.VC++.Power Builder.C#.DELPH ...