单链表是一种数据结构,由若干个结点组成。每个结点包含数据和下一个结点的地址。从头结点开始,通过下一个结点的地址找到下一个结点,如此循环,直到下一个结点的地址为空。
现给出一个单链表,每个结点包含的数据是一个字符(大写英文字母)。求该链表上的结点数据中各个字母所占比例。
第一行给出链表第一个结点的地址H和要给出的结点总个数N。其中结点地址H用5位非负整数表示,N为不大于10000的正整数。 之后N行,每行按如下格式给出结点信息:
Address Data Next
Address为结点地址,Data为A-Z中的一个字母,Next为下一个结点的地址,Address和Next格式同H。当Next为-1时表示该结点没有下一个结点,链表遍历结束。
按A-Z的顺序,按以下格式输出各个字母所占比例:
Character Percentage
其中Character为英文字母, Percentage为百分比,保留到小数点后2位。中间以空格分隔。 如果该字母没有出现过,则不输出。
00001 10 01044 E 01055 00100 C 01011 00001 D 00100 09996 D 00253 01011 A 00045 00045 V 09876 09876 E 09996 00253 D 00999 00999 A 01044 01055 G -1结尾无空行
A 20.00% C 10.00% D 30.00% E 20.00% G 10.00% V 10.00%结尾无空行
中规中矩,没有偷懒的写法:
#include<iostream> #include<iomanip> using namespace std; typedef char ElemType; struct LNode { int next; ElemType data; }LinkList[100000]; int main() { int base,n,alpha[27]={0}; cin>>base>>n; if(base>100000||n>10000||n<0||base<0) { return 0; } for(int i=0;i<n;i++) { int address,next; char data; cin>>address>>data>>next; LinkList[address].data=data; LinkList[address].next=next; } int b=base,count=0; for(int i=0;i<n;i++) { if(LinkList[b].next==-1) { alpha[LinkList[b].data-'A']++; count++; break; } alpha[LinkList[b].data-'A']++; b=LinkList[b].next; count++; } for(int i=0;i<26;i++) { if(alpha[i]>0) { cout<<char(i+'A')<<" "<<setiosflags(ios::fixed)<<setprecision(2)<<alpha[i]*100./count<<"%"<<endl; } continue; } return 0; }