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

算法之链表2

# 链表基础知识介绍 链表是一种常见的数据结构,它通过节点之间的指针链接来存储数据。与数组不同,链表中的元素在内存中不是连续存储的。 ## 链表的基本概念 ###1.节点结构 链表的基本单位是节点,每个节点包含两部分:-**数据域**:存储实际的数据-**指针域**:存储指向下一个节点的地址 在C语言中,链表节点通常定义为: ```cstructnode{intdata;// 数据域structnode*next;// 指针域,指向下一个节点};

2. 链表的类型

  • 单向链表:每个节点只有一个指向下一个节点的指针
  • 双向链表:每个节点有指向前一个和后一个节点的指针
  • 循环链表:尾节点指向头节点,形成环状结构

3. 链表的操作

  1. 创建链表:初始化头指针,逐个添加节点
  2. 插入节点:在指定位置插入新节点
  3. 删除节点:移除指定位置的节点
  4. 遍历链表:从头节点开始,依次访问每个节点
  5. 查找节点:按值或位置查找特定节点

4. 链表的优缺点

优点

  • 动态大小,无需预先分配固定空间
  • 插入和删除操作效率高(O(1)时间复杂度)
  • 内存利用率高

缺点

  • 访问元素需要从头遍历(O(n)时间复杂度)
  • 需要额外的内存空间存储指针
  • 不支持随机访问

5. 链表 vs 数组

特性数组链表
内存分配连续非连续
大小固定动态
插入/删除效率低效率高
访问随机访问(O(1))顺序访问(O(n))
内存开销较大(需要指针)

下面是一个完整的C语言链表操作示例:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//复习队列栈
//struct queue
//{
// int data[1000];
// int head;
// int tail;
//};
//struct stack
//{
// char s[1000];
// int top;
//};
struct node
{
int data;
struct node* next;
};
int main()
{
/struct queue q;
int i;
q.head = 1;
q.tail = 1;
for (i = 1;i <= 9;i++) {
scanf_s(“%d”, &q.data[q.tail]);
q.tail++;
}
while (q.head < q.tail)
{
printf("%d ", q.data[q.head]);
q.head++;
q.data[q.tail] = q.data[q.head];
q.head++;
q.tail++;
}
/
/*int i;
char a[101];
int mid, len, next;
struct stack s;
s.top = 0;
gets(a);
len = strlen(a);
mid = len / 2 - 1;
for (i = 0;i <= mid;i++)
{
s.s[++s.top] = a[i];
}
if (len % 2 == 0)
next = mid + 1;
else
next = mid + 2;
for (i = next;i <= len - 1;i++)
{
if (a[i] != s.s[s.top]) {
break;

} s.top--; } if (s.top == 0) { printf("Yes"); } else printf("No");*/ struct node* head, * p, * q, * t; int i, n, a; scanf_s("%d", &n); head = NULL; q = NULL; for (i = 1;i <= n;i++) { scanf_s("%d", &a); p = (struct node*)malloc(sizeof(struct node));//malloc返回值是void*需要什么类型需要自己强制定义 p->data = a; p->next = NULL; if (head == NULL) { head = p; } else q->next = p;//引入q,达到前后节点对比的效果 q = p; } scanf_s("%d", &a); t = head; while (t != NULL) { if (t->next->data > a) { p = (struct node*)malloc(sizeof(struct node)); p->data = a;//假设57之间插入6 p->next = t->next;//6指向5指向的7 t->next = p;//5指向6 break; } t = t->next; } t = head; while (t != NULL) { printf("%d ", t->data); t = t->next; }

return 0;
}

http://www.gsyq.cn/news/1624461.html

相关文章:

  • NVIDIA联合多所顶尖高校打造的“全能机器人大脑“
  • 存储、latch-flipflop、电平(能量维持)
  • 什么是操作系统的接口
  • 还在纠结自建团队还是外包?我们找到了第三条路
  • MetaTube插件:3分钟打造完美Jellyfin媒体库的终极元数据解决方案
  • RAG是什么?企业为什么需要自己的知识库?
  • 网约车集成地图
  • STM32F429ZI与MC6470 IMU的运动控制实现
  • 如何高效的停止和删除所有 Docker 容器 ?
  • 暗黑破坏神2存档编辑器:5分钟重塑你的游戏体验
  • 基于CLIP的文本可控PET医学影像降噪技术研究
  • Qwen3-VL-8B Web系统安全加固实战:HTTPS、CSRF与XSS防护
  • Moneta Markets亿汇:“芯片目标价推升风险偏好”
  • AI 生成组件测试:先定义行为,再让模型补用例
  • ConfigMap 和 Secret:配置能热更新,不代表可以随便改
  • 分库分表设计:先确认业务边界,再选择分片键
  • FP32近似乘法器在CNN中的优化设计与应用
  • 定时任务调度:schedule与APScheduler
  • -一名3年工作经验的程序员应该具备的技能
  • TDD在Unity3D游戏项目开发中的实践0x00
  • 力士乐伺服系统调试与参数优化实战指南
  • Node.js 轻量任务队列:独立产品先把失败处理写清楚
  • Vatee万腾:聚焦细节,看看外汇领域风控思路的关键维度
  • 3-JDK的安装与配置
  • 《P10719 [GESP202406 五级] 黑白格》
  • OpenRGB终极指南:3步免费统一控制所有RGB设备灯光的完整教程
  • ChanlunX缠论插件:3步实现通达信缠论分析自动化,让复杂理论变简单图表
  • 科技暴跌,老登企稳变盘?
  • 近期零基础量化产品思路,先抓最难完成的环节
  • 【深入浅出jQuery】源码浅析--整体架构