当前位置: 首页 > news >正文

手撕数据结构—单链表

✅作者:简单^不简单
🔥系列专栏:C语言+数据结构
💖如果文章有错误,时刻欢迎大家的指正。当然觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝
💬格言:希望我们都能朝着光走‍‍‍🐱‍🏍

目录

相关知识点

        1.线性表

        2.顺序表

        3.链表

相关操作

1.定义数据结构

2.插入

2.1头插法

2.2尾插法

3.删除

完整代码


相关知识点

1.线性表

  • 定义:线性表 (linear list) 是 数据结构 的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
  • 特点 

        1.有限的序列

        2.序列中的每一个元素都有唯一前驱和后继

2.顺序表

        分配一块连续的内存去存放这些元素,例如编程语言中的素组。

3.链表

        内存是不连续的,元素会各自被分配一块内存,内存和内存之间用指针进行相连。

 本文重点对单链表的相关操作进行讲解

相关操作

1.定义数据结构

typedef struct Node{int data;struct Node* next;
}Node;

2.插入

2.1头插法

                

        将头指针指向的节点赋值给新结点中next指向的节点,再将头结点的next从新指向node

//头插法
void headInsert(Node* list,int data){Node* node =(Node*)malloc(sizeof(Node));node->data = data;node->next = list->next;list->next = node;list->data++;
}

2.2尾插法

          

        创建一个新结点,将值传入其中,再将新结点的next—>NULL,最后通过遍历找到以前的尾元素,将尾元素的next指向该元素。

//尾插法
void tailInsert(Node* list,int data){Node* head = list;Node* node = (Node*)malloc(sizeof(Node));node->data = data;node->next = NULL;list = list->next;while(list->next){list = list->next;}list->next = node;head->data++;
}

3.删除

                 

        删除指定节点时,要注意指针指向的节点是否为空,之后便是进行扫描与交换数据域,再之后就是进行断开释放空间等操作

void delete(Node* list,int data){Node* pre = list;Node* current = list->next;while(current){if(current->data==data){pre->next = current->next;free(current);break;}pre = current;current = current->next;}list->data--;
}

完整代码

#include<stdio.h>
#include<stdlib.h>//开辟空间的头文件//定义数据结构
typedef struct Node{int data;struct Node* next;
}Node;//初始化头节点
Node* initList(){Node* list =(Node*)malloc(sizeof(Node));list->data = 0;list->next = NULL;return list;}//头插法
void headInsert(Node* list,int data){Node* node =(Node*)malloc(sizeof(Node));node->data = data;node->next = list->next;list->next = node;list->data++;
}//尾插法
void tailInsert(Node* list,int data){Node* head = list;Node* node = (Node*)malloc(sizeof(Node));node->data = data;node->next = NULL;list = list->next;while(list->next){list = list->next;}list->next = node;head->data++;
}//删除操作
void delete(Node* list,int data){Node* pre = list;Node* current = list->next;while(current){if(current->data==data){pre->next = current->next;free(current);break;}pre = current;current = current->next;}list->data--;
}//遍历操作
void printList(Node* list){list = list->next;while(list){printf("%d",list->data);list = list->next;}printf("\n");
}int main(){Node* list = initList();headInsert(list,1);headInsert(list,2);headInsert(list,3);headInsert(list,4);headInsert(list,5);tailInsert(list,6);tailInsert(list,7);tailInsert(list,8);tailInsert(list,9);tailInsert(list,10);delete(list,5);delete(list,10);delete(list,3);printList(list);return 0;}

http://www.lryc.cn/news/90877.html

相关文章:

  • Benewake(北醒) 快速实现 TF02-i-RS485 与电脑通信操作说明
  • 【分享】科大讯飞星火认知大模型(初体验)
  • logstash 采集应用日志切割问题
  • 计算机网络实验:认识Packet Tracer软件
  • 【MySQL新手到通关】第六章 时间日期函数
  • 深蓝学院C++基础笔记 第 1 章 C++初探
  • 【配电网重构】基于混合整数二阶锥配电网重构研究(Matlab代码实现)
  • Kubernetes mysql 实战以及外部存储处理 [一]
  • 使用【Python+Appium】实现自动化测试
  • 位图和布隆过滤器
  • Eclipse 教程Ⅳ
  • Webpack搭建本地服务器
  • 基于Go开发PaaS平台3
  • 虎牙直播在微服务改造的实践总结
  • 设置线程池的大小
  • Vue3 除了 keep-alive,还有哪些实现页面缓存的方法
  • JavaScript闭包
  • 华为OD机试之不含101的整数(Java源码)
  • SpringCloud Ribbon 学习
  • 预告:XuperOS Global 国际化进展
  • 炫技操作--递归实现翻转链表(java)
  • 华为OD机试真题 Java 实现【求最小公倍数】【牛客练习题】
  • [java]两数之和 II - 输入有序数组
  • Linux-0.11 boot目录head.s详解
  • 离散数学_十章-图 ( 3 ):由旧图构造新图
  • Golang每日一练(leetDay0083) 汇总区间、多数元素II
  • JAVA数组基础
  • Linux-0.11 文件系统exec.c详解
  • NET框架程序设计-第1章.NET框架开发平台体系架构
  • (哈希表 ) 349. 两个数组的交集 ——【Leetcode每日一题】