您的位置:首页 > 其它

1025. 反转链表 (25)

2016-02-14 21:02 253 查看
题目:http://www.patest.cn/contests/pat-b-practise/1025

注意点:

1.所提供的节点不一定为有效(即不一定是一条链)–该问题通过定义一个计数可解决

2.栈溢出,可能数组太大–未解决

代码:

#include <stdio.h>

#define Size 1000

int main()
{
int m,n,k;
int i,j,t=0,x;
int a[Size][3],b[Size];

void change(int p[],int ,int );
void print(int o[][3],int w[],int,int);

//输入
scanf("%d %d %d",&m,&n,&k);
for (i=0;i<n;i++)
{
for (j=0;j<3;j++)
scanf("%d",&a[i][j]);
}

//寻找有效节点数
x = m;
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
if (a[j][0]==x)
{
t++;
x = a[j][2];
break;
}
}
}

//置数组b
for (i=0;i<t;i++)
{
for (j=0;j<n;j++)
{
if (a[j][0]==m)
{
b[i] = a[j][1];
m = a[j][2];
break;
}
}
}

//
i = 0;
j = t;
while (t-k>=0)
{
change(b,i,k);//i为改变开始点,k为改变个数
i +=k;
t = t-k;
}

print(a,b,n,j);

return 0;
}

void change(int b[Size],int i,int k)
{
int c[Size];
int j,m=i;
for (j=i+k-1;j>=i;j--)
{
c[m] = b[j];
m++;
}
for (j=i;j<k+i;j++)
{
b[j] = c[j];
}
}

void print(int a[Size][3],int b[Size],int n,int t)
{
int i,j;
int c[Size];
for (i=0;i<t;i++)
{
for (j=0;j<n;j++)
{
if (a[j][1]==b[i])
{
c[i] = a[j][0];
break;
}
}
}
for (i=0;i<t-1;i++)
printf("%05d %d %05d\n",c[i],b[i],c[i+1]);
printf("%05d %d -1\n",c[t-1],b[t-1]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: