Ip ip段去重Java算法_IP地址排序、IP区段去重 | 学步园

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

method1:

#include

#include

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 或 #include

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

#include

#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行,无序。现在要求编写

例如,文件内容为:

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

#include

#include

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值