01-复杂度3 二分查找 (20 分)
本题要求实现二分查找算法。
函数接口定义:
1
| Position BinarySearch( List L, ElementType X );
|
其中List
结构定义如下:
1 2 3 4 5 6
| typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; };
|
L
是用户传入的一个线性表,其中ElementType
元素可以通过>、==、<进行比较,并且题目保证传入的数据是递增有序的。函数BinarySearch
要查找X
在Data
中的位置,即数组下标(注意:元素从下标1开始存储)。找到则返回下标,否则返回一个特殊的失败标记NotFound
。
裁判测试程序样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include <stdio.h> #include <stdlib.h>
#define MAXSIZE 10 #define NotFound 0 typedef int ElementType;
typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; };
List ReadInput(); Position BinarySearch( List L, ElementType X );
int main() { List L; ElementType X; Position P;
L = ReadInput(); scanf("%d", &X); P = BinarySearch( L, X ); printf("%d\n", P);
return 0; }
|
输入样例1:
输出样例1:
输入样例2:
输出样例2:
题解:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
Position BinarySearch( List L, ElementType X ){ int left, mid, right; left = 1; right = L->Last; while(left<=right){ mid = (left+right)/2; if(X<L->Data[mid]) right = right-1; else if(X>L->Data[mid]) left = mid+1; else return mid; } return NotFound; }
|
02-线性结构1 两个有序链表序列的合并 (15 分)
本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。
函数接口定义:
1
| List Merge( List L1, List L2 );
|
其中List
结构定义如下:
1 2 3 4 5 6
| typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List;
|
L1
和L2
是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge
要将L1
和L2
合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的带头结点的链表头指针。
裁判测试程序样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include <stdio.h> #include <stdlib.h>
typedef int ElementType; typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List;
List Read(); void Print( List L );
List Merge( List L1, List L2 );
int main() { List L1, L2, L; L1 = Read(); L2 = Read(); L = Merge(L1, L2); Print(L); Print(L1); Print(L2); return 0; }
|
输入样例:
输出样例:
1 2 3
| 1 2 3 4 5 6 8 10 NULL NULL
|
题解:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| List Merge( List L1, List L2 ){ List pHead = (List)malloc(sizeof(struct Node)); pHead->Next = NULL; List p1 = L1->Next; List p2 = L2->Next; List p3 = pHead; while(p1&&p2){ if(p1->Data < p2->Data){ p3->Next = p1; p3 = p1; p1 = p1->Next; } else{ p3->Next = p2; p3 = p2; p2 = p2->Next; } } if(p1) p3->Next = p1; if(p2) p3->Next = p2; L1->Next = NULL; L2->Next = NULL; return pHead; }
|
未完待续…