广东湘恒智能科技有限公司
主营产品: 西门子PLC代理商,plc变频器,伺服电机,人机界面,触摸屏,线缆,DP接头
SIEMENS山东省滨州市 西门子代理商——西门子华北一级总代理

环形链表的一种应用

        计算一串数据的滑动平均值

        比如传感器采集到连续的数据,需要作一个滑动的滤波处理,可以将数据不断的写入该循环链表,当链表满了之后,开始计算以链表长度为滑动窗口的平均值,并不断输出。



















//计算平均值 void calc_list_ave(stData *pHead, float *res){    stData *pTmp=NULL;//临时指针    pTmp=pHead;//临时指针指向链表头
   int cnt = 0;    float sum = 0;
   do{        sum += pTmp->data;        cnt++;        pTmp=pTmp->pNext;    }while(cnt<LIST_LEN);
   //平均值结果通过指针传出    *res = sum/LIST_LEN;}


        计算链表中所有数据的平均值,首先要获取各个节点的数据,基本思路是:

        使用一个临时指针指向头节点pHead(当然选用pList或pTail也可以),然后获取该节点的数据,并移动到下一个节点,循环获取数据即可,停止条件为移动了链表的长度次。

5环形链表的销毁

        环形链表在初始化时是使用malloc()为各个节点动态分配内存的,因此在使用完链表后,需要使用free()来释放内存。
















//释放链表 ---函数中需要改变指针的指向,也要传入二级指针void release_list(stData **pList) {    stData *pTmp=NULL;//临时指针    stData *pDel=NULL;
   pTmp=(*pList)->pNext;    (*pList)->pNext=0;//断开第一个节点
   do{        pDel=pTmp;        pTmp=pTmp->pNext;        free(pDel);    }while(pTmp->pNext != 0);}

        基本思路是:首先断开环形链表的第1个和第2个节点的指向关系,然后逐个释放各个节点即可。

使用一个临时指针pTmp指向尾节点pTail

将pList的pNext置为0,断开环形链表的第1个和第2个节点的指向关系,作为循环销毁结束的判断条件:

再使用一个临时指针pDel指向刚才的临时指针pTmp指向的节点

将pTmp向后移动一个节点

释放pDel指向的节点的内存

然后循环指向,逐个释放,直至遇到刚才设置的断开的节点处,整个链表释放完成


展开全文
相关产品
拨打电话 微信咨询 发送询价