【问题描述】
编写算法:在顺序表中查找最大值,输出最大值及其在顺序表中的位置(若出现多个相同最大值,位置为第一次出现的)
【输入形式】
输入若干个整数建立顺序表。(若输入整数个数为0,则表示建立空表)
【输出形式】
输出顺序表中最大值及其第一次出现的位置(位序)。(若为空表,则输出“no”)
【样例输入1】
12 34 -90 87 126 -3
【样例输出1】
126 5
【样例输入2】
12 12 12 9 -3 -2
【样例输出2】
12 1
【样例输入3】
e
【样例输出2】
no
【样例说明】
样例3输入e,表示输入非法整数。顺序表没有接收到合法元素,建立空表;因此最大值不存在,输出“no”
顺序表的基本操作在前面的文章已经介绍过,这个问题只需要添加一个查找最大值并返回位序的函数即可;
代码如下:
//查找最大值:返回最大值在顺序表中的位序,若为空表,返回0
int searchMax(Sqlist *L)
{
if(L->length==0)
return 0;
int i,maxnum=0,max=L->slist[0];
for(i=1;i<L->length;i++)
{
if(L->slist[i]>max)
{
max=L->slist[i];
maxnum=i;
}
}
return maxnum+1; //位序要比下标多一
}
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#define INIT_SIZE 5
#define INCREM 3
typedef int ElemType;
typedef struct Sqlist{
ElemType *slist;
int length;
int listsize;
}Sqlist;
//初始化
int initSq(Sqlist *L)
{
L->slist=(ElemType *)malloc(INIT_SIZE*sizeof(ElemType));
if(L->slist==NULL){
return 0;
}
L->length=0;
L->listsize=INIT_SIZE;
return 1;
}
//插入元素
int insertSq(Sqlist *L, ElemType e, int i)
{
if(i<1||i>L->length+1){
return 0;
}
if(L->length>=L->listsize){
L->slist=(ElemType *)realloc(L->slist,(L->listsize+INCREM)*sizeof(ElemType));
if(L->slist==NULL)
return 0;
//L->listsize+=INCREM;
}
int j;
for(j=L->length-1;j>=i-1;j--){
L->slist[j+1]=L->slist[j];
}
L->slist[i-1]=e;
L->length++;
L->listsize+=INCREM;
return 1;
}
//输出顺序表
void printSq(Sqlist *L)
{
int i;
for(i=0;i<L->length;i++)
{
printf("%d ",L->slist[i]);
}
printf("\n");
}
//查找最大值:返回最大值在顺序表中的位序,若为空表,返回0
int searchMax(Sqlist *L)
{
if(L->length==0)
return 0;
int i,maxnum=0,max=L->slist[0];
for(i=1;i<L->length;i++)
{
if(L->slist[i]>max)
{
max=L->slist[i];
maxnum=i;
}
}
return maxnum+1;
}
int main()
{
Sqlist sq;
ElemType e;
if(initSq(&sq)){
while(scanf("%d",&e)==1)
{
insertSq(&sq,e,sq.length+1);
}
//以下补充输出结果代码
int ans;
ans=searchMax(&sq);
if(ans==0)printf("no\n");
else printf("%d %d\n",sq.slist[ans-1],ans);
}
return 0;
}
运行结果如下:
(Ctrl+Z结束输入)