Chinaunix首页 | 论坛 | 博客
  • 博客访问: 464016
  • 博文数量: 68
  • 博客积分: 2606
  • 博客等级: 上尉
  • 技术积分: 1308
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-13 23:01
文章分类
文章存档

2012年(6)

2011年(62)

分类: C/C++

2011-09-17 09:29:19

------------------------------------------
本文为本人原创,欢迎转载!
转载请注明出处:snowboy.blog.chinaunix.net
雪夜流星
------------------------------------------
n年没笔试了,9月16号迎来了笔试第一站,试卷分为两部分,第一部分是选择题,第二部分是综合题。选择题依稀记得有个arp的功能(把ip地址转换为mac地址),下面贴一下综合题。
 
1.找出一个序列中的最长递减子序列,如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2};代码实现如下:
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>

  4. #define MAX_LEN 255

  5. /*****************************************************************************************
  6. *功能描述:找出一个序列中的最长递减子序列,如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}
  7.          
  8. *传入参数:str:源数组首地址, len:数组的长度          
  9.                 
  10. *传出参数:str:递减子序列的数组首地址,传入参数和传出参数空间复用,降低空间复杂度        
  11.                   
  12. *返回值: 递减子序列的数组首地址
  13.                         
  14.  ****************************************************************************************/
  15. char *substring(char *str, int len)
  16. {
  17.     char b[MAX_LEN] = {0};//定义数组长度必须为常量,不能为变量或者只读变量
  18.     int i, j, k=0, tmp;

  19.     if ((str == NULL)||(len <1))
  20.     {
  21.         return NULL;
  22.     }
  23.     
  24.     for (i=0; i<len; i++)
  25.     {
  26.         tmp = str[i];
  27.         for (j=i+1; j<len; j++)//遍历当前元素后面的所有元素,如果有比当前元素大的则退出循环
  28.         {
  29.             if (str[i] <= str[j])
  30.             {
  31.                 break;
  32.             }
  33.         }
  34.         if (j == len)//循环正常结束,即后面没有比当前数要大的,将其则放入新数组中
  35.         {
  36.             b[k] = tmp;
  37.             k++;
  38.         }
  39.     }
  40.     b[k] = '\0';//最后将新数组赋结束符

  41.     strcpy(str, b);//将新数组元素拷贝到源数组中,复用空间
  42.     
  43.     return str;
  44. }

  45. int main(void)
  46. {
  47.     char a[10] = "954325432";
  48.     char *b;
  49.     b = substring(a, 10);
  50.     printf("b:%s\n", b);

  51.     return 0;
  52. }

2.将两个有序链表合并成为一个有序链表(附带测试程序)

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct node
  4. {
  5.     int data;
  6.     struct node *next;
  7. }link;

  8. /*****************************************************************

  9. *功能描述:合并两个带头结点的有序链表使其仍然有序
  10.   
  11. *传入参数:head1,head2:两个有序链表
  12.     
  13. *传出参数:无
  14.     
  15. *返回值: 合并后的有序链表的头指针
  16.         
  17.  ****************************************************************/
  18. link *mergelist(link *head1, link *head2)
  19. {
  20.     link *pa = NULL;
  21.     link *pb = NULL;
  22.     link *pc = NULL;
  23.     link *head3 = NULL;
  24.     
  25.     pa = head1->next;
  26.     pb = head2->next;
  27.     head3 = pc = head1;

  28.     while ((pa != NULL) && (pb != NULL))
  29.     {
  30.         if (pa->data <= pb->data)
  31.         {
  32.             pc->next = pa; pc = pa; pa = pa->next;
  33.         }
  34.         else
  35.         {
  36.             pc->next = pb; pc = pb; pb = pb->next;
  37.         }
  38.     }
  39.     pc->next = pa ? pa : pb;//插入剩余段
  40.     free(head2);

  41.     return head3;
  42. }

  43. /*创建带头结点的链表*/
  44. link *creat(void)
  45. {    
  46.     link *head = NULL;
  47.     link *tail = NULL;
  48.     link *cur = NULL;    
  49.     int x;     
  50.     
  51.     head = (link *)malloc(sizeof(link));
  52.     
  53.     if(!head)        
  54.     {        
  55.         printf("malloc error\n");        
  56.         exit(1);        
  57.     }
  58.     
  59.     tail = head;    
  60.     
  61.     while(1)        
  62.     {
  63.         
  64.         printf("please input data:");        
  65.         scanf("%d", &x);        
  66.         if(x <= 0)            
  67.         {            
  68.             break;            
  69.         }
  70.         
  71.         cur = (link *)malloc(sizeof(link));
  72.         
  73.         if(!cur)            
  74.         {            
  75.             printf("malloc error\n");            
  76.             exit(1);            
  77.         }
  78.         
  79.         cur->data = x;        
  80.         cur->next = NULL;        
  81.         tail->next = cur;        
  82.         tail = cur;        
  83.     }    
  84.     printf("creat list success\n");
  85.         
  86.     return head;    
  87. }

  88. /*打印带头结点的链表*/
  89. void printl(link * head)
  90. {    
  91.     link *p = NULL;
  92.     
  93.     if(!head)        
  94.     {        
  95.         return;        
  96.     }
  97.     
  98.     for(p=head->next; p; p=p->next)        
  99.     {        
  100.         printf("%d ", p->data);        
  101.     }
  102.     
  103.     printf("\n");
  104.     
  105.     return;    
  106. }

  107. int main(void)
  108. {
  109.     link *head1, *head2, *head3;
  110.     head1 = creat();
  111.     head2 = creat();
  112.     printl(head1);
  113.     printl(head2);
  114.     head3 = mergelist(head1, head2);
  115.     printl(head3);
  116.     
  117.     return 0;
  118. }
小结:这个公司招的人少,笔试的人却很多,僧多粥少,准备迎接下一站,希望后面的路会更顺利。
阅读(1464) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~