PAT 1025 反转链表

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值