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; } |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步