基本概念

4 . 一个算法应该是( )。

A. 程序
B. 问题求解步骤的描述
C. 要满足5个基本特性
D. A 和C

5.下面关千算法说法正确的是( ) 。

A. 算法最终必须由计算机程序实现
B . 为解决某问题的算法同为该问题编写的程序含义是相同的
C . 算法的可行性是指指令不能有二义性
D. 以上几个都是错误的

7. 下述( )与数据的存储结构无关。

A. 栈
B. 双向链表
C. 散列表
D. 线索树

11.连续存储设计时,存储单元的地址( )。

A. 一定连续
B. 一定不连续
C. 不一定连续
D. 部分连续,部分不连续

12. 以下属于逻辑结构的是( )。

A. 顺序表
B. 散列表
C. 有序表
D. 单链表

13.T(n)=1000,求O(n);

O(n)=1

14.如下函数mergesort()执行的时间复杂度为多少?假设函数调用被写为mergesort(1,n) ,函数merge()的时间复杂度为O(n) 。

image.png
image.png

顺序表

见81行后

  1. //库函数头文件包含
  2. #include<stdio.h>
  3. #include<malloc.h>
  4. #include<stdlib.h>
  5. //函数状态码定义
  6. #define OK 1
  7. #define OVERFLOW -2
  8. typedef int Status;
  9. //顺序表的存储结构定义
  10. #define LIST_INIT_SIZE 5 //初始化大小
  11. #define LISTINCREMENT 1 //每次增加的大小
  12. typedef int ElemType; //假设线性表中的元素均为整型
  13. typedef struct {
  14. ElemType *elem; //存储空间基地址 //因为是malloc()得到的连续的地址空间,所以也可以当作是整个顺序表(数组)的地址
  15. int length; //表中元素的个数
  16. int listsize; //表容量大小
  17. } SqList; //顺序表类型定义
  18. Status ListInsert_Sq(SqList &L, int pos, ElemType e); //插入
  19. Status ListDelete_Sq(SqList &L, int pos, ElemType &e); //删除
  20. int ListLocate_Sq(SqList L, ElemType e); //定位
  21. void ListPrint_Sq(SqList L); //遍历打印
  22. //结构初始化与销毁操作
  23. Status InitList_Sq(SqList &L) {
  24. //初始化L为一个空的有序顺序表
  25. L.elem = (ElemType *) malloc(LIST_INIT_SIZE * sizeof(ElemType));
  26. if (!L.elem)exit(OVERFLOW);
  27. L.listsize = LIST_INIT_SIZE;
  28. L.length = 0;
  29. return OK;
  30. }
  31. int main() {
  32. SqList L;
  33. if (InitList_Sq(L) != OK) {
  34. printf("InitList_Sq: 初始化失败!!!\n");
  35. return -1;
  36. }
  37. for (int i = 1; i <= 100; ++i)
  38. ListInsert_Sq(L, i, i);
  39. int operationNumber; //操作次数
  40. scanf("%d", &operationNumber);
  41. while (operationNumber != 0) {
  42. int operationType; //操作种类
  43. scanf("%d", &operationType);
  44. if (operationType == 1) { //增加操作
  45. int pos, elem;
  46. scanf("%d%d", &pos, &elem);
  47. ListInsert_Sq(L, pos, elem);
  48. } else if (operationType == 2) { //删除操作
  49. int pos;
  50. ElemType elem;
  51. scanf("%d", &pos);
  52. ListDelete_Sq(L, pos, elem);
  53. printf("%d\n", elem);
  54. } else if (operationType == 3) { //查找定位操作
  55. ElemType elem;
  56. scanf("%d", &elem);
  57. int pos = ListLocate_Sq(L, elem);
  58. if (pos >= 1 && pos <= L.length)
  59. printf("%d\n", pos);
  60. else
  61. printf("NOT FIND!\n");
  62. } else if (operationType == 4) { //输出操作
  63. ListPrint_Sq(L);
  64. }
  65. operationNumber--;
  66. }
  67. return 0;
  68. }
  69. /* 请在这里填写答案 */
  70. Status ListInsert_Sq(SqList &L, int pos, ElemType e) {
  71. L.length++;
  72. if (L.length >= L.listsize) {
  73. L.elem = (ElemType *) realloc(L.elem,
  74. sizeof(int) * (L.listsize + LISTINCREMENT)); //realloc()函数会重新分配连续空间然后复制原来空间中的元素
  75. L.listsize = L.listsize + LISTINCREMENT;
  76. }
  77. if (L.length == 1) {
  78. L.elem[0] = e;
  79. } else {
  80. for (int i = L.length; i >= pos; i--) {
  81. L.elem[i] = L.elem[i - 1];
  82. }
  83. L.elem[pos - 1] = e;
  84. }
  85. }
  86. Status ListDelete_Sq(SqList &L, int pos, ElemType &e) { //pos-1==数组下标
  87. e = L.elem[pos - 1];
  88. for (int i = pos - 1; i < L.length; i++) {
  89. L.elem[i] = L.elem[i + 1];
  90. }
  91. L.length--;
  92. }
  93. int ListLocate_Sq(SqList L, ElemType e) {
  94. for (int i = 0; i < L.length; i++) {
  95. if (L.elem[i] == e) {
  96. return i + 1;
  97. }
  98. }
  99. return -1;
  100. }
  101. void ListPrint_Sq(SqList L) {
  102. for (int i = 0; i < L.length; i++) {
  103. if (i == 0) {
  104. printf("%d", L.elem[i]);
  105. continue;
  106. } else {
  107. printf(" %d", L.elem[i]);
  108. }
  109. }
  110. printf("\n");
  111. }