如A=(0,5,5,3,5,7,5,5),则5为主元素;又如A=(0,5,5,3,5,1,5,7),则A中没有主元素。假设 A 中的n个元素保存在一个一维数组中,请设计一个尽可能高效的算法,找出A 的主元素。若存在主元素,则输出该元素;否则输出-1。
#include <stdio.h>
#include <stdlib.h>
//定义结构体数组S,其中的元素不仅有值,还有该值在S中出现的次数。
#define length 8
typedef struct Num
{
int data; //数据元素
int number; //对应出现的次数
struct Num *next;
}Num;
Num *new()
{
Num *new=(Num *)malloc(sizeof (Num));
new->data=0;
new->number=0;
new->next=NULL;
return new;
}
int main_element(int in[],int n)
{
Num *Numhead=NULL;
for(int i=0;i<n;i++)//往链表中添加数据及其对应出现的次数
{
if(Numhead==NULL) //第一个链表头
{
Numhead =new();
Numhead ->data=in[i];
Numhead ->number++;
}
else
{
Num *p=Numhead; //循环遍历的指针
Num *p1=Numhead; //用于添加元素的指针
do //遍历链表并对比添加每个数据在数组中出现的次数
{
if(p->data==in[i])
{
p->number++;
break;
}
else
{
if(p->next!=NULL)
{
p1=p->next;
}
p=p->next;
}
}
while(p!=NULL) ;
if(p==NULL)//链表中不存在,则创建一个结构体元素接在链表未
{
p1->next=new();
p1->next->data=in[i];
p1->next->number++;
}
}
}
Num *p=Numhead;
int max=-1;
int maxnum=0;
while (p!=NULL) //遍历链表寻找出现最多的数据
{
//printf("数据元素 %d 次数:%d\n",p->data,p->number);
if(max<p->number)
{
max=p->number;
maxnum=p->data;
}
p=p->next;
}
if(n%2==1) //判断数组大小的奇偶
{
if(max>n/2+1) //如果为奇数
{
return maxnum;
}
else
{
return -1;
}
}
else {
if(max>n/2) //如果为偶数
{
return maxnum;
}
else
{
return -1;
}
}
}
int main()
{
int in[length]={0,5,5,3,5,7,5,5}; //测试数据
int num= main_element(in,length);
if(num==-1)
{
printf("没有主元素\n");
}
else {
printf("主元素为%d\n", main_element(in,length));
}
return 0;
}
标签:int,元素,number,next,Num,2023,new,C语言,408
From: https://blog.csdn.net/bobo123355566/article/details/141676928