1. 请问如何对这样一组IP地址排序?
95.243.188.67
102.107.11.122
93.131.2.17
95.243.188.67
96.96.12.138
100.181.237.106
223.155.40.25
2. 题目:IP段格式:ip1 ip2。之间以空格分开,ip形式为X.X.X.X,数据保存在文件中,文件不超过2k行,无序。现在要求编写算法去掉可重IP,可重有三种形式:包含、交叠、紧靠。
例如,文件内容为:
10.0.0.0 10.0.0.12
10.0.0.5 10.0.0.10 (<= 包含)
10.0.0.8 10.0.0.15 (<= 交叠)
10.0.0.15 10.0.0.24 (<= 紧靠)
95.243.188.67
102.107.11.122
93.131.2.17
95.243.188.67
96.96.12.138
100.181.237.106
223.155.40.25
method1:
#include <stdio.h>
#include <stdlib.h>
typedef int BYTE ;
typedef struct _IP {
BYTE seg[4];
struct _IP *next;
}IP;
int main()
{
int i, found;
IP *pip, *ptem, *pfind;
BYTE tem_ip[4];
// 循环链表尾指针
pip = (IP *)malloc(sizeof(IP));
pip->next = pip;
printf("Input IP address like:\n192.168.1.11\n10.10.128.11\n......\nInput '0.0.0.0' to end input\n");
while (1)
{
scanf("%d.%d.%d.%d", &tem_ip[0], &tem_ip[1], &tem_ip[2], &tem_ip[3]);
if (!(tem_ip[0] || tem_ip[1] || tem_ip[2] || tem_ip[3]))
break;
ptem = (IP *)malloc(sizeof(IP));
for (i = 0; i < 4; i++)
ptem->seg[i] = tem_ip[i];
found = 0;
pfind = pip;
while (pfind->next != pip)
{
for (i = 0; i < 4; i++)
{
if (ptem->seg[i] < pfind->next->seg[i])
{
found = 1;
break;
}
else if (ptem->seg[i] > pfind->next->seg[i])
{
break;
}
}
if (found)
break;
pfind = pfind->next;
}
ptem->next = pfind->next;
pfind->next = ptem;
}
printf("\nSorted ip address:\n");
ptem = pip->next;
while (ptem != pip) {
printf("%d.%d.%d.%d\n", ptem->seg[0], ptem->seg[1], ptem->seg[2], ptem->seg[3]);
ptem = ptem->next;
}
return 0;
}
method2:
/*
使用C++标准库的快速排序函数
C++的标准库stdlib.h中提供了快速排序函数。
请在使用前加入对stdlib.h的引用:#include <cstdlib> 或 #include <stdlib.h>
qsort(void* base, size_t num, size_t width, int(*)compare(const void* elem1, const void* elem2))
参数表
*base: 待排序的元素(数组,下标0起)。
num: 元素的数量。
width: 每个元素的内存空间大小(以字节为单位)。可用sizeof()测得。
int(*)compare: 指向一个比较函数。*elem1 *elem2: 指向待比较的数据。
比较函数的返回值
返回值是int类型,确定elem1与elem2的相对位置。
elem1在elem2右侧返回正数,elem1在elem2左侧返回负数。
控制返回值可以确定升序/降序。
一个升序排序的例程:
*/
#include <stdio.h>
#include <stdlib.h>
#if 0
int Compare(const void *elem1, const void *elem2)
{
return *((int *)(elem1)) - *((int *)(elem2));
}
int main()
{
int i;
int a[10]= {5, 1 ,2,6,1,2,5,7,8,9};
qsort(a, 10, sizeof(int), Compare);
for (i = 0; i < 10; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
#endif
typedef struct _IP {
int seg[4];
}IP;
int Compare(const void *elem1, const void *elem2)
{
int i;
IP *ptem1 = (IP*)elem1;
IP *ptem2 = (IP*)elem2;
for (i = 0; i < 4; i++)
{
if (ptem1->seg[i] < ptem2->seg[i])
{
return -1;
}
else if (ptem1->seg[i] > ptem2->seg[i])
{
return 1;
}
}
return 0;
}
int main()
{
int i;
IP a[4]= {{5, 1 ,2,6},{1,2,5,7},{8,9,0,9},{1,2,3,4}};
qsort(a, 4, sizeof(IP), Compare);
for (i = 0; i < 4; i++)
printf("%d.%d.%d.%d\n", a[i].seg[0], a[i].seg[1], a[i].seg[2], a[i].seg[3]);
}
2. 题目:IP段格式:ip1 ip2。之间以空格分开,ip形式为X.X.X.X,数据保存在文件中,文件不超过2k行,无序。现在要求编写算法去掉可重IP,可重有三种形式:包含、交叠、紧靠。
例如,文件内容为:
10.0.0.0 10.0.0.12
10.0.0.5 10.0.0.10 (<= 包含)
10.0.0.8 10.0.0.15 (<= 交叠)
10.0.0.15 10.0.0.24 (<= 紧靠)
最后输出为:10.0.0.0 10.0.0.24
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int BYTE ;
typedef struct _IP {
BYTE ip1[4];
BYTE ip2[4];
struct _IP *next;
}IP;
void Print(IP* ptem)
{
printf("%d.%d.%d.%d %d.%d.%d.%d\n", ptem->ip1[0], ptem->ip1[1], ptem->ip1[2], ptem->ip1[3], ptem->ip2[0], ptem->ip2[1], ptem->ip2[2], ptem->ip2[3]);
}
void Print_IP(IP* pip)
{
IP* ptem = pip->next;
while (ptem != pip) {
Print(ptem);
ptem = ptem->next;
}
}
int compare(const void *elem1, const void *elem2)
{
int i, ret = 0;
BYTE *ptem1 = (BYTE*)elem1;
BYTE *ptem2 = (BYTE*)elem2;
for (i = 0; i < 4; i++)
{
if (ptem1[i] < ptem2[i])
{
return -1;
}
else if (ptem1[i] > ptem2[i])
{
return 1;
}
}
return 0;
}
int IpRelation(IP *p1, IP *p2)
{
int ret = 2; // 间隔
switch (compare(p2->ip1, p1->ip2))
{
case 1:
if (p1->ip2[3] + 1 == p2->ip1[3])
ret = 1; // 相邻
break;
case 0:
ret = 3; // 紧靠
break;
case -1:
if (compare(p2->ip2, p1->ip2) == 1)
ret = 4; // 交叠
else
ret = 5; // 包含
}
return ret;
}
int main()
{
int i;
IP *pip, *ptem, *pfind, *qtem;
FILE* fp;
fp = fopen("ip.txt","r");
if (fp == NULL)
{
printf("ip.txt");
printf("doesn't exist\n");
fclose(fp);
return -1;
}
pip = (IP *)malloc(sizeof(IP));
pip->next = pip;
printf("read ip1:ip2 from file.\n");
while (1)
{
ptem = (IP *)malloc(sizeof(IP));
if (fscanf(fp, "%d.%d.%d.%d %d.%d.%d.%d", &ptem->ip1[0], &ptem->ip1[1], &ptem->ip1[2], &ptem->ip1[3], &ptem->ip2[0], &ptem->ip2[1], &ptem->ip2[2], &ptem->ip2[3]) == EOF)
{
free(ptem);
ptem = NULL;
break;
}
pfind = pip;
while (pfind->next != pip)
{
if (-1 == compare(ptem->ip1, pfind->next->ip1))
break;
pfind = pfind->next;
}
ptem->next = pfind->next;
pfind->next = ptem;
}
fclose(fp);
printf("\nSorted ip address:\n");
Print_IP(pip);
ptem = pip->next;
while (ptem->next != pip)
{
qtem = ptem->next;
switch (IpRelation(ptem, qtem))
{
case 2:
ptem = ptem->next;
break;
case 1:
case 3:
case 4:
/* ;如果存在交叠、相邻或紧靠,更新上一行的节点,删除当前行节点 */
memcpy(ptem->ip2, qtem->ip2, sizeof(BYTE)*4);
ptem->next = qtem->next;
free(qtem);
break;
case 5:
ptem->next = qtem->next;
free(qtem);
}
}
printf("\n ip address seg:\n");
Print_IP(pip);
return 0;
}