一、内核链表:
1. 含义:
Linux 内核中自己实现了双向链表,可以在 include/linux/list.h 找到定义。
2. 作用:
不包含数据域,可以嵌入大结构体中,实现大结构体之间的连接。
3. 部分函数说明:/*
* 函数名:list_add
* 功 能:头部插入新结点
* 参 数:
* new --- 新结点
* head --- 头结点
* 返回值:无
**/
static inline void list_add(struct list_head *new, struct list_head *head)
{
__list_add(new, head, head->next);
}
/*
* 函数名:list_add_tail
* 功 能:尾部插入新结点
* 参 数:
* new --- 新结点
* head --- 头结点
* 返回值:无
**/
static inline void list_add_tail(struct list_head *new, struct list_head *head)
{
__list_add(new, head->prev, head);
}
/*
* 函数名:list_del
* 功 能:删除结点
* 参 数:
* entry --- 结点入口
* 返回值:无
**/
static inline void list_del(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
entry->next = (void *) 0;
entry->prev = (void *) 0;
}
/*
* 宏函数:list_entry
* 功 能:获取type类型结构体的起始地址
* 参 数:
* ptr --- 结点
* type --- 大结构体的类型
* member --- 小结构体在大结构体中的名字
* 返回值:无
**/
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
/*
* 宏函数:list_for_each
* 功 能:遍历链表
* 参 数:
* pos --- 遍历的每个结点
* head --- 头结点
* 返回值:无
**/
#define list_for_each(pos, head) \
for (pos = (head)->next; pos != (head); \
pos = pos->next)
二、部分代码//学生信息结构体
struct stu
{
long long id;
char name[256];
long long tel;
struct list_head list;
};
//主函数
int main()
{
//创建头结点
struct list_head *head = malloc(sizeof(struct list_head));
//初始化头结点
INIT_LIST_HEAD(head);
while(1)
{
printf("\n-----------学生管理系统-----------\n");
printf("\n\t0:查看所有学生\n");
printf("\t1:添加学生信息\n");
printf("\t2:修改学生信息\n");
printf("\t3:删除学生信息\n");
printf("\t请输入:");
int mode;
scanf("%d",&mode);
printf("\n----------------------------------\n");
switch(mode)
{
case 0:
{
tarvel_node(head);
break;
}
case 1:
{
long long id;
char name[256];
long long tel;
printf("\n\t请输入学号:");
scanf("%lld",&id);
printf("\t请输入姓名:");
scanf("%s",name);
printf("\t请输入电话:");
scanf("%lld",&tel);
insert_node(head,id,name,tel);
break;
}
case 2:
{
long long id;
char name[256];
long long tel;
printf("\n\t请输入修改学生的学号(学号不允许修改):");
scanf("%lld",&id);
printf("\t请输入修改后的姓名:");
scanf("%s",name);
printf("\t请输入修改后的电话:");
scanf("%lld",&tel);
modify_all_node(head,id,name,tel);
break;
}
case 3:
{
long long id;
printf("\n\t请输入删除学生的学号:");
scanf("%lld",&id);
del_all_node(head,id);
break;
}
}
}
return 0;
}
运行命令:./main
三、实现效果
四、总结
后续跟新以下Demo:
五、项目结构图