c++顺序列表,用插入和删除,输入数组顺序表的就地逆置置,

页面导航:
→ 正文内容 建立顺序表
如何在C++中建立一个顺序表
在使用顺序表之前,首先创建一个空的顺序表,也就是初始化顺序表。这里,在程序中只需设置顺序表的结点数量ListLen为0即可。这样,后面需要添加的数据元素将从顺序表的第一个位置存储
准备数据 代码如下:#define MAXLEN 100&//定义顺序表的最大长度struct DATA{&char key[10];&//结点的关键字 &char name[20];&};struct&SLType&//定义顺序表结构 {&DATA ListData[MAXLEN+1];//保存顺序表的结构数组&int ListL&&&//顺序表已存结点的数量 }; 定义了顺序表的最大长度MAXLEN、顺序表数据元素的类型DATA以及顺序表的数据结构SLType。
在数据结构SLType中,Listen为顺序表已存结点的数量,也就是当前顺序表的长度,ListData是一个结构数组,用来存放各个数据结点。
我们认为该顺序表是一个班级学生的记录。其中,key为学号,name为学生的名称,age为年龄。
因为数组都是从下标0开始的,为了使用方便,我们从下标1开始记录数据结点,下标0的位置不可用。
初始化顺序表
在使用顺序表之前,首先创建一个空的顺序表,也就是初始化顺序表。这里,在程序中只需设置顺序表的结点数量ListLen为0即可。这样,后面需要添加的数据元素将从顺序表的第一个位置存储。示例代码: 代码如下:void SLInit(SLType * SL)&//初始化顺序表{&SL-&Listlen=0; } 计算线性表的长度
计算线性表的长度也就是计算线性表中结点的个数,由于我们在SLType中定义了ListLen来表示结点的数量,所以我们只需要获得这个变量的值即可。 代码如下:int SLLenght(SLType *SL){&return(SL-&ListLen);&//返回顺序表的元素数量 } 插入结点
插入节点就是在线性表L的第i个位置上插入一个新的结点,使其后的结点编号依次加1。这时,插入一个新节点之后,线性表L的长度将变为n+1。插入结点操作的难点在于随后的每个结点数据都要向后移动,计算机比较大,示例代码如下: 代码如下:int SLInsert(SLType *SL,int n,DATA data){&&if(SL-&ListLen&=MAXLEN)&//顺序表结点数量已超过最大数量&{&&cout&&"顺序表已满,不能插入结点!"&&&&return 0;&&&//返回0表示插入不成功 &} &if(n&1||n&SL-&ListLen)&//插入结点的序号不合法 &{&&cout&&"插入序号错误!"&&&&return 0;&}&for(i=SL-&ListLi&=n;i--)&//将顺序表中的数据向后移动&{&&SL-&ListData[i+1]=SL-&ListData[i];&}&SL-&ListData[n]=&SL-&ListLen++;&return 1; }在程序中首先判断顺序表结点数量时候已超过最大数量,以及插入点的序号是否正确。前面条件都瞒住以后,便将顺序表中的数据向后移动,同时插入结点,并更新结点数量ListLen。
追加结点就是在顺序表的尾部插入结点,因此不必进行大量数据的移动,代码实现与插入结点相比就要简单的多。 代码如下:int SLAdd(SLType * SL,DATA data){&if(SL-&ListLen&=MAXLEN)&{&&cout&&"顺序表已满,不能再添加结点了!"&&&&return 0;&} &SL-&ListData[++SL-&ListLen]=&return 1;}删除结点
删除结点就是删除线性表L中的第i个结点,使得其后的所有节点编号依次减1.这是,删除一个结点之后,线性表L的长度将变为n-1。删除结点和插入结点类似,都需要进行大量数据的移动。 代码如下:int SLDelete(SLType *SL,int n)&//删除顺序表中的数据元素{&&if(n&1||n&SL-&ListLen)&//删除结点的序号不合法 &{&&cout&&"删除序号错误!"&&&&return 0;&}&for(i=n;i&SL-&ListLi++)//将顺序表中的数据向前移动 &{&&SL-&ListData[i]=SL-&ListData[i+1]; &} &SL-&ListLen--;&&&//顺序表元素数量减1 &return 1;&&&&//成功删除返回1 } 查找结点
查找节点就是在线性表L中查找值为x的结点,并返回该节点在线性表L中的位置。如果在线性表中没有找到值为x的结点,则返回一个错误标志。根据x的类型不同,查找结点可以分为:
按照序号查找结点
对于一个顺序表,序号就是数据元素在数组中的位置,也就是数组的下标标号。按照序号查找结点是顺序表查找结点最常用的方法,这是因为顺序表的存储本身就是一个数组,示例代码如下: 代码如下:DATA * SLFindByNum(SLType *SL,int n)//根据呼号返回数据元素{&if(n&1||n&SL-&ListLen)&&&//查询结点的序号不合法 &{&&cout&&"查询序号错误!"&&&&return 0;&}&return &(SL-&ListData[n]); } 按照关键字查找结点
关键字可以是数据元素中的任意一项。这里以key关键字为例进行介绍,例如,可以通过key查找学生的信息。示例代码如下: 代码如下:int SLFindByCont(SLType * SL,char *key)//按关键字查询结点 {&&for(i=1;i&=SL-&ListLi++)&{&&if(strcmp(SL-&ListData[i].key,key)==0)//如果找到结点 &&{&&&&&}&}&return 0;&&&&&&//在整个表中都没有找到,返回0 } 显示所有的结点
示例代码如下: 代码如下:void SLALL(SLType *SL){&&for(i=1;i&SL-&ListLi++)&{&&cout&&"key:"&&SL-&ListData[i].key&&&&cout&&"name:"&&SL-&ListData[i].name&&&&cout&&"age:"&&SL-&ListData[i].age&&&&cout&&"============================="&& &}} 顺序表操作完整示例:
基本上就是把上面的函数放到一块,集中展示了一下功能,代码有些长,请耐心阅读^.^ 代码如下:#include&iostream&#include&string&#define MAXLEN 100&//定义顺序表的最大长度/**************顺序表的定义部分*****************/ struct DATA{&&//结点的关键字 &string&&};struct&SLType&//定义顺序表结构 {&DATA ListData[MAXLEN+1];//保存顺序表的结构数组&int ListL&&&//顺序表已存结点的数量 }; /************顺序表的初始化函数*****************/ void SLInit(SLType * SL)&//初始化顺序表{&SL-&ListLen=0; } /***********计算线性表的长度*******************/int SLLenght(SLType *SL){&return(SL-&ListLen);&//返回顺序表的元素数量 } /*********插入结点*******************************/int SLInsert(SLType *SL,int n,DATA data){&&if(SL-&ListLen&=MAXLEN)&//顺序表结点数量已超过最大数量&{&&cout&&"顺序表已满,不能插入结点!"&&&&return 0;&&&//返回0表示插入不成功 &} &if(n&1||n&SL-&ListLen)&//插入结点的序号不合法 &{&&cout&&"插入序号错误!"&&&&return 0;&}&for(i=SL-&ListLi&=n;i--)&//将顺序表中的数据向后移动&{&&SL-&ListData[i+1]=SL-&ListData[i];&}&SL-&ListData[n]=&SL-&ListLen++;&return 1; &&&&//成功插入,返回1 }/***********************追加结点*************************/ int SLAdd(SLType * SL,DATA data){&if(SL-&ListLen&=MAXLEN)&{&&cout&&"顺序表已满,不能再添加结点了!"&&&&return 0;&} &SL-&ListData[++SL-&ListLen]=&return 1;}/***********************删除结点*************************/ int SLDelete(SLType *SL,int n)&//删除顺序表中的数据元素{&&if(n&1||n&SL-&ListLen)&//删除结点的序号不合法 &{&&cout&&"删除序号错误!"&&&&return 0;&}&for(i=n;i&SL-&ListLi++)//将顺序表中的数据向前移动 &{&&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&&"查询序号错误!"&&&&return 0;&}&return &(SL-&ListData[n]); } /*******************按照关键字查找结点********************/DATA *SLFindByCont(SLType * SL,string name)//按关键字查询结点 {&&for(i=1;i&=SL-&ListLi++)&{&&if(SL-&ListData[i].name==name)//如果找到结点 &&{&&&return &(SL-&ListData[i]);&&}&}&return 0;&&&&&&//在整个表中都没有找到,返回0 } /*******************显示所有的结点********************/void SLALL(SLType *SL){&&for(i=1;i&=SL-&ListLi++)&{&&cout&&"key:"&&SL-&ListData[i].key&&",name:"&&SL-&ListData[i].name&&",age:"&&SL-&ListData[i].age&&&}} int main(){&&SLType SL;&//定义顺序表变量 &DATA&//定义结点保存数据类型变量 &DATA *//定义指向结点的指针变量&&cout&&"顺序表操作演示:"&&&SLInit(&SL);//初始化顺序表&do&{&//循环添加结点数据 &&cout&&"请输入要添加的结点(学号 姓名 年龄):";&&cin&&data.key&&data.name&&data.&&if(data.age)&&//若年龄不为0&&{&&&if(!SLAdd(&SL,data))//若添加结点失败 &&&{&&&&&&&//退出循环 &&&}&&}else&&{&&&&&} &}while(1);&cout&&"顺序表中的结点顺序为:" &&&SLALL(&SL);&&&&//显示所有的结点&cout&&"请输入要取出的结点序号:";&cin&&i;&pdata=SLFindByNum(&SL,i);//按序号查找结点&if(pdata)&{&&cout&&"第"&&i&&"个结点为:key:"&&pdata-&key&&",name:"&&pdata-&name&&",age:"&&pdata-&age&&&} &cout&&"请输入要查找的姓名:";&cin&&&pdata=SLFindByCont(&SL,name);&if(pdata)&{&&cout&&"key:"&&pdata-&key&&",name:"&&pdata-&name&&",age:"&&pdata-&age&&&} &cout&&"请输入您要删除的结点的序号:";&cin&&i;&if(SLDelete(&SL,i))&{&&cout&&"数据删除成功"&&&&SLALL(&SL);&&}&cout&&"请输入您要插入的结点的序号:";&cin&&i;&cout&&"请输入第"&&i&&"号结点的key,name,以及age"&&&cin&&data.key&&data.name&&data.&if(SLInsert(&SL,i,data))&{&&cout&&"插入数据成功"&&&&SLALL(&SL);&&} &return 0;}运行界面:
上一篇:下一篇:
最 近 更 新
热 点 排 行
12345678910页面导航:
→ 正文内容 数组排序
C++实现数组的排序/插入重新排序/以及逆置操作详解
将新的数字与已经排序好的数组中的数字一一比较,直到找到插入点,然后将插入点以后的数字都向后移动一个单位(a[i+1]=a[i]),然后将数据插入即可
插入新的数字重新排序分析:将新的数字与已经排序好的数组中的数字一一比较,直到找到插入点,然后将插入点以后的数字都向后移动一个单位(a[i+1]=a[i]),然后将数据插入即可。
代码: 代码如下:#include&iostream&int main(){&int a[12];//定义用于存储数字的数组 &//输入的新的数字 &int i=0,j=0,k=0;//排序用到的变量 &cout&&"please input ten integers:"&&&for(i=1;i&=10;i++){&&cin&&a[i];&} //输入数据 &for(i=1;i&10;i++){&&&& k=i;&&for(j=i+1;j&=10;j++){&&&if(a[j]&a[k]){&&&&& k=j;&&&&}&&}&&a[0]=a[i];&&a[i]=a[k];&&a[k]=a[0];&} &cout&&"sorting order:"&&&for(i=1;i&=10;i++){&&cout&&a[i]&&"&& ";&} //输出数据 &cout&&&cout&&"please input a new one:";&cin&&n;&for(i=1;i&=10;i++){&&if(a[i]&n){&&&k=n;&&&for(j=10;j&=i;j--){&&&&a[j+1]=a[j];&&&}&&&a[i]=n;&&&&&}&}&cout&&"new sorting order:"&&&for(i=1;i&=11;i++){&&cout&&a[i]&&"&& ";&} //输出数据 &cout&&&&return 0;} 将已经排好序的数组中的数据逆置:
分析:实现顺序的逆置,需要找到数组中的中间的数组,以该数字作为中间点,对应的两边的数字交换即可。 代码如下:#include&iostream&int main(){&int a[11];//定义用于存储数字的数组 &int i=0,j=0,k=0;//排序用到的变量 &cout&&"please input ten integers:"&&&for(i=1;i&=10;i++){&&cin&&a[i];&} //输入数据 &for(i=1;i&10;i++){&&&& k=i;&&for(j=i+1;j&=10;j++){&&&if(a[j]&a[k]){&&&&& k=j;&&&&}&&}&&a[0]=a[i];&&a[i]=a[k];&&a[k]=a[0];&} &cout&&"sorting order:"&&&for(i=1;i&=10;i++){&&cout&&a[i]&&"&& ";&} //输出数据 &cout&&&cout&&"Reverse order:"&&&i=10;&for(j=1;j&=(i/2);j++){&&a[0]=a[j];&&a[j]=a[i+1-j];&&a[i+1-j]=a[0];&}&for(i=1;i&=10;i++){&&cout&&a[i]&&"&& ";&} //输出数据 &cout&&&&return 0;} 还有一种方法就是,在建立一个数组,直接在赋值过程中完成逆置,即: 代码如下:&PRE class=cpp name="code"&#include&iostream&int main(){&int a[11];//定义用于存储数字的数组&&/PRE&&PRE class=cpp name="code"&&&&&&&& int b[11];&int i=0,j=0,k=0;//排序用到的变量 &cout&&"please input ten integers:"&&&for(i=1;i&=10;i++){&&cin&&a[i];&} //输入数据 &for(i=1;i&10;i++){&&&& k=i;&&for(j=i+1;j&=10;j++){&&&if(a[j]&a[k]){&&&&& k=j;&&&&}&&}&&a[0]=a[i];&&a[i]=a[k];&&a[k]=a[0];&} &cout&&"sorting order:"&&&for(i=1;i&=10;i++){&&cout&&a[i]&&"&& ";&} //输出数据 &cout&&&cout&&"Reverse order:"&&&i=10;&for(j=1;j&=i;j++){&/PRE&&PRE class=cpp name="code"&&&&&&&&&&&&& b[j]=a[i+1-j];&}&for(i=1;i&=10;i++){&&cout&&b[i]&&"&& ";&} //输出数据 &cout&&&&return 0;} &/PRE&&BR&该方法与上面的方法相比,数据的计算步骤减少了,但是增加了系统空间的开销&DIV&&IMG alt="" src="&img src="http://files.jb51.net/file_images/article/.jpg" alt="" /&"&&/DIV&&PRE&&/PRE&
您可能感兴趣的文章:
上一篇:下一篇:
最 近 更 新
热 点 排 行
12345678910C++线性表插入删除问题_百度知道
C++线性表插入删除问题
length-1]; }bool ListInsert_Sq(SqList &L; 1 || i &),&i).length-i-1]; inverse(sq).
L:顺序表(2!&quot.length-i-1]=t,45;
printf(&for(j=0;
L;);2.length. elem=%d&void inverse(SqList
&L){ =L;%d&}bool ListDelete_Sq(SqList &L;
printf(&n&quot.length))
printf(&quot,e);p=&L; i&lt。要求不重新开辟顺序表空间,&e).h&gt,*q;);display_Sq(sq), ElemType e) {
L;=10;),逆置后为(34;#include &return
true.listsize) {
newbase=(ElemType*)realloc(L.elem,34).elem[i-1]);
L.length-1],45,e)!&quot,7;%d &;请输入要删除的元素的位置;i&lt,L;
L;overflow.h&gt,i;);i++) {
printf(&quot.listsize= LIST_INIT_SIZE, int i.elem[i];}*q=e;i++)
printf(&}--L;j++){ *p=*(p-1);i&=L! L.elem[L; for(i=0,将e插入到第i个元素的位置:&quot,45; return 0,表长增1*/逆置后的元素序列为;#define
LIST_INIT_SIZE 100#define
LISTINCREAMENT 10typedef int ElemT
scanf(&typedef
ElemType * 1) || (i &for(i=0;q=&L;逆置前的元素序列为;int j.elem[i]=L;插入位置不正确;e=L; L;删除的元素为;p=&L;删除位置不正确.*编写一个算法实现顺序表的就地置逆, ElemType &e) {
*p!InitList_Sq(sq))
printf(&quot.elem[L,*q; printf(&
int length,89;; for(int i=1;)!&=L;
L;*将第i到第n个元素向后移动一位.elem[L;= L.elem)
printf(& }SqL L.elem[L:&bool InitList_Sq(SqList& L){
L!newbase)
printf(&i&lt.elem[i-1];
return false.h&}void display_Sq(SqList L) {
for (int i=1,89;=L。*&#47.length=0; }}int main(){ SqList sq,i; do{ printf(&quot,7,e)),将第i+1到第n个元素向前移动一位; if ((i &lt:%d\math:&
if (i &* 将第i个元素的值给e.length+1)
printf(&quot,2);i++) {
t=L;#include & }while(。例如;.length &,(LIST_INIT_SIZE+LISTINCREAMENT)*sizeof(ElemType));
}&#47.length-i.listsize+=LISTINCREAMENT!&i++){ *(p+1)=*p;j& if(; scanf(&display_Sq(sq),++L,表长减1*&#47.length-i:&quot:&
ListInsert_Sq(sq插入 删除 逆至函数 是我写的 但是有错误#include&)!ListDelete_Sq(请输入要插入的元素;\ p--.elem=(ElemType * )malloc(LIST_INIT_SIZE*sizeof(ElemType));n&); ElemType e.elem[i-1],45; p--;删除后的元素序列为.length/display_Sq(sq)
我有更好的答案
DataType x){ }/&L-& void showmenu();&;
cin&gt,int n).链表删除元素
&&输入功能序号;length)
i=L-&gt:void PrintList(SeqList L;&1;&/
* 1;=i;}&#47:&
*************************&&
while(i;& int LocateList(SeqList L;&data[i];
请依次输入&.h&
/endl &&&;欲建立的顺序表长度 L:&请输入你要插入元素的位置i;顺序表的查找;&gt.data[i]&/;
InsertList(&L,尾部】
L-& cout&lt:&
&#47.输出顺序表的全部数据*&quot.data[p];
/&#47:int LocateList(SeqList L; if ((i&
cout&lt,这里假设为100typedef int DataT /& void DeleteList(SeqList *L;&个数;&
&#47,int i){ int l: &&lt,int n){ 顺序表的打印;
cout&&&请输入你要插入元素的值;请输入所需功能;&&quot,/&
cout&lt:void CreateList(SeqList *L,int i){ L-& void PrintList(SeqList L;&endl&lt:void DeleteList(SeqList *L;&lt:PrintList(L; int n=10:&n&&&lt,n); showmenu();&endl&&#47,DataT顺序表的插入;&插入前的链表;LocateList(L;L-&gt:&=n;&#47:&L-&&endl &插入后的链表;;4,范围【删除位置+1; &#47:
cout& l&i;&&//data[i]=x;endl && for (i=1;&=n,x; i& if (i&
cin&&&endl & L;哨兵技术 while (L;&#47:&顺序表的建立;依次后移【插入位置;&void main(){ SeqList L;个位置;顺序表的删除,x);
/ L-&,n); cout&
cin&x&元素&&quot, float或chartypedef struct{ DataType data[ListSize];/输入你要查找的元素的值.查找链表元素
case 3,请输入-5;顺序表的定义;依次前移;
&lt.查找顺序表的元素
x:#define ListSize 100
/&DataType可以是任何相应的数据类型如
**********功能**********&data[m]; for (m=L-&&
PrintList(L;&&
cout&lt.结束
*&表空间大小可根据实际需要而定;
cout&&lt.data[0]=x;功能列表
cin& /i&lt:cout&& &; i++)
PrintList(L;&&&/向量data用于存放表结点 /&,DataType x);&lt,n),int i);&;&#47,i);
&L;/&&lt,int i);length)) {
DeleteList(&L;
cout&/endl,n);&&,输入重显示功能表^_^ &quot,n);& l++) /3.顺序表插入元素
cin& L-&gt#include &删除前的链表;& i&& L-&}/ m&&}&#47!=x)
p--; } else {
for (l=i;&&lt:
cout&/&1) || (i&
/删除后的链表;endl &i,int n){ length++;&&&length+1; }}void showmenu(){ cout& p=L;强制插入位置为首元素 else
if (i&&& void InsertList(SeqList *L,int n);
PrintList(L; m--) /;data[l+1];&
PrintList(L;length=n;输入错误;&&}/& ;;&choice: & length--.length=0;
/endl&lt.length,n);
/&#47:void InsertList(SeqList *L;&当前的表长度}SeqL for (i=1,DataTdata[m+1]=L-&///
* 4, i) .链表插入元素
&&lt,尾部】
L-& void CreateList(SeqList *L;请输入你要删除元素的位置:&2;&&
CreateList(&L;/endl &&&1)
cout&&&lt!&quot.查看输入的全部数据
case 2!=5) {
/#include &lt,&强制插入位置为尾元素 ;输入时候退出程序
switch(choice)
case 1;&在第&
cout&lt.顺序表删除元素
* 2:&&//data[l]=L-&
删除位置不对
其他类似问题
线性表的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁线性表顺序结构的实现代码C++(查询插入删除)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
喜欢此文档的还喜欢
线性表顺序结构的实现代码C++(查询插入删除)
线​性​表​顺​序​结​构​的​实​现​代​码​,​实​现​查​询​,​插​入​,​删​除​。
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢

我要回帖

更多关于 顺序表就地逆置 的文章

 

随机推荐