题目描述:
已知顺序存储结构的线性表L,其元素在表中有序排列,并且存在相同元素。编写高效算法,找出重复次数最多的数据元素并统计其重复次数,由参数返回该元素和重复次数。(若存在多个这样的元素,返回表中先出现的元素即可)
我的思路
遍历顺序表,一边遍历一边记录出现次数;
提问
是否有更为高效的算法?顺便附上算法代码,谢谢!
题目描述:
已知顺序存储结构的线性表L,其元素在表中有序排列,并且存在相同元素。编写高效算法,找出重复次数最多的数据元素并统计其重复次数,由参数返回该元素和重复次数。(若存在多个这样的元素,返回表中先出现的元素即可)
我的思路
遍历顺序表,一边遍历一边记录出现次数;
提问
是否有更为高效的算法?顺便附上算法代码,谢谢!
代码如下,如有帮助,请帮忙采纳一下,谢谢。
代码:
#include <stdio.h>
#define N 20
struct LinkList
{
int arr[N];
int length;
};
//创建链表
void CreateList(struct LinkList *lst)
{
int i,n;
lst->length = 0;
printf("请输入10个元素存入数组中");
for (i=0;i<10;i++)
{
scanf("%d",&n);
lst->arr[lst->length] = n;
lst->length++;
}
}
//查重,返回重复数最多的元素及个数
void GetRepeat(struct LinkList *lst,int *data,int *nmb)
{
struct LinkList* p;
int i=0;
int cnt = 1;
if(lst == 0) {data = 0;nmb = 0;return;}
for (i=1;i<lst->length;i++)
{
if(lst->arr[i] == lst->arr[i-1])
cnt++;
else
{
if(cnt > *nmb)
{
*nmb = cnt;
*data = lst->arr[i-1];
}
cnt = 1;
}
}
if(cnt > *nmb)
{
*nmb = cnt;
*data = lst->arr[i-1];
}
}
//显示列表
void print(struct LinkList *lst)
{
int i;
printf("链表当前元素为:");
for (i=0;i<lst->length;i++)
{
if(i<lst->length-1)
printf("%d ",lst->arr[i]);
else
printf("%d\n",lst->arr[i]);
}
}
int main()
{
struct LinkList lst;
int data,nmb=0;
CreateList(&lst);
print(&lst);
GetRepeat(&lst,&data,&nmb);
printf("重复最多的数是%d,重复次数%d",data,nmb);
return 0;
}