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 <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;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值