ChinaUnix第一届“C语言”开发大赛的第二题

来源:互联网 发布:php数组转换为字符串 编辑:程序博客网 时间:2024/05/05 04:08
第二题:给定n(3 £ n £ 50000)闭区间[ai, bi](1 £ i £ n, ai,bi均为非负整数),将这些区间合并为不相交的闭区间。输入文件的第一行包含一个整数n,为区间的数目。以下有n行,每行各包括两个空格分隔的整数ai bi,表示一个区间[ai, bi](0 £ ai £ bi £ 1000000)。计算结果写在标准输出上,各区间按照升序排列输出。每一行包含两个用空格分开的整数,分别描述一个区间的上下界。例如,对于下列输入数据:

5

5 6

1 4

10 10

6 9

8 10

输出为:

1 4

5 10

个人写的具体实现,代码如下:
#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct area)
 
/*定义区间结构体*/
struct area
{
 int first;
 int second;
 struct area *next;
};
 
/*最后一次修正数据*/
void lastAmend(area *head)
{
 area *myarea = head->next;
 area *p = myarea;
 while (myarea != NULL && myarea->next != NULL)
 {
  if (myarea->second < myarea->next->first)
  {
   myarea = myarea->next;
  }
  else
  {
   if (myarea->second < myarea->next->second)
   {
    myarea->second = myarea->next->second;
   }
   //删除结点
   p = myarea->next;
   myarea->next = p->next;
   free(p);
  }
 }
}
 
/*按照左区间从小到大的顺序插入节点*/
int insertNode(area *head, area *instertedArea)
{
 while (head->next != NULL)
 {
  if (instertedArea->first < head->next->first)
  {
   area *p = head->next;
   instertedArea->next = p;
   head->next = instertedArea;
   return 0;
  }
  head = head->next;
 }
 head->next = instertedArea;
 instertedArea->next = NULL;
 return 0;
}
 
/*第一次修正数据*/
void firstAmend(area *headOne, area *headTwo)
{  
 area *freedArea;
 area *headDynamic = headOne->next;
 while (headDynamic != NULL)
 {
  bool sig = false;
  area *headTwoTemp = headTwo->next;
  while (headTwoTemp != NULL)
  {
   if (headDynamic->first >= headTwoTemp->first)
   {
    if (headDynamic->first > headTwoTemp->second)
    {
     //继续判断
     sig = true;
    }
    else if (headDynamic->second <= headTwoTemp->second)
    {
           sig = false;
     break;
    }
    else if (headDynamic->second > headTwoTemp->second)
    {
     headTwoTemp->second = headDynamic->second;
     sig = false;
     break;
    }
   }
   else
   {
    if (headDynamic->second < headTwoTemp->first)
    {
     //继续判断
     sig = true;
    }
    else if (headDynamic->second > headTwoTemp->second)
    {
     headTwoTemp->first = headDynamic->first;
     headTwoTemp->second = headDynamic->second;
     sig = false;
     break;
    }
    else if (headDynamic->second <= headTwoTemp->second)
    {
     headTwoTemp->first = headDynamic->first;
     sig = false;
     break;
    }
   }
   headTwoTemp = headTwoTemp->next;
  }
  /*新建结点,插入到第二个链表*/
  if (sig)
  {
   area *temp = (struct area*)malloc(LEN);
   temp->first = headDynamic->first;
   temp->second = headDynamic->second;
   temp->next = NULL;
   insertNode(headTwo,temp);
  }
  
  /*移动到下一个源数据,进行比较*/
  freedArea = headDynamic;
  headDynamic = headDynamic->next;
  /*释放的第一个链表中,刚遍历的节点*/
  free(freedArea);
 }
 /*释放第一个链表的头节点*/
 free(headOne);
}
 
int main(void)
{
 /*输入区间的个数*/
 int count;
 do
 {
  printf("请输入区间的个数:");
  scanf("%d",&count);
  if (count<3 || count>50000)
  {
   printf("输入的区间个数不在区间[3,50000]/n");
  }
 } while(count<3 || count>50000);

 /*输入每个区间,并动态建立链表*/
 bool iswrong;
 area *headOne = (struct area*)malloc(LEN);
 area *headDynamic = headOne;
 area *temp;
 do
 {
  iswrong = false;
  printf("依次输入各个区间/n");
  for (int i=0; i<count; ++i)
  {
   temp = (struct area*)malloc(LEN);
   scanf("%d%d",&temp->first,&temp->second);
   temp->next = NULL;
   if (temp->first>temp->second || temp->first<0 || temp->second>1000000)
   {
    printf("输入的区间错误,不满足:0<=first<=second<=1000000/n");
    iswrong = true;
    break;
   }
   headDynamic->next = temp;
   headDynamic = temp; 
  }
 } while(iswrong);
 area *headTwo = (struct area*)malloc(LEN);
 temp = (struct area*)malloc(LEN);
 temp->next = NULL;
 headTwo->next = temp;
 headDynamic = headOne->next;
 temp->first = headDynamic->first;
 temp->second = headDynamic->second;
 /*具体实现*/
 firstAmend(headOne->next,headTwo);
 
 /*最后一次修正*/
 lastAmend(headTwo);
 /*输出结果*/ 
 printf("输出结果:/n");
 headDynamic = headTwo->next;
 while (headDynamic != NULL)
 {
  printf("%d %d/n",headDynamic->first,headDynamic->second);
  headDynamic = headDynamic->next;
 }
 /*动态释放第二个链表*/ 
 area* releasetemp;
 while (headTwo != NULL)
 {
  releasetemp = headTwo;
  headTwo = headTwo->next;
  free(releasetemp);
 }
 return 0;
}
原创粉丝点击