用循环单链表的方式实现对冗余数据包的过滤处理

#include <stdio.h>
#include <stdlib.h>


#define  NodeNum 10
#define  dataNUM 20
typedef struct node
{
int IDnum;
struct node *next;
}Node;


typedef struct data
{
int SerialNum;
}Data_MSG;


void InitalList(Node stu[NodeNum]) /*初始化成为循环链表*/
{
int i;
for(i = 0;i<NodeNum-1;i++)
{
stu[i].IDnum = 0;
(stu+i)->next = &stu[i+1];
}
stu[i].IDnum= 0;/*此时i=9*/
(stu+i)->next = &stu[0];
}


int FindData_MSG(Node stud[NodeNum],int data)/*寻找队列结点函数*/
{
int result = 0;
int temp,i;
for(i = 0;i<NodeNum;i++)
{
if(data == (stud+i)->IDnum)
{
result = 1;
//printf("没有数据:%5d\n",data);
break;
}
}
return result;
}


void EnList(Node stud[NodeNum],int data,int time)/*数据插入链表,time为第几次插入链表*/
{
int temp;
temp = time % NodeNum; /*temp取值很重要,temp为要插入循环链表的位置*/
stud[temp].IDnum = data;
}


int DataFilter(Data_MSG *data,Node stud[NodeNum])/*数据包过滤函数*/
{
int  result = 0;
static int time = 0;/*定义为static很重要,在数据包较小的情况下可以使用static,但是在庞大的数据下无法使用,数据溢出*/
int i = 0;
if(0 == FindData_MSG(stud,data->SerialNum))/*队列中没有该结点*/
{
printf("该队列中没有该结点:%d,进行插入\n",data->SerialNum);
EnList(stud,data->SerialNum,time);
time++;
result = 0;
}
else /*如果队列中有该结点*/
{   
printf("该数据包已过滤: %d\n",data->SerialNum);
result = 1;        /*该节点已被过滤过*/
}
}


void main()
{


int i = 0;
Data_MSG data[dataNUM];             /*定义的数据包数组长度*/
Node stud[NodeNum];
InitalList(stud);
for(i = 0;i<dataNUM;i++)
{
printf("请输入20个数据包:%d的标示符数\n",i+1);
scanf("%d",&((data+i)->SerialNum));
printf("\n");
}
for(i = 0;i<dataNUM;i++)
{
printf("%3d\n",(data+i)->SerialNum);
}


for( i = 0;i < dataNUM ; i++ ) /*调用数据包过滤函数*/
{
DataFilter(data+i,stud);
}
printf("最终链表中的元素:Please output elements int queue:\n");/*元素出队*/
for(i=0;i<NodeNum;i++)
{
printf("%4d",stud[i].IDnum);
}
}

猜你喜欢

转载自blog.csdn.net/yuhoujiangnan2011/article/details/49802131
今日推荐