确认一个顺序表是否有主元素,如果有找到这个主元素

#include <stdio.h>

/*
题目:天勤41页综合应用题3
找出一个顺序表的主元素——元素个数大于表长一半的元素

算法:
一次遍历顺序表确定可疑的主元素,
二次遍历顺序表确定这个可疑的主元素是否真的个数大于表长的一半
*/

#define maxlen 50
#define DATATYPE int

typedef struct{
    DATATYPE arr[maxlen];
    int length;
}Seqlist;

int main(void)
{
    Seqlist list = {{1,2,3,4,5},5};
    //初始化可疑的主元素为第一个元素
    int suspectable_PE = list.arr[0];
    //设置一个计数器,与变量suspectable_PE配合找到可疑的主元素
    int count = 1;

    //从第二个元素开始遍历顺序表
    for(int i = 1;i<list.length;i++)
    {
        if(list.arr[i] == suspectable_PE){
            ++count;
        }else{
            if(count!=0){
                --count;
            }else{
                //count==0而顺序表没有遍历完的时候,需要重新确定主元素
                suspectable_PE = list.arr[i];
                count = 1;
            }
        }
    }

    printf("suspectalbe_PE is %d\n",suspectable_PE);

    //二次确认是因为顺序表可能没有主元素,但suspectable_PE却一直是顺序表中的某一个元素
    count = 0;
    for(int i=0;i<list.length;i++){
        if(suspectable_PE == list.arr[i]){
            ++count;
        }
    }
    if(count > list.length/2){
        printf("principal elem is %d\n",suspectable_PE);
    }else{
        printf("there is no principal elem\n");
    }

}

猜你喜欢

转载自blog.csdn.net/linking_lin/article/details/82560601