链表的含义
在前面所接触到的数组是一种顺序表,数据只能按照一定的顺序存储在数组中。对动态数组的操作比较麻烦,若想在对数组进行增加,删除进行的操作比较麻烦。
链表是一种数据结构,其包含一个数据和一个指针,两者构成了一个节点,链表就是一个个节点所组成的结构。
链表的示意图如上图所示,链表的指针指向下一个节点,链表最后一个节点中指针成员为空。通过指针的方式将每个节点连接起来是链表的一个特点。对链表进行增、删,相较于顺序表要更加容易。
链表追加(append)
下面是在链表末尾增加节点的示意图,需要在链表末尾增加节点时,只需将原来链表最后一个节点的指针由空改为指向新增节点的指针即可。
链表添加(insert)
下面是在链表中添加节点的示意图,只需在要添加数据的位置,将原来的指针打断,并且指针指向新的节点即可。
链表删除
链表追加、删除的实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//存储任务信息的结构体
struct Man
{
char * name;
int age;
};
//链表节点
typedef struct Node
{
//节点保存人的信息
Man * man_info;
//节点的指针指向的下一个节点
Node * next_node;
} List;
//向链表末尾追加数据
void append(List ** list, Man data)
{
//创建一个新的节点
Node * new_node = (Node *)malloc(sizeof(Node));
//新创建的节点指向NULL,表示这是最后一个节点
new_node->next_node = NULL;
//将数据填充到节点中
new_node->man_info = (Man *)malloc(sizeof(Man));
new_node->man_info->age = data.age;
int name_len = strlen(data.name) + 1;//获取字符数组的长度
new_node->man_info->name = (char *)malloc(name_len);//开辟一个相同的空间
memcpy(new_node->man_info->name,data.name,name_len);//将数据拷贝到链表节点中
//节点声明完毕
//判断列表是否为空
if (*list == NULL)
{
//列表为空,需要将刚创建的节点作为链表的首个节点
*list = new_node;
}
//链表不为空
else
{
Node * node_idx;//用于遍历节点的指针索引
node_idx = *list;
while (true)
{
//遍历完链表所有节点,需要在末尾追加
if (node_idx->next_node == NULL)
{
//printf("遍历完所有节点");
node_idx->next_node = new_node;
break;
}
else
{
//指针索引指向下一节点
node_idx = node_idx->next_node;
}
}
}
}
void clear_list(List ** list)
{
//判断列表是否为空
while (*list != NULL)
{
Node * node_idx;
node_idx = *list;
*list = (*list)->next_node;
free(node_idx);
}
}
//遍历列表中的所有信息
void show_info(List * list)
{
Node * node_idx;//用于遍历节点的指针索引
node_idx = list;
while (list != NULL)
{
printf("name is %s, age is %d \n", node_idx->man_info->name, node_idx->man_info->age);
if (node_idx->next_node == NULL)
{
printf("遍历完所有节点");
break;
}
else
{
//指针索引指向下一节点
node_idx = node_idx->next_node;
}
}
}
int main(int argc, char const *argv[])
{
//声明一个链表并且使链表指向空,作为最后一个元素
List * node_list = NULL;
append(&node_list, { "coming",20 });
append(&node_list, { "coming99",20 });
append(&node_list, { "coming06",20 });
append(&node_list, { "coming23",20 });
show_info(node_list);
printf("----------------------\n");
clear_list(&node_list);
show_info(node_list);
getchar();
return 0;
}