1. 嵌入式C语言中链表的应用场景
链表在FreeRTOS和RT_Thread等操作系统中属于比较核心的部分,常用链表实现队列,任务间通信,任务对象管理等操作,此节主要介绍单链表的常用操作。
2. 创建及插入单向链表
fig1. 空链表直接插入新成员
fig2. 非空链表找到NULL从尾部插入
struct mate{
char *name;
int age;
struct mate *next;
};
//定义链表头结构体
struct list{
char *name;
struct mate *next;
};
//链表初始化
void InitList(struct list *pList, char *name)
{
pList->name = name;
pList->next = NULL;
}
//加入链表新成员
void AddItemToList(struct list *pList, struct mate *new_mate)
{
struct mate *last;
if(pList->next == NULL)//开始为空链表则直接加入新成员
{
pList->next = new_mate;
new_mate->next = NULL;
return;
}
last = pList->next;
while(last->next)//找到最后一项
{
last = last->next;
}
last->next = new_mate;
new_mate->next = NULL;
}
3. 删除单向链表
fig3. (特殊情况) 第一项为待删除项
fig4. 其他项为待删除项
void DelItemFormList(struct list *pList,struct mate *delmate)
{
struct mate *p = pList->next;
struct mate *pre = NULL;
while(NULL != p && p != delmate)//未找到,后移下一个成员
{
pre = p;
p = p->next;
}
/**退出的条件:p为空或者p为要删除的成员***/
if(NULL == p)//空,无要删除的成员
{
printf("can not find the mate to del.\r\n");
return;
}
if(NULL == pre) //pre未被赋值,要删除的是第一项
{
pList->next = p->next;
}
else{
pre->next = p->next;
}
}