1. 程式人生 > >確認一個順序表是否有主元素,如果有找到這個主元素

確認一個順序表是否有主元素,如果有找到這個主元素

#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");
    }

}