题目:
创建一个顺序表
List[]={1,2,6,9,7,4,22,11,25,17,8,3,55,101,39,44,71,39,21}
然后移动顺序表中的元素变为:
List[]={8,3,55,101,39,44,71,39,21,1,2,6,9,7,4,22,11,25,17}
也就是把原来的顺序表元素8之前的元素,按照原来的顺序放在末尾。
思路:
1.首先我采用的数组动态分配线性表的方式,掌握顺序表结构体的描述,动态扩充顺序表的算法,语句。
2.建立逆序函数,将前半部分。后半部分分别逆序,然后再整体逆序。通过两次逆序,又变为正常顺序
3.优点:程序优美。缺点:增加一定的复杂度。
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
/*******采用宏定义,在对这些数值修改时可以直接在宏定义修改,不必在程序内部做修改*****/
#define LIST_INIT_SIZE 50//线性表的初始空间
#define LISTINCREMENT 10//线性表空间的扩充量
typedef int ElemType;
typedef struct//线性表结构体(动态分配)
{
ElemType *data;
int length;
int listsize;
}SqList;
void InitList_Sq(SqList &L)//线性表初始化
{
L.data = new ElemType[LIST_INIT_SIZE];
if(!L.data)
exit(1);//分配空间失败,异常退出
int n;
L.length = 0;
L.listsize = LIST_INIT_SIZE;
cout<<"输入元素个数:"<<endl;
cin>>n;
cout<<"请依次输入元素的值:"<<endl;//输入数据
for (int i = 0;i<n;i++)
{
cin>>L.data[i];
++L.length;
if(L.length>=L.listsize)//扩充空间
{
ElemType *newspace = new ElemType[LIST_INIT_SIZE+LISTINCREMENT];
if (!newspace)
exit(1);//扩充失败,异常退出
L.data = newspace;
L.listsize+=LISTINCREMENT;
}
}
}
void List_Display(SqList &L)//线表输出函数
{
for(int i = 0;i<L.length;i++ )
cout<<L.data[i]<<" ";
}
void List_Reserve(SqList &L,int left,int right,int k)//线表逆置函数
{
int temp;//中间变量
for(int i=left,j=right;i<j;i++,j--)//交换
{
temp = L.data[i];
L.data[i]=L.data[j];
L.data[j]=temp;
}
}
int main()
{
SqList List;
InitList_Sq(List);//List[]={1, 2,6,9,7,4,22,11,25,17, 8,3,55,101,39,44,71,39,21}
cout<<"原线表元素为 :"<<endl;
List_Display(List);
cout<<endl;
List_Reserve(List,0,9,10);
List_Reserve(List,10,18,9);
List_Reserve(List,0,18,19);
cout<<"改变顺序后的线表:"<<endl;
List_Display(List);
return 0;
}
程序运行结果: