怎样判断票数相同的,并打印输出

我想要达到的结果

#include
#include
#include
#include

struct Elector
{
char name[32];
int tickets;
};

struct Elector* initXM(struct Elector *pxm,int ptotal)
{
int n;
if (pxm == NULL){
printf("请确定候选人人数为:\n");
scanf("%d",ptotal);
pxm = (struct Elector
)malloc(ptotalsizeof(struct Elector));
if (pxm == NULL){
puts("error:分配空间失败");
assert(pxm != NULL);
}
}
int i;
puts("请再次确定参选人都为:");
for (i=0;i<*ptotal;i++){
pxm->tickets = 0;
printf("第%d个参选人为:\n",i+1);
scanf("%s",pxm->name);
pxm++;
}
pxm = pxm -*ptotal;
return pxm;
}
int doVot(struct Elector *pxm,int *ptotal)
{
int i,j;
int mark = 0;
int feipiao = 0;
struct Elector *p = pxm;
char tmpname[32];
int tmp;
puts("请确定参与投票人数:");
scanf("%d",&tmp);
for (i=0;i
memset(tmpname,'\0',sizeof(tmpname));
mark = 0;
pxm = p;
puts("请问你投给谁:");
scanf("%s",tmpname);
for (j=0;j<*ptotal;j++){
if (strcmp(tmpname,pxm->name) == 0){
pxm->tickets++;
mark = 1;
}
pxm++;
}
if (mark == 0){
puts("error:投票无效,废票!!");
feipiao++;
}
}
return feipiao;
}
void printXM(struct Elector *pxm,int feipiao,int total)
{
int i;
struct Elector *max;
int bak = 0;
max = pxm;
for (i=0;i
printf("名字: %s,票数: %d\n",pxm->name,pxm->tickets);
pxm++;
}
printf("废票为%d张\n",feipiao);
pxm = max ;
for (i=0;i
if (max->tickets < pxm->tickets){
max = pxm;
}
pxm++;
}
printf("%s最终以最高票数%d票当选人大代表\n",max->name,max->tickets);
}
int main()
{
struct Elector *xm = NULL;
int total = 0;
int feipiao = 0;
xm = initXM(xm,&total);
feipiao = doVot(xm,&total);
printXM(xm,feipiao,total);
return 0;
}

可以循环遍历存放投票信息的结构数组,然后判断相同的则打印他的名字和票数即可,下面是一个实现,供参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

struct Elector
{
char name[32];
int tickets;
};

struct Elector* initXM(struct Elector *pxm,int *ptotal)
{
int n;
if (pxm == NULL){
printf("请确定候选人人数为:\n");
scanf("%d",ptotal);
pxm = (struct Elector *)malloc(*ptotal*sizeof(struct Elector));
if (pxm == NULL){
puts("error:分配空间失败");
assert(pxm != NULL);
}
}
int i;
puts("请再次确定参选人都为:");
for (i=0;i<*ptotal;i++){
pxm->tickets = 0;
printf("第%d个参选人为:\n",i+1);
scanf("%s",pxm->name);
pxm++;
}
pxm = pxm -*ptotal;
return pxm;
}
int doVot(struct Elector *pxm,int *ptotal)
{
int i,j;
int mark = 0;
int feipiao = 0;
struct Elector *p = pxm;
char tmpname[32];
int tmp;
puts("请确定参与投票人数:");
scanf("%d",&tmp);
for (i=0;i<tmp;i++){
memset(tmpname,'\0',sizeof(tmpname));
mark = 0;
pxm = p;
puts("请问你投给谁:");
scanf("%s",tmpname);
for (j=0;j<*ptotal;j++){
if (strcmp(tmpname,pxm->name) == 0){
pxm->tickets++;
mark = 1;
}
pxm++;
}
if (mark == 0){
puts("error:投票无效,废票!!");
feipiao++;
}
}
return feipiao;
}
void printXM(struct Elector *pxm,int feipiao,int total)
{
int i;
struct Elector *max;
int bak = 0;
max = pxm;
for (i=0;i<total;i++){
printf("名字: %s,票数: %d\n",pxm->name,pxm->tickets);
pxm++;
}
printf("废票为%d张\n",feipiao);
pxm = max ;
for (i=0;i<total;i++){
if (max->tickets < pxm->tickets){
max = pxm;
}
pxm++;
}
printf("%s最终以最高票数%d票当选人大代表\n",max->name,max->tickets);
}

void printSame(struct Elector * pxm, int total){
    
     char temp[32];
     int t;
    for (int i=0;i<total-1; i++){
        
        for(int j=i;j<total;j++){
            
            if(pxm[i].tickets<pxm[j].tickets){
            
                strcpy(temp,pxm[i].name);
                strcpy(pxm[i].name,pxm[j].name);
                strcpy(pxm[j].name,temp);
                
                t = pxm[i].tickets;
                pxm[i].tickets=pxm[j].tickets;
                pxm[j].tickets=t;
                
            }    
        }
            
    }    
    /**    printf(" 排序后的数据为:\n");
        for (int i=0;i<total; i++){
        
        
            
            printf("姓名:%s , 票数:%d .\n", pxm[i].name, pxm[i].tickets);        
            
    }*/    
    
        printf("票数相同的有:\n");
        int i=0;
        int notsame=0;
        while(i<total-1){
            
                if(pxm[i].tickets==pxm[i+1].tickets){ //如果前后的票数相同则打印他们的信息
                    //printf("in if.\n");
                    printf("姓名:%s , 票数:%d .\n", pxm[i].name, pxm[i].tickets);
                    printf("姓名:%s , 票数:%d .\n", pxm[i+1].name, pxm[i+1].tickets);
                    
                    i++;
                    
                    while((i<total-1)&&(pxm[i].tickets==pxm[i+1].tickets)){ //如果前后的票数相同,则打印后面一个的票数信息,前面那个已经打印所以不再打印
                    
                        //if(strcmp(pxm[i].name,pxm[i+1].name )!=0){
                            
                            //printf("int scond while if,pxm[i].name=%s,pxm[i+1].name=%s .\n",pxm[i].name,pxm[i+1].name);
                        printf("姓名:%s , 票数:%d .\n", pxm[i+1].name, pxm[i+1].tickets);
                    //}
                        
                        notsame=1;  //标志已经不同了,即i已经++
                        i++;
                        
                    }
                }
                
                if(notsame==0){ //如果没有经过比较没有++,则i++,以比较下一个
                    i++;    
                }
                notsame=0;
            
        }
            
        


}

int main()
{
struct Elector *xm = NULL;
int total = 0;
int feipiao = 0;
xm = initXM(xm,&total);
feipiao = doVot(xm,&total);
printXM(xm,feipiao,total);
printSame(xm,total);
return 0;
}

img