Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4842269
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-08-20 23:33:40

  这个题目应该不是考什么算法,考数据结构了

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 5

typedef struct list
{
  int num;
  struct list* next;
}LIST;

void init_list(LIST** L)
{
  *L = (LIST*)malloc(sizeof(LIST));
  (*L)->next = NULL;
}

void add_list(LIST* L, int num)
{
  LIST* p = (LIST*)malloc(sizeof(LIST));
  p->num = num;
  p->next = L->next;
  L->next = p;
}

void print_list(LIST* L)
{
  LIST* p = L->next;
  while(p!=NULL)
   {
    printf("%d\t", p->num);
    p = p->next;
   }
  printf("\n");
}

LIST* merge(LIST* L1, LIST* L2)
{
  LIST* L = L1;
  
  LIST* p1 = L1->next;
  LIST* p2 = L2->next;
  LIST* q1;
  LIST* q2;
  
  while(p1!=NULL&&p2!=NULL)
   {
     q1 = p1;
     p1 = p1->next;
     q1->next = p2;
     
     q2 = p2;
     p2 = p2->next;
     q2->next = p1;
   }
  return L;
}

int main(int argc, char *argv[])
{
  int i = 0;
  int num = 0;
  srand((unsigned int)time(NULL));
  
  LIST* L1 = NULL;
  LIST* L2 = NULL;
  
  init_list(&L1);
  init_list(&L2);
  
  for(i=0;i<N;i++)
   {
     num = rand()%100+1;
     add_list(L1, num);
   }

  for(i=0;i<N;i++)
   {
     num = rand()%100+1;
     add_list(L2, num);
   }
  
  printf("list1 is:\n");
  print_list(L1);
  printf("list2 is:\n");
  print_list(L2);
  
  LIST* L = merge(L1,L2);
  printf("list is:\n");
  print_list(L);

  system("PAUSE");    
  return 0;
}

 

上面那个代码有点问题,如果L2比L1长的话,错误就出来了!!!!刚实验室一哥们找到一递归的方法,perfect!!!可怜我想不到啊

 LIST* merge(LIST* L1,LIST* L2)

 {

   if(L1==NULL)

      return L2;

  else

    L1->next = merge(L2,L1->next);

  

   return L1;

 }

 简洁,了当就是有点不好理解!!!!其实递归就是考虑一种情况时的状况就可以了....
 L1 ---  L11 ---  L111 ---  NULL
 L2 ---  L22 ---  L222 ---  NULL
 
 从最前面开始考虑:
 如果L1==null的话直接return L2
 merge(L1,L2) =>   L1->next = merge(L2,L1->next)
 ok对感叹就这么easy
 
 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 5

typedef struct list
{
  int num;
  struct list* next;
}LIST;

void init_list(LIST** L)
{
  *L = (LIST*)malloc(sizeof(LIST));
  (*L)->next = NULL;
}

void add_list(LIST* L, int num)
{
  LIST* p = (LIST*)malloc(sizeof(LIST));
  p->num = num;
  p->next = L->next;
  L->next = p;
}

void print_list(LIST* L)
{
  LIST* p = L->next;
  while(p!=NULL)
   {
    printf("%d\t", p->num);
    p = p->next;
   }
  printf("\n");
}

LIST* merge(LIST* L1, LIST* L2)
{
  LIST* L = L1;
  
  LIST* p1 = L1->next;
  LIST* p2 = L2->next;
  LIST* q1;
  LIST* q2;
  
  while(p1!=NULL&&p2!=NULL)
   {
     q1 = p1;
     p1 = p1->next;
     q1->next = p2;
     
     q2 = p2;
     p2 = p2->next;
     
     if(p1!=NULL)
       q2->next = p1;
   }
   if(p1==NULL)
    q1->next = q2;
         
  return L;
}

LIST* merge1(LIST* L1, LIST* L2)
{
  if(L1==NULL)
    return L2;
  else
    L1->next = merge1(L2, L1->next);
    
   return L1;
}

int main(int argc, char *argv[])
{
  int i = 0;
  int num = 0;
  srand((unsigned int)time(NULL));
  
  LIST* L1 = NULL;
  LIST* L2 = NULL;
  
  init_list(&L1);
  init_list(&L2);
  
  for(i=0;i<N-2;i++)
   {
     num = rand()%100+1;
     add_list(L1, num);
   }

  for(i=0;i<N;i++)
   {
     num = rand()%100+1;
     add_list(L2, num);
   }
  
  printf("list1 is:\n");
  print_list(L1);
  printf("list2 is:\n");
  print_list(L2);
  
  #if 0
  LIST* L = merge(L1,L2);
  printf("list is:\n");
  print_list(L);
  #endif
  
  #if 1
  L1->next = merge1(L1->next,L2->next);
  printf("list is:\n");
  print_list(L1);
  #endif

  system("PAUSE");    
  return 0;
}

阅读(1059) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~