1.试设计一个算法,用尽可能少的辅助空间实现顺序表前m个元素和后n个元素进行整体互换。 2.试设计一个算法

作者&投稿:端木梁 (若有异议请与网页底部的电邮联系)
试设计一个算法,将线性表的前m个元素和后n个元素进行互换~

#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 <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;
}

写的有点乱,楼主可以试着优化一下。


求设计一个算法
(2)、除了上述的(1)之外,你的要求中又涉及到了《数据结构》课程中的排序算法、以及对链表的各种操作(首先要查找到所需要删除的节点、然后再从单链表中进行删除。而且了,删除了节点之后,对原来的单链表还需要重新进行排序)(3)、编写、并且调试通过一个 C 语言源代码并非一件易事,编写任何一...

设计一个O(n2)时间算法,找出由n个数组成的序列的最长单调递增子序列_百 ...
这里的最优子结构就是n个元素的最长递增子序列是从前n-1个元素结尾的递增子序列中的一个或者再加上nums[n],这里面自然存在很多重叠子问题。代码如下:\/***\/ \/* 算法导论15.4-5 找出n个数的序列中最长的单调递增子序列 利用动态规划思想,时间复杂度为O(n^2)*\/ \/***\/ include<iostream> u...

...直角三角形内切圆的面积,试设计求解该问题的算法,并画出
算法如下:第一步,输入两条直角边长为a,b.第二步,计算r=a+b?a2+b22.第三步,计算S=πr2.第四步,输出S.程序框图如下:

设计算法以求解从集合{1..n}中选取k(k<=n)个元素的所有组合
对于n个元素的集合Sn,如果有函数Set combine(k,Sn),产生n个元素中选k个元素集合的集合;那么,当a是n个元素中的任意一个时,combine(k,Sn)=combine(k,Sn-{a})+combine(k-1,Sn-{a})。由此可以产生递归算法:Set Sn=new Set{a0,a1,...an-1};Set result=Sn.combine(k,Sn);...funct...

在CRAY-1上用链接技术进行向量运算D=A*(B+C)假设向量长度N≤64,向量元 ...
第一条指令的时间kt,加上其余n-1条指令

...完成任务i需要的时间为ti。试设计一 个算法找出完成这n个任务的...
{ cout<<"输入完成第"<<i+1<<"个任务需要的时间:"<<endl;cin>>t[i];} for(i=0;i<m;i++)T[i]=0;int j,temp;for(i=0;i<n-1;i++)for(j=0;j<n-i-1;j++)if(t[j]<t[j+1]){ temp=t[j];t[j]=t[j+1];t[j+1]=temp;} for(i=0;i<n;i++)T[find...

试设计一个购票的算法,输入儿童的身高,输出应购买何种票,写出程序.
儿童乘车坐火车时,若身高不超过1.1m,则无需购票;若身高超过1.1m但不超过1.4m,可买半票;若超过1.4m,应买全票.试设计一个购票的算法,输入儿童的身高,输出应购买何种票,写出程序框图

假设二叉树以二叉链表作为存储结构,试设计一个计算二叉树叶子结点树的...
= null){queue.enQueue(temp.getRight());}}}return count;}\/** * 测试用例 *\/@Testpublic void testMethods(){\/** * 使用队列构造一个供测试使用的二叉树 * 1 * 2 3 * 4 5 6 7 * 8 9 *\/LinkQueue<BinaryTreeNode<Integer>> queue = new LinkQueue<Binary...

试设计迷宫求解算法:迷宫是一个m行n列的0-1矩阵,其中0表示无障碍,1表示...
location->a[0]);` ```else return 0;} 这是一个迭代过程,需要对每一个方位的位置都遍历一遍,也是一个深度优先的遍历过程。我在这只给lz一个示意,具体的算法在《数据结构》的书上基本都有,蛮经典的。希望能对lz有所帮组。加油!

设一系列正整数存放在一个数组中,试设计算法,将所有奇数存放在数组的前...
空间复杂度:数组a。个人认为这是时空效率最好的,其他网友不服来辩。*\/#include <iostream>using namespace std;const int n = 10;int main(){int a[n] = {3,18,2,12,12,5,6,7,8,9};int i = 0;int j = n;while (i < j){if (0 == a[i] % 2 && 1 == a[j] % ...

泰州市17619577584: 用顺序存储结构设计一个算法,仅用一个辅助结点实现将线性表中的节点循环右移k位的运算,并分析算法的事件 -
驹茂乙水: Int move(sequenlist *L) { datatype x;int i,j;for(i=k–1;i>=0;i––){x=L–>data[L–>last];for(j=L–>last;j>0;j––)L–>data[j]=L–>data[j–1];L–>data[0]=x;}return (1);}

泰州市17619577584: 用向量作存储结构,试设计一个算法,仅用一个辅助结点,实现将线性表中的结点循环右移k位的运算 -
驹茂乙水: /*#define true 1#define false 0#define ok 1#define error 0#define infeasible -1#define overflow -2#include <iostream>#include <stdlib.h> typedef int elemtype; using namespace std; //-----单链表-----//-----结点和表头的定义----- struct snode { ...

泰州市17619577584: 【数据结构】用向量作存储结构,试设计一个算法,仅用一个辅助结点,实现将线性表中的结点循环右移k位的运算,谁能解答一下.
驹茂乙水: #include <stdio.h> void move(int array[],int k,int length ){//k表示移动第k位置,length表示长度 int i,j, temp ; if (k<0){ printf("输入的移动位数有错误,应当为整数"); return ; } //对于循环右移来说,真正变换的位置的一定是k对length的余数.(它...

泰州市17619577584: 假设有10000个1 - 10000的互不相同的数据构成一无序集合.设计一个算法实现排序,要求以尽可能少的比较次数 -
驹茂乙水:[答案] 快速排序就满足你的条件: void QuickSort(int e[],int first,int end) { \x05int i=first,j=end,temp=e[first]; \x05while(i

泰州市17619577584: 已知钱数为X,要把它用1元,5角,1角1分的硬币表示,设计一个算法1.已知钱数 (不足10元),要把它用1元、5角、1角、1分的硬币表示,若要用尽量少... -
驹茂乙水:[答案] 假设钱数为X元(两位小数),同时用A\B\C\D来分别表示1元、5角、1角、1分的硬币个数, 算法流程如图

泰州市17619577584: 已知一个三角形的三边边长分别为2,3,4,设计一个算法,求出它的面积 -
驹茂乙水: 由于已知三角形的三 边长,可利用海伦公式求三角形的面积,具体算法过程如下 S1 令a=2,b=3,c=4 S2 计算 p=a+b+c2 S3 利用公式 S=p(p-a)(p-b)(p-c) 求出面积S=345 S4 输出S,结束程序

泰州市17619577584: 将给定的n(n<=10)个整数(手动输入)存入数组中,将数组中的这n个数...
驹茂乙水: #include <stdio.h>#include <stdlib.h> typedef struct LNode { int data; struct LNode *next; }LNode,*LinkList; void InitList(LinkList *L); void ListDeleteMax(LinkList L,int *e); int ListInsert(LinkList L,int i,int e); void DestroyList(LinkList L); void ...

泰州市17619577584: 设计一个算法,计算40个人的期中数学平均分,并画出程序框图. -
驹茂乙水: 1:定义总和sum=0,;然后进到步骤22:输入一个人的成绩A,进行步骤33:sum=sum+A,进行步骤44:判断输入完了么?完了进行步骤5,没完进行步骤2;5:输出sum/40,结束.

泰州市17619577584: 设计一个算法,从1的平方加到100的平方,不是编程,是数学里面的,自然语言表示算法. -
驹茂乙水: 原式=1*2-1+2*3-2+3*4-3……+n(n+1)-n =[1*2+2*3+3*4+……+n(n+1)]-(1+2+3+……+n) =1/3(1*2*3-0*1*2)+1/3(2*3*4-1*2*3)+1/3(3*4*5-2*3*4)+……1/3[n*(n+1)(n+2)-(n-1)n(n+1)]-(1+2+3+……+n) =1/3[n(n+1)(n+2)]-[(n+1)n]/2 =[n(n+1)(2n+1)]/6

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网