PAT-1097(Depulication on a Linked List)

  题目见这里

   分析:实际上是静态链表的应用,只不过要删除的结点链接成一个新的Removed List

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//静态链表
#include <stdio.h>
#define KEYMAX 10005
#define MAXADDRESS 100005
 
typedef struct{
    int data;
    int next; //下一个元素的下标
}SLinkList;
 
int n,kHead,rHead;
SLinkList sLinkList[MAXADDRESS];
int flag[KEYMAX];
 
int Transform(char *address){
    if(address[0]=='-') return -1;//仅-1为负数
    int p,i;
    p=0,i=0;
    while(address[i]){
        p = 10*p+address[i]-'0';
        i ++;
    }
    return p;
}
 
void Read(){
    char address[6],next[6];
    int data,p;
    scanf("%s%d",address,&n);
    getchar();
    kHead = Transform(address);
    while(n--){
        scanf("%s%d%s",address,&data,next);
        p = Transform(address);
        sLinkList[p].data = data;
        sLinkList[p].next = Transform(next);
    }
}
 
void DeDuplication(){
    int prior,next,q,data,i=1;
    prior = next = kHead;
    while(next!=-1){
        data = sLinkList[next].data;
        if(data<0) data = -data;
        if(flag[data]){
            //删除结点
            sLinkList[prior].next = sLinkList[next].next;
            if(i==1){
                rHead = next;
                q = rHead;
                sLinkList[q].next = -1;
                i ++;
            }
            else{
                sLinkList[q].next = next;
                sLinkList[next].next = -1;
                q = next;
            }
            //next结点链接到rHead所在链表之后再更新next
            next = sLinkList[prior].next;
        }
        else{
            flag[data] = 1;
            prior = next;
            next = sLinkList[next].next;
        }
    }
}
 
void OutPut(int head){
    int p = head;
    if(p==-1) return; //removed list可能为空
    do{
        printf("%05d %d ",p,sLinkList[p].data);
        if(sLinkList[p].next!=-1)
            printf("%05d\n",sLinkList[p].next);
        else printf("-1\n"); 
        p = sLinkList[p].next;
    }while(p!=-1);
}
 
int main(){
//  freopen("Data.txt","r",stdin);
    kHead = rHead = -1;
    Read();
//  OutPut(kHead);
//  puts("~~~分界线~~~");
    DeDuplication();
    OutPut(kHead);
    OutPut(rHead);
    return 0;
}

 

 

posted @   我在这儿  阅读(327)  评论(0编辑  收藏  举报

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示