【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;
}


原文地址:https://www.cnblogs.com/unclejelly/p/4082168.html