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)
#include <malloc.h>
#define LEN sizeof(struct area)
/*定义区间结构体*/
struct area
{
int first;
int second;
struct area *next;
};
{
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);
}
}
}
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;
}
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;
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;
{
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(freedArea);
}
/*释放第一个链表的头节点*/
free(headOne);
}
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);
{
/*输入区间的个数*/
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;
temp = (struct area*)malloc(LEN);
temp->next = NULL;
headTwo->next = temp;
headDynamic = headOne->next;
temp->first = headDynamic->first;
temp->second = headDynamic->second;
temp->first = headDynamic->first;
temp->second = headDynamic->second;
/*具体实现*/
firstAmend(headOne->next,headTwo);
/*最后一次修正*/
lastAmend(headTwo);
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;
}
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);
}
area* releasetemp;
while (headTwo != NULL)
{
releasetemp = headTwo;
headTwo = headTwo->next;
free(releasetemp);
}
return 0;
}
}
- ChinaUnix第一届“C语言”开发大赛的第二题
- ChinaUnix第一届“C语言”开发大赛的第二题
- ChinaUnix第一届“C语言”开发大赛的第一题
- ChinaUnix第一届“C语言”开发大赛的第一题
- ChinaUnix第一届“C语言”开发大赛的第三题
- ChinaUnix第一届“C语言”开发大赛的第三题
- 河南省第二届程序设计大赛 第一题 Dr.Kong的机器人
- CSDN的C语言大赛一题
- 第二届 “国信蓝点”软件设计大赛 C语言模拟题(附程序题 解题程序)
- C语言大赛 第七题
- 第二届“顶嵌杯”全国嵌入式系统C语言编程大赛初赛试题分析及题解
- 第二届“顶嵌杯”全国嵌入式系统C语言编程大赛初赛题目及源代码
- 第七届蓝桥杯大赛个人赛决赛(软件类C语言B组)第一题:一步之遥
- 郑州大学第一届程序设计大赛 第一题
- iOS开发第一个轮回(C语言第二天笔记)
- 第二届程序设计大赛 正确的IP
- C语言大赛
- 我的第一届acm大赛
- STL线程安全
- FCK常用Js,获取FCK内容,统计FCK字数,向FCK写入指定代码
- 在c#中关于线程调用控件
- Siebel CRM 全接触
- OO设计原则
- ChinaUnix第一届“C语言”开发大赛的第二题
- 使AIR桌面程序窗口最大化。
- 命令行下查看进程信息(wmic)
- dtree 动态树型菜单
- 谈谈职业规划
- Java中使用Runtime和Process类运行外部程序
- SharePoint - Error: Service Unavailable HTTP Error 503. The service is unavailable
- JMS开发步骤
- Symbian 无法进入程序原因归总