二、简答题:
1、
(1)请描述进程和线程的区别?
(2)多线程程序有什么优点、缺点?
(2)多进程程序有什么优点、缺点?与多线程相比,有何区别?
2、编程(www.cppentry.com)题:
写代码,反转一个单链表,分别以迭代和递归的形式来实现
[cpp]
typedef struct node LinkNode;
struct node
{
int data;
LinkNode* next;
};
// 返回新链表头节点
LinkNode *reverse_link(LinkNode *head)
LinkNode *reverse_link_recursive(LinkNode *head)
[cpp]
// 返回新链表头节点
LinkNode *reverse_link(LinkNode *head)
{
if(head == NULL)
return NULL;
LinkNode *prev , *curr , *reverse_head , *temp;
prev = NULL , curr = head;
while(curr->next)
{
temp = curr->next;
curr->next = prev;
prev = curr;
curr = temp;
}
curr->next = prev;
reverse_head = curr;
return reverse_head;
}
LinkNode *reverse_link_recursive(LinkNode *head)
{
if(head == NULL)
return NULL;
LinkNode *curr , *reverse_head , *temp;
if(head->next == NULL) // 链表中只有一个节点,逆转后的头指针不变
return head;
else
{
curr = head;
temp = head->next; // temp为(a2,…an)的头指针
reverse_head = reverse_link_recursive(temp); // 逆转链表(a2,…an),并返回逆转后的头指针
temp->next = curr; // 将a1链接在a2之后
curr->next = NULL;
}
return reverse_head; // (a2,…an)逆转链表的头指针即为(a1,a2,…an)逆转链表的头指针
}
3、给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列。
如:1、-2、3、5、-4、6 连续序列3、5、-4、6的和最大。
如元素全为负数,则最大的和为0,即一个也没有选。
/*
array[] 输入数组
n 数组元素个数
返回最大序列和
*/
int find_max_sum(int array[] , int n)
[cpp] view plaincopy
int find_max_sum(int array[] , int n)
{
int i , max , sum;
sum = max = array[0];
for(i = 1 ; i < n ; ++i)
{
if(sum < 0)
sum = array[i];
else
sum += array[i];
if(sum > max)
max = sum;
}
if(max < 0)
max = 0;
return max;
}
三、设计题
1、设计一个图片存储系统:假设有一个相册系统,每个用户不限制上传的图片数目,每张相片压缩后都在1M以内,需求如下:
(1)文件数量太大,采用传统的文件系统存储导致目录系统非常臃肿,访问速度变得缓慢;
(2)单机存储容量已经远远不能承载所有的文件;
(3)上传之后,用户只有读取操作和删除操作,不支持修改,整个系统读写比例10:1