2011年考研计算机统考408真题算法题
题目如图所示算法思想(使用c++语言):(1)利用带头结点的单链表存储升序序列。(2)计算中位数K的位置,(3)由于序列递增有序,通过循环比较两个链表结点的值,将结点值较小的结点所在链表移到下一结点,并递减K,当K为0时即找到中位数注:当然可以用两个一维数组,计算中位数K的位置,通过改变下标来找到中位数,我这里是想多多练习单链表,408在链表上出编程题蛮多的,同时带头结点的单链表处理起来方便一些。
·
题目如图所示
算法思想(使用c++语言):
(1)利用带头结点的单链表存储升序序列。
(2)计算中位数K的位置,
(3)由于序列递增有序,通过循环比较两个链表结点的值,将结点值较小的结点所在链表移到下一结点,并递减K,当K为0时即找到中位数
注:当然可以用两个一维数组,计算中位数K的位置,通过改变下标来找到中位数,我这里是想多多练习单链表,408在链表上出编程题蛮多的,同时
带头结点的单链表处理起来方便一些。
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode* next;
}Node,*Link;
void Init(Link& link)
{
link = (Link)malloc(sizeof(Node));
link->next = NULL;
}
///构造两个升序序列,遇到大于等于9999的数便停止
void Input(Link& link)
{
Node* p = link;
int x;
scanf("%d", &x);
while (x < 9999)
{
Node* s = (Node*)malloc(sizeof(Node));
s->data = x;
p->next = s;
p = s;
scanf("%d", &x);
}
p->next = NULL;
}
//计算链表长度
int GetLen(Link link)
{
Node* p = link;
int len = 0;
while (p->next != NULL)
{
len++;
p = p->next;
}
return len;
}
//找出序列s1和s2的中位数
void Func(Link s1, Link s2)
{
int len1 = GetLen(s1);//计算每个链表的长度
int len2 = GetLen(s2);
int k = (len1 + len2) / 2;//计算中位数所在位置
if ((len1 + len2) % 2 == 1)
k += 1;
//用t保存最终的中位数
//每次循环比较两个链表结点的值,t保存其中较小者,
//并将结点值较小的结点所在链表移到下一结点,最后递减K
Node* p1 = s1, * p2 = s2; int t;
while (k > 0 && p1->next != NULL && p2->next != NULL)
{
if (p1->next->data > p2->next->data)
{
t = p2->next->data;
p2 = p2->next;
}
else
{
t = p1->next->data;
p1 = p1->next;
}
k--;
}
//尾部处理,下面两个循环最多只会执行一个
//若一个链表比另一个链表长得多,
//上面循环的结束是因为较短链表的next为NULL,但k>0
//这里的处理类似于归并算法中的尾部处理
while (k > 0 && p1->next != NULL)
{
t = p1->next->data;
p1 = p1->next;
k--;
}
while (k > 0 && p2->next != NULL)
{
t = p2->next->data;
p2 = p2->next;
k--;
}
printf("中位数:%d", t);
}
int main()
{
Link s1, s2;
Init(s1);
Init(s2);
Input(s1);
Input(s2);
Func(s1, s2);
return 0;
}
三组测试用例
11 13 15 17 19 9999
2 4 6 8 20 9999
1 2 3 4 5 6 7 8 9 10 11 12 13 14 9999
1 2 3 9999
1 2 3 9999
1 2 3 4 5 6 7 8 9 10 11 12 13 14 9999
更多推荐
已为社区贡献2条内容
所有评论(0)