#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);
}
PAT 1025 反转链表
最新推荐文章于 2024-09-03 22:15:15 发布