SIEMENS山东省聊城市 西门子代理商——西门子华北一级总代理
| 更新时间 2024-11-16 07:00:00 价格 请来电询价 西门子总代理 PLC 西门子一级代 驱动 西门子代理商 伺服电机 联系电话 15903418770 联系手机 15915421161 联系人 张经理 立即询价 |
链表初始化后各节点的数据均为0,查询环形链表中有效数据的长度,用于指示在向链表写入数据时,头指针与尾指针是否需要移动,然后在合适的位置写入新的数据,以及用于在数据使用的是否,只有链表数据满了之后,才对整个环形链表中的数据进行使用。
pTmp = pHead;//临时指针指向头指针 while(pTmp!=pTail && pTmp!=NULL)//计算的是pHead到pTail间的距离 { cnt++;//开始存入第1个数据之后,pHead与pTail不会再次指向同一节点,所以cntZui大是(LIST_LEN-1) pTmp=pTmp->pNext; }
return cnt;}
基本思路是:首先使用一个临时指针指向头节点指向的节点,然后判断该节点是否是尾节点指向的节点。
链表刚初始时环形链表刚初始化时,有效数据为0个:
写入1个数据后写入1个数据后,尾指针向后移动一个节点,此时查询有效数据为1:
写入4个数据后写入4个数据后,此时查询有效数据为4,之后若再写入1个数据,环形链表的有效数据就满了
3环形链表写入数据
cnt = check_list_isfull(*pHead, *pTail); //printf("......cnt:%d\r\n",cnt); if((LIST_LEN-1) == cnt)//只剩一个可以存了 (或是pTail已经绕了一圈与pHead相邻了){ //则 pHead向后移动一个 *pHead = (*pHead)->pNext; ret = 0;//表示环形链表存满了(虽然现在还剩一个位置,但本函数退出前会将这个位置填入数据) } else{ ret = -1;//表示环形链表中的数据还未添满 }
//临时指针指向尾指针,并填入数据,即在环形链表的尾部更新了一个数据 pTmp=(*pTail); pTmp->data=val;
*pTail=(*pTail)->pNext;//pTail向后移动一个
return ret;}
基本思路是:
通过check_list_isfull()函数检查当前链表中有效数据的个数
若有效数据的个数是(LIST_LEN-1),则将头指针向后移动一个几点,且该函数Zui终返回0,表示此次添加数据后,链表数据为满的状态
若有效数据的个数少于(LIST_LEN-1),即刚开始向链表中写入数据的阶段,则该函数Zui终返回-1,表示此次写入数据后链表未满
将临时指针pTmp指向尾节点pTail指向的节点,并将数据写入该节点
尾节点pTail指向下一个节点
下次写入数据时按照上面过程循环执行
写入第1个数据写入第1个数据分3步:
pTmp指向尾节点pTail指向的节点
为该节点写入数据
pTail指向下一个节点
写入第2个数据步骤与写入第1个数据类似:
写入第4个数据步骤也与写入第1个数据类似:
写入第5个数据第5个数据,也是环形链表种的Zui后1个数据。
注意此时环形链表数据已满,头指针pHead开始它的第1次向后移动:
check_list_isfull()判断为满,pHead指向下一个节点
临时指针pTmp指向pTail指向的节点
为该节点写入数据
pTail指向下一个节点
-
写入第6个数据第6个数据,则需要覆盖写入到环形链表中的第1个数据。
其步骤实际与写入第5个数据类似,并且之后数据的写入,都与次步骤类似。