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

C语言数据结构学习:单链表

C语言数据结构学习:

汇总入口:C语言数据结构学习:[汇总]

单链表

1. 基础了解

学习之前先了解线性表、顺序表和链表

线性表的两个特点:

  1. 有限的序列
  2. 序列中的每一个元素都有唯一的前驱和后继,除了开头和结尾两个节点

顺序表的特点:

  1. 分配一块连续的内存去存放这些数据,例如数组

链表:

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

2. 单链表

  1. 一个节点包括:data、next
    • next指向下一个节点的位置
  2. 一般包含 1个链表包含头结点 和 n个数据节点

3. 单链表操作:

  1. 增加

    1. 头插法:一个新的节点,next指向原先的链表头
    2. 尾插法:原先的链表尾指向,一个新的节点。
  2. 删除:

    只需要找到对应节点,将对应节点的前一个节点指向这个节点的**后继,**只操作一个指针

4. 代码示例

  1. 定义新的类型:Node,用于创建节点

    #include <stdio.h>
    #include <stdlib.h>
    
    /* 定义新的类型Node,用于创建节点 */
    typedef struct Node {
    	int data;			//data
    	struct Node* next;	//存放下一个节点结构体的位置
    }Node;
    
  2. 初始化头节点函数

    /* 初始化头结点 */
    Node* initlist() {
    	/* 开辟空间 */
    	Node* list = (Node*)(malloc(sizeof(Node)));
    	/* 初始化 */
    	list->data = 0;
    	list->next = NULL;
    	return list;
    }
    
  3. 增加、删除函数

    /* 头插法 */
    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* current = list;			//保存头结点的地址
    	Node* node = (Node*)(malloc(sizeof(Node)));
    	node->data = data;
    	node->next = NULL;				//指向NULL
    	while (current->next)			//如果current的后继不为NULL、则进入while
    	{
    		current = current->next;	//否则current会指向下一个节点
    	}
    	current->next = node;			//将current指向的最后一个节点 与新节点连接
    
    	list->data++;					//当前链表中插入了一个元素
    }
    
    /* 删除 */
    void delete (Node* list, int data) {
    	Node* current = list;			//保存头结点地址
    	Node* previous = list;			//用于保存上一个结点地址
    	current = current->next;		//使current指向第一个(数据)节点的位置
    	while (current){				//如果current不为空指针则进入while
    		if (current->data == data){	//如果是我要删除的data
    			previous->next = current->next;//把上一个节点的next链接到下一个节点
    			free(current);			//释放当前节点
    			list->data--;			//当前链表中删除了一个元素
    			break;
    		}
    		previous = current;			//保存当前位置
    		current = current->next;	//指向下一个节点
    	}
    }
    
  4. 打印列表函数

    /* 打印链表 */
    void printList(Node* list){
    	Node* current = list;			//保存头结点地址
    	current = current->next;		//使current指向第一个(数据)节点的位置
    	while (current) {				//如果current不为空指针则进入while
    		printf("%d ", current->data);
    		current = current->next;	//指向下一个节点
    	}
    	printf("\\n");
    }
    
  5. 测试

    /* 测试 */
    void main()
    {
    	printf("Hello World!!\\n");
    	/* 初始化链表 */
    	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, 1);
    	delete(list, 6);
    
    	/* 打印 */
    	printList(list);
    	return 0;
    }
    


http://www.kler.cn/news/368593.html

相关文章:

  • UML外卖系统报告(包含具体需求分析)
  • 游戏服务器被攻击有办法防护吗
  • Android 应用包名的定义 pm list packages查询的包名
  • Java 中的正则表达式详解
  • python kafka 发送/接收 消息
  • nginx配置本地缓存用于提高响应效率
  • 【Ubuntu】服务器系统重装SSHxrdpcuda
  • C语言 | Leetcode C语言题解之第507题完美数
  • 资源所有者管理共享交换机
  • 啤酒游戏—企业经营决策沙盘
  • 人工智能_神经网络103_感知机_感知机工作原理_感知机具备学习能力_在学习过程中自我调整权重_优化效果_多元线性回归_逻辑回归---人工智能工作笔记0228
  • 落实“双碳”行动,深兰科技推动分子能源技术在AI硬件产品领域的应用及产业化进程
  • 【开发日记】如何让指定用户执行sudo命令时无需输入密码
  • 例程学习(学习笔记)
  • 盲盒小程序/APP系统,市场发展下的新机遇
  • <<机器学习实战>>15-26节笔记:逻辑回归参数估计、梯度下降及优化、模型评价指标
  • 【了解一下静态代理与动态代理】
  • 无线红外单点温度传感器解决方案
  • git lfs问题(下载大模型的时候出的问题)
  • C语言单链表
  • 数字后端零基础入门系列 | Innovus零基础LAB学习Day5
  • Fragments by E2B:AI生成应用模板,让应用开发更智能
  • MATLAB生物细胞瞬态滞后随机建模定量分析
  • 若依微服务15 - RuoYi-Vue3 实现前端独立运行
  • 进程间通信(二)消息队列、共享内存、信号量
  • 国家数据局发布41个数据领域名词官方解释