【openjudge】数字统计
- 总时间限制:
- 1000ms
- 内存限制:
- 100000kB
- 描述
- 输入n个整数,统计每个数出现的次数.
- 输入
- 第一行是一个整数n(1<=n<=1000),接下来n行每行一个整数.
- 输出
- 第一行输出总共有多少个不同的整数.
接下来每行输出一个整数及这个整数出现的次数,用空格分隔.
输出的整数的顺序与它们在输入中第一次出现的顺序一致(即在输入中先出现的数,也会在输出中先出现) - 样例输入
-
5 2 3 2 1 2
- 样例输出
-
3 2 3 3 1 1 1
这道题用顺序存储的数组也应该能实现。但是估计会超时。并且题目是链式存储的练习。所以还是用链表来解比较好。
#include <stdio.h> #include <malloc.h> typedef struct Lnode { int data; int sum; struct Lnode *next; }LNode,*Linklist; LNode *head; void initlist(Linklist *L) { *L=(LNode *)malloc(sizeof(LNode)); (*L)->next=NULL; (*L)->sum=1; } void inselem(int n) { int x,i; LNode *s,*q,*p; for(i=0;i<n;i++) { q=head; p=head->next; scanf("%d",&x); if(p==NULL){ initlist(&s); s->data=x; head->next=s; } while(p!=NULL) { if(x!=p->data) { p=p->next; q=q->next; } else { p->sum++; break; } if(p==NULL) { initlist(&s); s->data=x; q->next=s; } } } } int main() { int n,x; LNode *q; head=(LNode *)malloc(sizeof(LNode)); head->next=NULL; scanf("%d",&n); inselem(n); q=head->next; while(q!=NULL) { printf("%d %d\n",q->data,q->sum); q=q->next; } return 0; }