设有
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();
}