优化以下代码#include<stdio.h> #define LIST_SIZE 100 typedef struct { int r[LIST_SIZE]; int length; }RecordList; //顺序查找 int SeqSearch(RecordList l,int k) { int i; i=l.length; while(i>=0&&l.r[i]!=k) i--; if(i>=0) return i+1; else return 0; } //冒泡排序 void MP(RecordList l) { int i,j,tmp; for(i=1;i<=l.length-1;i++) for(j=0;j<=l.length-1-i;j++) if(l.r[j]>l.r[j+1]) { tmp=l.r[j]; l.r[j]=l.r[j+1]; l.r[j+1]=tmp; } } //折半查找 int BinSrch(RecordList l,int k) { int low=1,high,mid; high=l.length; while(low<=high) { mid=(low+high)/2; if(k==l.r[mid]) return mid; else if(k<l.r[mid]) high=mid-1; else low=mid+1; } return 0; } //输入 void S(RecordList *l) { int key,i=0; printf("请输入不超过100个整数建立线性查找表,每次输入一个,以-9999结束输入:\n"); scanf("%d",&key); getchar(); while(key!=-9999) { l->r[i]=key; i++; l->length++; scanf("%d",&key); getchar(); } } //输出 void F(RecordList l) { int i; for(i=0;i<l.length;i++) printf("%d ",l.r[i]); printf("\n"); } int main() { int k1,k2,c1,c2; RecordList l; l.length=0; S(&l); F(l); printf("请输入要查找的元素关键字:"); scanf("%d",&k1); c1=SeqSearch(l,k1); if(c1>0) printf("顺序查找成功,元素位置是:%d\n",c1); else printf("顺序查找失败!\n"); printf("现在进行折半查找,请输入要查找的元素关键字:"); scanf("%d",&k2); MP(l); c2=BinSrch(l,k2); if(c2>0) printf("折半查找成功,元素位置是:%d\n",c2); else printf("折半查找失败!"); }
时间: 2023-12-10 15:03:08 浏览: 251
若依管理存在任何文件读取漏洞检测系统,渗透测试.zip
有以下几个可以优化的地方:
1. SeqSearch 函数中的 while 循环条件可以改为 i>0,这样可以避免多余的一次比较。
2. MP 函数中的内循环条件可以改为 j<l.length-i,因为最后一次比较已经确定了最大值,不需要再进行比较。
3. S 函数中的 while 循环可以改为 for 循环,这样更加简洁明了。
4. 折半查找函数中可以添加判断,如果 mid 的值已经大于或小于 k,则直接返回 0,可以减少一些比较次数。
优化后的代码如下:
```
#include<stdio.h>
#define LIST_SIZE 100
typedef struct {
int r[LIST_SIZE];
int length;
}RecordList;
//顺序查找
int SeqSearch(RecordList l,int k) {
int i = l.length;
while(i>0 && l.r[i-1]!=k) {
i--;
}
if(i>0) {
return i;
}
else {
return 0;
}
}
//冒泡排序
void MP(RecordList l) {
int i,j,tmp;
for(i=1;i<l.length;i++) {
for(j=0;j<l.length-i;j++) {
if(l.r[j]>l.r[j+1]) {
tmp=l.r[j];
l.r[j]=l.r[j+1];
l.r[j+1]=tmp;
}
}
}
}
//折半查找
int BinSrch(RecordList l,int k) {
int low=0,high,mid;
high=l.length-1;
while(low<=high) {
mid=(low+high)/2;
if(k==l.r[mid]) {
return mid+1;
}
else if(k<l.r[mid]) {
high=mid-1;
}
else {
low=mid+1;
}
}
return 0;
}
//输入
void S(RecordList *l) {
int key,i;
printf("请输入不超过100个整数建立线性查找表,每次输入一个,以-9999结束输入:\n");
for(i=0;i<LIST_SIZE;i++) {
scanf("%d",&key);
if(key==-9999) {
break;
}
l->r[i]=key;
l->length++;
}
}
//输出
void F(RecordList l) {
int i;
for(i=0;i<l.length;i++) {
printf("%d ",l.r[i]);
}
printf("\n");
}
int main() {
int k1,k2,c1,c2;
RecordList l;
l.length=0;
S(&l);
F(l);
printf("请输入要查找的元素关键字:");
scanf("%d",&k1);
c1=SeqSearch(l,k1);
if(c1>0) {
printf("顺序查找成功,元素位置是:%d\n",c1);
}
else {
printf("顺序查找失败!\n");
}
printf("现在进行折半查找,请输入要查找的元素关键字:");
scanf("%d",&k2);
MP(l);
c2=BinSrch(l,k2);
if(c2>0) {
printf("折半查找成功,元素位置是:%d\n",c2);
}
else {
printf("折半查找失败!");
}
return 0;
}
```
阅读全文