本文的主要内容目录:
一、链表结点元素的添加
二、链表结点元素的删除
三、链表结点元素的更改
四、链表结点元素的查询
在上一篇博文中已经对双向链表的实现做了比较详细地阐述,在一篇文章来说一说双向链表的四个基本操作:增、删、改、查。在讲基本操作之前,再来看看链表结点元素的结构体的实现,它是整个数据结构的核心。
/* 定义一个表示链表的结构体指针 */
struct list {
int id; /* 标识这个元素方便查找 */
char data[20]; /* 链表中包含的元素 */
struct list *next; /* 指向下一个结点的指针 */
struct list *prev; /* 指向前一个结点的指针 */
};
一、链表结点元素的添加
本文所实现的链表结点元素的添加是在链表尾部来添加结点元素的,当然读者也可以根据对我实现的这个函数进行修改,使其可以在任何指定的位置添加元素。
算法的具体实现函数如下:
/** 将指定元素插入到聊表尾部
* head : 表示要插入元素的链表的头部的地址
* list : 表示要插入到链表中的元素
*/
static void list_add(struct list **head, struct list *list)
{
struct list *temp;
/* 判断链表是否为空 */
if(NULL == *head)
{
/* 为空 */
*head = list;
(*head)->next = NULL;
(*head)->prev = NULL;
}
else
{
/* 不为空 */
temp = *head;
while(temp)
{
/* 将新结点插入到链表尾部 */
if(NULL == temp->next)
{
temp->next = list;
list->next = NULL;
list->prev = temp;
return;
}
temp = temp->next;
}
}
}
先判断链表是否为空,如果为空直接返回NULL,否者对链表进行遍历找到链表的尾部,然后将要插入的结点元素插入到链表尾部,具体实现参考上面这个函数。
进行结点元素的添加测试,在main函数中添加如下代码:
/* 定义一个临时的链表结点元素 */
struct list temp_list;
/* 对临时定义的结点元素进行赋值并加入到链表当中 */
temp_list.id = list_id++;
sprintf(temp_list.data, "temp_list node!");
list_add(&list_head, &temp_list);
/* 从头部遍历链表,把链表中每个元素的信息都打印出来 */
list_print_head(&list_head);
编译运行结果如下:
二、链表结点元素的删除