第二次测验的主要内容是通用算法的设计,题量比上一次测验稍微大一些。
1、有的算法可以适用于不同的数据结构,将这些较为通用的算法从数据结构中独立出来,可以使得预定义的操作作用于不同类型的数据,以此提高类型的安全性和程序的重用性,这就是?
答案:泛型技术
2、要交换两个变量的值,要设计通用代码,交换数据的函数原型应设计为?
答案:
void swap(void *a, void *b, int size);
3、要交换两个变量的值,要实现通用算法(交换任意数据类型的数据),可以用内存管理函数复制要交换的两块内存空间的值,例如,可以利用?
答案:memcpy
4、要调用 void swap(void *a, void *b, int size)
函数交换两个字符串
char *s1 = strdup("hello");
char *s2 = strdup("world");
调用语句为?
答案:
swap(&s1, &s2, sizeof(char *));
5、对于指定数据类型的数组,由于已知每个元素的数据类型,每个元素的值所占内存空间就是已知的,编译器可根据数组的首地址和下标计算某元素的实际地址。
6、对于通用搜索函数void *search(void *a, void *k, int n, int m)
,参数 n 表示元素个数,m 表示的是什么?
答案:要查找的数据的数据类型所占字节数
7、对于void *search(void *a, void *k, int n, int m)
,在具体实现时,每搜索一个元素,就要先计算该元素的地址。第 i 个元素的地址计算公式为?
答案:loc = (char *)a + i * m
8、查找某值时,如果不知道数据类型,就只能按两块内存地址的位模式进行比较。例如,用 memcmp。memcmp 的调用格式:memcmp(内存地址1,内存地址2,要比较的字节数)。该函数比较两个内存块,如果它们的位模式相同就返回?
答案:0
9、对于通用搜索函数void *search(void *a, void *k, int n, int m)
,假如有
char *osl = {"dos", "win", "centos", "ubuntu", "mac"};
char *k = "linux";
正确的调用语句是?
答案:
int *r = NULL;
for (int j = 0; j < 5; j++) {
r = search(os[j], k, 5, sizeof(char));
if (r != NULL)
break;
}
10、不同的数据类型用同样的 memcmp 实现,针对简单数据类型没有什么问题,对于较为复杂的数据结构,如数组、结构体等会失去通用性。因此,通用搜索函数的解决方案之一是再增加一个参数,用于传入特定数据类型的比较函数。这样的函数原型如下:void *search(void *a, void *k, int n, int m, int (*compare)(void *, void *));
,其中,compare 是一个:
答案:指向一个比较函数的指针
11、对于通用搜索函数 void *search(void *a, void *k, int n, int m, int (*compare)(void *, void *))
,假如有
char *osl = {“dos", "win", "centos", "ubuntu", "mac"};
char *k = "linux";
cmp 是一个比较函数,则正确的调用语句是?
答案:
search(os, &k, 5, sizeof(char *), cmp);
12、要实现通用栈,设计 stack,定义类型为:
typedef struct {
int *d;
int n;
int m;
int b;
} stack;
其中,d 为指向元素的指针,n 为元素个数,m 为栈容量,b 为元素所占字节数。入栈函数为?
void push(stack *s, void *v) {
____;
____;
s->n++;
}
答案:
void *a = (char *)s->d + s->n * s->b;
memcpy(a, v, s->b);
13、要实现通用队列,设计 queue,定义类型为:
typedef struct {
void *buf;
int front, rear;
int max;
int size;
} queue;
其中,buf 为队列的首地址,front 指向队头,rear 指向对尾,max 为队列容量,size 为队列元素所占字节数。元素出队列的函数 void out(queue *q, void *val)
的代码为?
答案:
void *addr = (char *)q->buf + q->rear * q->size;
memcpy(val, addr, q->size);
q->rear++;