PTA线性表—统计字母比例

统计字母比例

单链表是一种数据结构,由若干个结点组成。每个结点包含数据和下一个结点的地址。从头结点开始,通过下一个结点的地址找到下一个结点,如此循环,直到下一个结点的地址为空。

现给出一个单链表,每个结点包含的数据是一个字符(大写英文字母)。求该链表上的结点数据中各个字母所占比例。

输入格式:

第一行给出链表第一个结点的地址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%
结尾无空行

逻辑

模拟。

AC代码

顺序表

#include<bits/stdc++.h>
using namespace std;
struct MyStruct
{
	int address;
	char data;
	int next;
};
int main()
{
	int addr;
	int n;
	double cnt[26] = {};
	MyStruct a[10005];
	int all = 0;
	cin >> addr >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i].address >> a[i].data >> a[i].next;
	}
	for (int i = addr; i != -1;)
	{
		for (int j = 0; j < n; j++)
		{
			if (a[j].address == i)
			{
				cnt[a[j].data - 65]++;
				all++;
				i = a[j].next;
				break;
			}
		}
	}
	for (int i = 0; i < 26; i++)
	{
		if (cnt[i] != 0)
		{
			printf("%c %.2f%%\n", 'A' + i, cnt[i] * 1.0 / all * 100);
		}
	}
	return 0;
}

链式表

#include<bits/stdc++.h>
using namespace std;
typedef struct LNode
{
	int Address;
	char Data;
	int Next;
	struct LNode* next;
}LNode,*Linklist;
int main()
{
	int addr,n;
	cin>>addr>>n;
	Linklist l,s,r;
	l=(Linklist)malloc(sizeof(LNode));
	cin>>l->Address>>l->Data>>l->Next;
	l->next=NULL;
	r=l;
	for(int i=1;i<n;i++)
	{
		s=(Linklist)malloc(sizeof(LNode));
		cin>>s->Address>>s->Data>>s->Next;
		r->next=s;
		r=r->next;
	}
	r->next=l;
	double a[26]={};
	int cnt=0;
	for(int i=addr;i!=-1;)
	{
		if(i==l->Address)
		{
			
			a[l->Data-65]++;
			cnt++;
			i=l->Next;
		}
		l=l->next;
	}
	for(int i=0;i<26;i++)
	{
		if(a[i]!=0)
			printf("%c %.2f%%\n",'A'+i,a[i]*1.0/cnt*100);
	}
	return 0;
}
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值