- 尾节点的插入操作
这里面只是记录了一下地址 没有分配空间,记录的是节点的首地址
- 链表根节点初始化
void vListInitialise( List_t * const pxList )
{ /* 将链表索引指针指向最后一个节点 */ pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /* 将链表最后一个节点的辅助排序的值设置为最大,确保该节点就是链表的最后节点 */ pxList->xListEnd.xItemValue = portMAX_DELAY; /* 将最后一个节点的 pxNext 和 pxPrevious 指针均指向节点自身,表示链表为空 */ pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd ); /* 初始化链表节点计数器的值为 0,表示链表为空 */ pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
}
- 升序插入节点
void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem )
{ ListItem_t *pxIterator; /* 获取节点的排序辅助值 */ const TickType_t xValueOfInsertion = pxNewListItem->xItemValue; /* 寻找节点要插入的位置 */ if ( xValueOfInsertion == portMAX_DELAY ){ pxIterator = pxList->xListEnd.pxPrevious; } else{ for ( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ){ /* 没有事情可做,不断迭代只为了找到节点要插入的位置 */ } } /* 根据升序排列,将节点插入 */ pxNewListItem->pxNext = pxIterator->pxNext; pxNewListItem->pxNext->pxPrevious = pxNewListItem; pxNewListItem->pxPrevious = pxIterator; pxIterator->pxNext = pxNewListItem; /* 记住该节点所在的链表 */ pxNewListItem->pvContainer = ( void * ) pxList; /* 链表节点计数器++ */ ( pxList->uxNumberOfItems )++;
}
- 从链表中删除节点
UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )
{ /* 获取节点所在的链表 */ List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer; /* 将指定的节点从链表删除 */ pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; /* 调整链表的节点索引指针 */ if ( pxList->pxIndex == pxItemToRemove ) { pxList->pxIndex = pxItemToRemove->pxPrevious; } /* 初始化该节点所在的链表为空,表示节点还没有插入任何链表 */ pxItemToRemove->pvContainer = NULL; /* 链表节点计数器-- */ ( pxList->uxNumberOfItems )--; /* 返回链表中剩余节点的个数 */ return pxList->uxNumberOfItems;
}
没有把待删节点的内容空间删除
- ->和. 的区别
#include <stdio.h>
#include <stdlib.h>// 定义一个结构体
struct Person {char name[20];int age;
};int main() {
#if 0 // 使用点号(.)访问结构体成员struct Person person1;person1.age = 25;printf("Using dot operator: Age is %d\n", person1.age);// 使用箭头符号(->)访问结构体成员struct Person* person2 = (struct Person*)malloc(sizeof(struct Person));person2->age = 30;printf("Using arrow operator: Age is %d\n", person2->age);
#endifstruct Person p1; //p表示类型为结构体Person 的变量struct Person p2;struct Person* pp = &p2;//pp表示 指针变量(Person*),存储的是p2的地址p1.age = 10;struct Person* p11;p11 = &p1;p11->age = 20;printf("p1's value = %d\n\r", p1.age);pp->age = 10;//pp->age = 10;//(*pp)->age = 20;//*pp.age = 20;//(*pp).age = 20;printf("p2's value = %d\n\r", p2.age);system("pause");return 0;
}
struct Person person2 = (struct Person)malloc(sizeof(struct Person));
**结构体指针需要分配地址空间!!!