您的位置:首页 > 其它

PAT 1025 反转链表

2016-07-08 15:46 246 查看
#include <stdio.h>
#include <string.h>

#define MAXNODE 100001
struct Node
{
int data;
char addr[8];
char next[8];
}node[MAXNODE];

struct Node *pnode[MAXNODE];

int main(void)
{
char ad[8];
int nnode, k;
int i, j;
struct Node *tmp;
char *next = ad;

freopen("pat1025.in", "r", stdin);
scanf("%s %d %d", ad, &nnode, &k);
for (i = 0; i < nnode; i++) {
scanf("%s %d %s", node[i].addr, &node[i].data, node[i].next);
pnode[i] = &node[i];
}

/* sort according to the list next domain */
for (i = 0; i < nnode; i++) {
for(j = i; j < nnode; j++)
{
if(strcmp(pnode[j]->addr, next) == 0)
{
/* swap i and j */
if(i != j)
{
tmp = pnode[i];
pnode[i] = pnode[j];
pnode[j] = tmp;
}
next = pnode[i]->next;
break;
}
}
/* there are some invalid nodes */
if(strcmp(next, "-1") == 0) break;
}

/* reverse by swapping for every k segment.  */
nnode = i + 1; // update nnode
struct Node **st, **end;
for (i = k - 1; i < nnode; i+=k) {
for (st = &pnode[i - k + 1], end = &pnode[i]; st < end; ++st, --end){
tmp = *st;
*st = *end;
*end = tmp;
}
}
/* build next value */
for(i = 0; i < nnode - 1; ++i)
strcpy(pnode[i]->next,pnode[i+1]->addr);
strcpy(pnode[i]->next, "-1");

for (i = 0; i < nnode; i++) {
printf("%s %d %s\n", pnode[i]->addr, pnode[i]->data, pnode[i]->next);
}
return(0);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: