链表的基本操作

描述

回看了一下以前写的链表操作,确实有点复杂不利于初学,这篇文章就换个写法,简单明了的介绍链表的操作;

第一步:定义节点结构体,可以把它看成一个模板:

 

// 定义节点
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,我们下篇推文再见!

  审核编辑:汤梓红

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分