编程思维训练2:多种方法统计汽车罚分

设有 3 辆汽车牌号为 219 362 639 。车管所查到的违规罚分情况如下数组:

  /*车牌号数据*/

  int car[10]={219,362,639, 219, 639, 219, 219,362,639,362};

  /*对应的罚分*/

  int score[10]={3,2,6,3,2,3,6,1,3,2};

  编程统计输出罚分满12分的车牌号。

常规的编程思路如func1,根据车牌号,搜索累加分数,当达到或超过12分时输出;缺点是每个车牌号都需要从头搜索数据,比较耗时;

func2定义一个计分数组data,将车牌号数字对应数组下标,这样只需要一次数据扫描即可完成统计,每次统计的语句为:

data[car[i]]+=score[i];

缺点是需要较大的存储空间data

func3采用单链表来动态存储数据,每次存储计算分数时,先搜索链表,找到后累加分数并判断输出;如果没有找到,则新建节点,填充数据。总体来看,效率略高。缺点是,离头结点远的数据查找需要耗时。

func4也是采用单链表,但作了一个调整,每次新建的节点插入在头结点之后,主要是基于新的罚分应该优先被查询,这样已因超12分被输出的车牌数据将被逐步放在链表后,从而提高搜索效率。

func5是对func4代码的修改,用递归形式处理查询输出。 

完整的代码如下:

#include<stdio.h>
#include<malloc.h>
int car[10]= {219,362,639,219,639,219,219,362,639,362};
int score[10]= {3,2,6,3,2,3,6,1,3,2};
int func1() {
	int carno[3]= {219,362,639};
	for(int i=0; i<3; i++) {
		int n=0;
		for(int j=0; j<10; j++) {
			if(car[j]==carno[i])  n=n+score[j];
			if(n>=12) {
				printf("%d,%d\n",carno[i],n);
				break;
			}
		}
	}
}
int func2() {
	int data[999]= {0};
	for(int i=0; i<10; i++) {
		data[car[i]]+=score[i];
		if(data[car[i]]>=12) {
			printf("%d,%d\n",car[i],data[car[i]]);
			break;
		}
	}
}

struct car {
	int no;
	int score;
	struct car *next;
};
struct car *Head;
int sum_score(int no,int score) {
	struct car *p=Head,*q=p->next;
	while(q) {
		if(q->no==no) {
			q->score+=score;
			if(q->score>=12) {
				printf("%d,%d\n",q->no,q->score);				
			}
			return 1;
		}
		p=q;
		q=q->next;
	}
	struct car *newcar;
	newcar=(struct car *)malloc(sizeof(struct car));
	newcar->no=no;
	newcar->score=score;
	p->next=newcar;
	newcar->next=NULL;
	if(newcar->score>=12) {
		printf("%d,%d\n",newcar->no,newcar->score);
		return 1;
	} else
		return 0;
}

int func3() {
	Head=(struct car *)malloc(sizeof(struct car));
	Head->next=NULL;
	for(int i=0; i<10; i++) {
		sum_score(car[i],score[i]);
	}
}
struct car *Head2;
int sum_score2(int no,int score) {
	struct car *p=Head2->next;
	while(p!=NULL) {
		if(p->no==no) {
			p->score+=score;
			if(p->score>=12) {
				printf("%d,%d\n",p->no,p->score);
			}
			return 1;
		}
		p=p->next;
	}
	struct car *newcar;
	newcar=(struct car *)malloc(sizeof(struct car));
	newcar->no=no;
	newcar->score=score;
	newcar->next =Head2->next;
	Head2->next=newcar;
	if(newcar->score>=12) {
		printf("%d,%d\n",newcar->no,newcar->score);
		return 1;
	} else
		return 0;
}
int func4() {
	Head2=(struct car *)malloc(sizeof(struct car));
	Head2->next=NULL;
	for(int i=0; i<10; i++) {
		sum_score2(car[i],score[i]);
	}
}
struct car *Head3;
int sum_score3(struct car *p,int no,int score) {
	if(p!=NULL) {
		if(p->no==no) {
			p->score+=score;
			if(p->score>=12) {
				printf("%d,%d\n",p->no,p->score);
			}
			return 1;
		} else sum_score3(p->next,no,score);
	} else {
		struct car *newcar;
		newcar=(struct car *)malloc(sizeof(struct car));
		newcar->no=no;
		newcar->score=score;
		newcar->next =Head3->next;
		Head3->next=newcar;
		if(newcar->score>=12) {
			printf("%d,%d\n",newcar->no,newcar->score);
			return 1;
		} else
			return 0;
	}
}
int func5() {
	Head3=(struct car *)malloc(sizeof(struct car));
	Head3->next=NULL;
	for(int i=0; i<10; i++) {
		sum_score3(Head3->next,car[i],score[i]);
	}
}
int main() {
	func1();
	func2();
	func3();
	func4();
	func5();
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丁亚涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值