c语言创建一个链表,前m个结点和后n个结点对调

c语言创建一个链表,前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;
} 

img