题目描述
(线性表)设有一个正整数序列组成的有序单链表(按递增次序有序,且允许有相等的整数存在),试编写能实现下列功能的算法 :(要求用最少的时间和最小的空间)
(1)确定在序列中比正整数x大的数有几个(相同的数只计算一次);
(2) 在单链表将比正整数x小的数按递减次序排列;
输入
输入长度:13
输入数据:4 5 7 7 8 10 11 15 15 16 17 20 20
输入x:10
输出
5
8 7 7 5 4
样例输入
7
1 2 3 4 5 6 6
4
样例输出
2
3 2 1
采用C++方式提交
#include <stdio.h>
#include <stdlib.h>
typedef struct Lnode
{
int data;
struct Lnode *next;
}LinkNode;
void Creat(LinkNode *&L,int n) //创建链表
{
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
int i;
LinkNode *p,*r;
r=L;
for(i=0;i<n;i++)
{
p=(LinkNode *)malloc(sizeof(LinkNode));
scanf("%d",&p->data);
r->next=p;
r=p;
}
r->next=NULL;
}
void Print(LinkNode *p,int max) //递归逆序输出
{
if(p->data == max)
return;
Print(p->next,max);
printf("%d ",p->data);
}
void Find(LinkNode *L,int x)
{
int sum=0,max;
LinkNode *p=L->next,*MaxList;
max=x; //因为存在相同值,所以定义一个变量来保存一次循环中的最大值
while(p!=NULL)
{
if(p->data > max)
{
sum++;
max=p->data;
MaxList=p;
}
p=p->next;
}
printf("%d\n",sum);
Print(L->next,x);
}
int main()
{
int n,m;
LinkNode *head;
scanf("%d",&n);
Creat(head,n);
scanf("%d",&m);
Find(head,m);
return 0;
}