回看了一下以前写的链表操作,确实有点复杂不利于初学,这篇文章就换个写法,简单明了的介绍链表的操作;
第一步:定义节点结构体,可以把它看成一个模板:
// 定义节点
typedef struct node
{
unsigned char data;
struct node *next;
}node_t;
第二步:初始化节点,目的就是获取到头节点,后续的操作都是判断节点的同名结构体指针是否为空,所有头节点的head->next必须等于NULL:
// 初始化节点
node_t* node_init(unsigned char data)
{
node_t* head=(node_t*)malloc(sizeof(node_t));
head->data = data;
head->next = NULL;
return head;
}
第三步:打印节点数据,用于查看节点的最新数据:
// 打印链表
void node_printf(node_t *node)
{
node_t *head = node;
while(1){
printf("data:%d
",head->data);
if(head->next==NULL){
return;
}else{
head = head->next;
}
};
}
第四步:尾插方式把新的节点接入链表,核心就是判断节点的指针是否为空,找到最尾巴的节点,然后把新的节点接到它的后面,然后再把新的节点指针赋值为空:
// 尾插
node_t* node_end_add(node_t *node, unsigned char data)
{
node_t *head = node;
node_t *end = node;
while(1){
if(end->next!=NULL){
end = end->next;
}else{
node_t* temp_node=(node_t*)malloc(sizeof(node_t));
temp_node->data = data;
temp_node->next = NULL;
end->next = temp_node;
return head;
}
}
}
第五步:通过尾删的方式,把节点指针为空的节点删除,再把它上一个节点赋值为空:
// 尾删
node_t* node_end_del(node_t *node)
{
node_t *head = node;
node_t *end = node;
node_t *temp = NULL;
while(1){
if(end->next!=NULL){
temp = end;
end = end->next;
}else{
free(end);
temp->next = NULL;
return head;
}
}
}
第六步:通过头插方式,把新的节点接入到链表,头插的方式并不需要赋值为空,因为它插入的下一节点,就是上一次插入的节点指针,所以只需要把上一个节点指针赋值给新加入的指针即可,注意头插一定要返回头节点指针,因为头插的头节点会随着插入而改变:
// 头插
node_t* node_head_add(node_t *node, unsigned char data)
{
node_t* temp_node=(node_t*)malloc(sizeof(node_t));
temp_node->data = data;
temp_node->next = node;
return temp_node;
}
第七步:通过头删的方式,把头部的节点删除,因为头部的节点是已知的,所以只要改表一下头节点,然后把头部节点释放就可以:
// 头删
node_t* node_head_del(node_t *node)
{
node_t* head = node->next;
free(node);
return head;
}
总结:尾节点操作是通过判断节点指针是否为NULL,找到节点指针为NULL的指针,然后进行相关操作,而头节点直接就通过头节点进行相关操作,头插和尾插最大的不同就是数据是反的,这点要注意不要搞错;
完整代码如下:
#include "stdio.h"
#include "stdlib.h"
// 定义节点
typedef struct node
{
unsigned char data;
struct node *next;
}node_t;
// 初始化节点
node_t* node_init(unsigned char data)
{
node_t* head=(node_t*)malloc(sizeof(node_t));
head->data = data;
head->next = NULL;
return head;
}
// 打印链表
void node_printf(node_t *node)
{
node_t *head = node;
while(1){
printf("data:%d
",head->data);
if(head->next==NULL){
return;
}else{
head = head->next;
}
};
}
// 尾插
node_t* node_end_add(node_t *node, unsigned char data)
{
node_t *head = node;
node_t *end = node;
while(1){
if(end->next!=NULL){
end = end->next;
}else{
node_t* temp_node=(node_t*)malloc(sizeof(node_t));
temp_node->data = data;
temp_node->next = NULL;
end->next = temp_node;
return head;
}
}
}
// 尾删
node_t* node_end_del(node_t *node)
{
node_t *head = node;
node_t *end = node;
node_t *temp = NULL;
while(1){
if(end->next!=NULL){
temp = end;
end = end->next;
}else{
free(end);
temp->next = NULL;
return head;
}
}
}
// 头插
node_t* node_head_add(node_t *node, unsigned char data)
{
node_t* temp_node=(node_t*)malloc(sizeof(node_t));
temp_node->data = data;
temp_node->next = node;
return temp_node;
}
// 头删
node_t* node_head_del(node_t *node)
{
node_t* head = node->next;
free(node);
return head;
}
int main()
{
node_t* user_node = node_init(1);
// 尾
// user_node = node_end_add(user_node, 2);
// user_node = node_end_add(user_node, 3);
// user_node = node_end_add(user_node, 4);
// node_printf(user_node);
// printf("------
");
// user_node = node_end_del(user_node);
// user_node = node_end_del(user_node);
// node_printf(user_node);
// printf("------
");
// user_node = node_end_add(user_node, 3);
// user_node = node_end_add(user_node, 4);
// node_printf(user_node);
// printf("------
");
// 头
user_node = node_head_add(user_node, 2);
user_node = node_head_add(user_node, 3);
user_node = node_head_add(user_node, 4);
node_printf(user_node);
printf("------
");
user_node = node_head_del(user_node);
user_node = node_head_del(user_node);
node_printf(user_node);
printf("------
");
user_node = node_head_add(user_node, 3);
user_node = node_head_add(user_node, 4);
node_printf(user_node);
printf("------
");
}
代码写得不是很严谨,主要用于入门学习,把主要思路讲清楚;觉得有收获的同学动动小手指点个赞吧,我是Noah,我们下篇推文再见!
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !