试设计一个算法,将线性表的前m个元素和后n个元素进行互换
来源:学生作业帮 编辑:搜搜做题作业网作业帮 分类:综合作业 时间:2024/08/19 03:28:29
试设计一个算法,将线性表的前m个元素和后n个元素进行互换
即将线性表(a1,…,am,b1,b2,…,bn)改变成(b1,b2,…,bn,a1,a2,…,am),
注:用链式结构
即将线性表(a1,…,am,b1,b2,…,bn)改变成(b1,b2,…,bn,a1,a2,…,am),
注:用链式结构
![试设计一个算法,将线性表的前m个元素和后n个元素进行互换](/uploads/image/z/2401673-41-3.jpg?t=%E8%AF%95%E8%AE%BE%E8%AE%A1%E4%B8%80%E4%B8%AA%E7%AE%97%E6%B3%95%2C%E5%B0%86%E7%BA%BF%E6%80%A7%E8%A1%A8%E7%9A%84%E5%89%8Dm%E4%B8%AA%E5%85%83%E7%B4%A0%E5%92%8C%E5%90%8En%E4%B8%AA%E5%85%83%E7%B4%A0%E8%BF%9B%E8%A1%8C%E4%BA%92%E6%8D%A2)
#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;
}
写的有点乱,楼主可以试着优化一下.
#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;
}
写的有点乱,楼主可以试着优化一下.
试设计一个算法,将线性表的前m个元素和后n个元素进行互换
1.试设计一个算法,用尽可能少的辅助空间实现顺序表前m个元素和后n个元素进行整体互换.2.试设计一个算法
设数组R中n(n>1)个元素中有多个零元素,试设计一个算法将R中的所有非零元素依次移动到R数组的前端
利用指针作函数参数,设计一函数实现将n个元素进行排序
VB编程:键盘上输入10个整数,放入一个一维数组中,然后将其5个元素与后5个元素对换,即:第一个元素与第十个元素互换,第
在长度为L的线性表中,从第一个元素开始(包括第一个元素),找出两两之间距离不超过M的N个数字,使它们的和最大.
对于长度为n的顺序表,将元素x和它后一个元素交换,
设有一个含n个元素的数组,数组元素为自然数,写出一个算法,将所有值为素数的元素排在所有值为奇数的元素之前,将所有值为奇数
1.设有一个含n个元素的数组,数组元素为自然数,写出一个算法,将所有值为素数的元素排在所有值为奇数的元素之前,将所有值为
在顺序存储结构的线性表中插入一个元素,平均需要移动( )个元素
VB程序编写:某数组有20个元素,元素的值由键盘输入,要求将前10个元素与后10个元素对换.
用c++实现,假设有两个元素递增的有序排列线性表A和B,均以顺序表作存储结构.试编写算法将A表和B表归并成一个按元素值递