绝大多数的安全设备都是按照2oo2结构设计的,两块相同的板卡,当二者的输出相同时,才为真,作为最终的结果。
由于二者发送数据不同步,接收设备经常会接收到双份的重复数据,如何对重复的数据进行过滤判断,现在实现一下接口程序。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define GM_BOOL int
#define MAX_ListNum 10 /*定义链表中结点的最大个数 */
#define GM_TRUE 1
#define GM_FALSE 0
#define GM_UINT32 int
/*定义链表的结点*/
typedef struct list
{
int num;
struct list *next;
}node;
typedef struct data /*定义数据包格式*/
{
int dataID;
/*其他数据部分*/
}Data_MSG;
node *ListRearInsert(node *head,int stud);/*链表尾部插入结点函数 */
node *ListDelete(node *head,int num); /*删除链表中某特定的结点函数*/
node *ListHeadDelete(node *head); /*删除头结点 */
GM_BOOL DataFilter(Data_MSG *data,node *p1);
node *ListFindNode(node *head, int num); /*寻找链表结点函数*/
node *ListRearInsert(node *head,int stud)/*在链表的尾部插入结点*/
{
node *p1,*p2;
p1 = head;
p2 = (node *)malloc(sizeof(node));/*开辟一个新的空间*/
p2->num = stud;
if(head ==NULL) /*如果链表为空 */
{
head = p2;
p2->next = NULL;
printf("插入:%d 作为链表的一个结点\n",stud);
}
else
{
while( p1->next!=NULL )
{
p1= p1->next;
}
/*此时p1为链表的尾结点*/
p1->next = p2; /*将p2结点插入p1后面 */
p2->next = NULL;
}
return head;
}
/*在链表中删除某个结点函数*/
node *ListDelete(node *head,int num)
{
node *p1,*p2; /*p1指向当前结点,p2为当前结点的前一结点,p2->next=p1*/
if(head == NULL) /*如果链表为空的话*/
{
printf("\nlist null!\n");
return head;
}
p1 = head;
while((num!=p1->num) && (p1->next!=NULL)) /*从头结点开始遍历,若p1指向的内容不是头结点,并且后面还有结点*/
{
p2 = p1; /*相当于p2和p1一起向后移动,p2为p1的前一个结点*/
p1 = p1->next; /*p1向后移动*/
}
if(num == p1->num ) /*找到了要删除的结点*/
{
if(p1 == head) /*若要删除的结点是首结点,把第二个结点地址赋值给头结点*/
head = p1->next;
else
p2->next = p1->next; /*否则将下一结点地址赋值给前一结点的地址*/
printf("delete :%ld\n",num);
}
else
printf("%ld not been found!\n",num);
return head;
}
/*删除链表的头结点函数*/
node *ListHeadDelete(node *head)
{
node *p1; /*p1指向当前结点,p2为当前结点的前一结点,p2->next=p1*/
if(head == NULL) /*如果链表为空的话*/
{
printf("\nlist null!\n");
return head;
}
else
{
p1 = head;
head = p1->next;
return head;
}
}
/*寻找结点函数*/
node *ListFindNode(node *head, int IDnum)
{
node *p1, *p2 = NULL; /*p2存放该结点地址,并初始化*/
p1 = head;
if(NULL == head)
{
p2 = p1; /*返回值为空,没有找到*/
}
else
{
while(p1 != NULL )
{
if(p1->num == IDnum)
{
break;/*说明此时找到该结点*/
}
p1 = p1->next;
}
p2 = p1;/*找到该节点,也可能链表中没有该结点(p2==NULL)*/
}
return p2;
}
/*数据包过滤函数*//*要求链表的前期为链表的插入*/
GM_BOOL DataFilter(Data_MSG *data,node *p2)
{
GM_BOOL result = GM_FALSE;
static GM_UINT32 nodenum = 0; /*nodenum中存放链表中结点数目*/
static node *p1 = p2;
if(NULL == ListFindNode(p1,data->dataID))/*链表中没有该结点,链表为空或者链表中没有该结点*/
{
p1 = ListRearInsert(p1,data->dataID);/*为空插入结点*/
printf("%d 该数据包未被过滤\n",data->dataID);
nodenum++;
if(nodenum > MAX_ListNum) /*若链表中的数据大于100个结点,认为此时是单系在工作*/
{
p1 = ListHeadDelete(p1); /*删除链表中的第一个结点*/
nodenum--;
printf("此时链表中结点个数为:%d\n",nodenum);
}
result = GM_FALSE;
}
else /*链表不为空,在链表中找到了该结点*/
{
p1 = ListDelete(p1,data->dataID);/*删除该节点*/
printf("%d 该数据包已过滤\n",data->dataID);
nodenum--;
result = GM_TRUE; /*该节点已被过滤过*/
}
return result;
}
void main()
{
int i = 0;
Data_MSG data[20];
node *p1 = NULL,*p2; /*定义一个空链表*/
node *head = p1; /*链表的头指针 */
/*将数据包存储到一个结构体数组中*/
for(i = 0;i<MAX_ListNum;i++)
{
printf("请输入数据包:%d的标示符数\n",i+1);
scanf("%d",&((data+i)->dataID));
printf("\n");
}
for(i = 0;i<MAX_ListNum;i++)
{
DataFilter(data+i,p1);/*由于p1一直不变,p1=NULL*/
}
}