试设计一个算法,将线性表的前m个元素和后n个元素进行互换即将线性表(a1,…,am,b1,b2,…,bn)改变成(b1,b2,…,bn,a1,a2,…,am),注:用链式结构

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/28 07:12:16
试设计一个算法,将线性表的前m个元素和后n个元素进行互换即将线性表(a1,…,am,b1,b2,…,bn)改变成(b1,b2,…,bn,a1,a2,…,am),注:用链式结构

试设计一个算法,将线性表的前m个元素和后n个元素进行互换即将线性表(a1,…,am,b1,b2,…,bn)改变成(b1,b2,…,bn,a1,a2,…,am),注:用链式结构
试设计一个算法,将线性表的前m个元素和后n个元素进行互换
即将线性表(a1,…,am,b1,b2,…,bn)改变成(b1,b2,…,bn,a1,a2,…,am),
注:用链式结构

试设计一个算法,将线性表的前m个元素和后n个元素进行互换即将线性表(a1,…,am,b1,b2,…,bn)改变成(b1,b2,…,bn,a1,a2,…,am),注:用链式结构
#include <stdio.h>
#include <iostream>
#include <iomanip> //格式输出
using namespace std;
#define maxlen 50
struct List
{
int data[maxlen];
int listlen;
}seqlist; //顺序表
int change(int* ptr, int length, int m, int n) //一个辅助空间使前m个元素与后n个元素整体互换,ptr为数组头指针,length为数组长度
{
int i,j;
int temp; //一个辅助空间
int* mark;
if(m+n>length)
return -1;
if(m == n) //前后调换个数相同,中间数据不用移动
{
for(i=0; i<m; i++)
{
temp = *ptr;
*ptr = *(ptr + length - n);
*(ptr + length - n) = temp;
ptr++;
}
}

else if(m > n) //m>n,中间数据整体前移
{
for(i=0; i<n; i++)
{
temp = *ptr;
*ptr = *(ptr + length - n);
*(ptr + length - n) = temp;
ptr++;
}

mark = ptr;
for(j=0; j<m-n; j++)
{
temp = *ptr;
for(i=n; i<length-1; i++)
{
*ptr = *(ptr + 1);
ptr++;
}
*ptr = temp;
ptr = mark;
}

}
else //m<n,中间数据整体后移
{
for(i=0; i<m; i++)
{
temp = *ptr;
*ptr = *(ptr + length - n);
*(ptr + length - n) = temp;
ptr++;
}
mark = ptr + length - n;
for(j=0; j<n-m; j++)
{
ptr = mark;
temp = *ptr;
for(i=length-n+m; i>m; i--)
{
*ptr = *(ptr - 1);
ptr--;
}
*ptr = temp;
mark++;
}
}
return 0;
}
int main(int argc, int* argv[])
{
int i;
seqlist.listlen = 0;
for(i=0; i<maxlen; i++)
{
seqlist.data[i] = i;
seqlist.listlen++;
}
if(-1 == change(&seqlist.data[0], seqlist.listlen, 10, 15))
cout << "Error! " << endl; //如果m+n>顺序表实际长度,则认为出错,函数返回-1
for(i=0; i<maxlen; i++)
cout << "[" << setw(2) << i << "] : " << seqlist.data[i] << endl;
return 0;
}
写的有点乱,楼主可以试着优化一下.