タイトル1524:複雑なチェーンテーブルのコピー-9度

2120 ワード

タイトルの説明:
複雑なチェーンテーブル(各ノードにノード値と2つのポインタがあり、1つは次のノードを指し、もう1つの特殊なポインタはいずれかのノードを指します)を入力します.
入力:
入力には複数のテストサンプルが含まれ、入力はEOFで終了します.
各テストケースについて、入力される第1の動作の整数n(1<=n<=1000):nは、入力するチェーンテーブル要素の個数を表す.(ノード番号は1から).
チェーンテーブルノードの値を表すn個の数が続く.
次にn個の数Tiがあり,Tiはi番目のノードの別のポインタ指向を表す.
Ti=0はこのポインタがNULLであることを示す.
出力:
各テストケースに対応し、
出力n行、各行に2つの数があり、1つ目は現在のノード値、2つ目は現在のノードの特殊なポインタの値を表す.
サンプル入力:
5
1 2 3 4 5
3 5 0 2 0
サンプル出力:
1 3
2 5
3 0
4 2
5 0 
推奨指数:※※
ソース:http://ac.jobdu.com/problem.php?pid=1524
この問題はOJの観点から言えば、問題そのものの意味を失う.
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int main()
{
    int n,i;
    while(scanf("%d",&n)!=EOF){
        int *link=new int [n+1];
        int *r=new int [n+1];
        for(i=1;i<=n;i++)
            scanf("%d",&link[i]);
        for(i=1;i<=n;i++)
            scanf("%d",&r[i]);
        for(i=1;i<=n;i++){
            printf("%d %d
",link[i],r[i]>0?link[r[i]]:0); } } return 0; }

タイトルの鍵はチェーンテーブルをコピーするときに任意のポインタがあることです.任意のポインタの処理については、ソースチェーンテーブルの各ノードの後ろにノードを挿入し、値をコピーすることができます.ソースチェーンテーブルの各任意のポインタが処理されると、新しいノードでは、元の任意のポインタの後ろのノードを指します.(主な関数:)詳細は海涛のブログを参照してください:http://zhedahht.blog.163.com/blog/static/254111742010819104710337/
typedef struct node{
    int val;
    node *next;
    node *rnext;
}node;
bool  copy_link(node*  link,node *cp){
    if(link==NULL)
        return false;
    node *p=link;
    while(p!=NULL){
       node *q=p->next;
       node *c=new node;
       p->next=c;
       c->next=q;
       p=p->next;
    }
    p=link;
    while(p!=NULL){
       node *q=p->next;
       q->val=p->val;
       q->rnext=p->rnext->next;
       p=p->next;
    }
    p=link;
    cp=link->next;
    while(p!=NULL){
        node *q=p->next;
        p->next=p->next->next;
        p=q->next;
        q->next=q->next->next;
    }
    return true;
}