单链表定义和操作

news/2024/9/19 20:10:41/文章来源:https://www.cnblogs.com/asherof/p/18421243

首先是单链表的定义,使用结构体定义两个部分,分别是数据域和指针域。

点击查看代码
typedef struct LNode{ElemType data;struct LNode *next;
}LNode, *LinkList;

这里可以使用typedef关键字将后续的定义简化。
具体例子如下:

  • 如果这样定义struct LNode{}的话。在定义LNode类型变量的时候我们需要这样写,struct LNode L;
  • 如果是使用typedef可以将struct省略掉。直接这样写:LNode L;

对链表的初始化(带头节点、不带头节点)

点击查看代码
// 无头节点初始化链表 
bool InitListNoHead(LinkList &L){ return (L == NULL);
}// 有头节点的初始化链表 
bool InitListWithHead(LinkList &L){L = (LNode *) malloc(sizeof(LNode));if(L == NULL) return 0;L->next = NULL;return 1;
}

单链表的插入(指定位置插入、节点前后插入)

点击查看代码
// 在链表中指定位置插入值 
bool InsertElemPos(LinkList &L, int pos, int e){if(pos < 1) return 0;LNode *p = L;int j = 0;while(p != NULL && j < pos - 1){p = p->next;j ++;}if(p == NULL) return 0;LNode *t = (LNode*)malloc(sizeof(LNode));t->data = e;t->next = p->next;p->next = t;return 1;
}// 链表中指定节点后面插入(后插) 
bool InsertNextNode(LNode *p, ElemType e){if(p == NULL) return 0;LNode *s = (LNode *)malloc(sizeof(LNode));if(s == NULL) return 0;s->data = e;s->next = p->next;p->next = s;return 1;
}// 链表中指定节点前面插入(前插)
// 注意前插操作要确定是不是第一个节点,是的话要特殊处理
bool InsertPriorNode(LNode *p, ElemType e){
//	cout << (p->data) << endl;
//	p = p->next;if(p == NULL) return 0;LNode *s = (LNode*)malloc(sizeof(LNode));if(s == NULL) return 0;s->next = p->next;s->data = p->data;p->data = e;p->next = s;return 1;
}

链表的删除操作

点击查看代码
// 删除第pos个节点并传回 
bool DeleteNodePos(LinkList L, int pos, ElemType &e){if(pos < 1) return 0;LNode *p = L;int j = 0;while(p != NULL && j < pos - 1){p = p->next;j ++;}if(p == NULL || p->next == NULL) return 0;e = p->next->data;p->next = p->next->next;return 1;
}// 删除指定节点 
// 如果要删除的是最后一个会出现无值可删的bug
bool DeleteNodeVal(LNode *p){if(p == NULL) return 0;p->data = p->next->data;p->next = p->next->next;return 1; 
}

获取链表元素以及获取长度

点击查看代码
// 链表中获取第i个节点 
LNode *GetElem(LinkList L, int i){if(i < 0) return NULL;LNode *p;int j = 0;p = L;while(p != NULL && j < i){p = p->next;j ++;}return p;
}// 链表中获取值为e的节点 
LNode *LocateElem(LinkList L, ElemType e){LNode *p = L;while(p != NULL && p->data != e){p = p->next;}return p;
}// 获取链表长度 
int GetLength(LinkList L){LNode *p = L;int len = 0;while(p->next != NULL){p = p->next;len ++;}return len;
}

链表头插、尾插实现初始化

点击查看代码
// 尾插节点 
LinkList List_TailInsert(LinkList &L, int n){int x;L = (LinkList)malloc(sizeof(LNode));LNode *s, *p = L;for(int i = 1;i <= n;i ++){cin >> x;s = (LNode *)malloc(sizeof(LNode)); s->data = x;p->next = s;p = s;}p->next = NULL;return L;
}// 头插节点 (逆置链表操作)
LinkList List_HeadInsert(LinkList &L, int n){int x;L = (LinkList)malloc(sizeof(LNode));L->next = NULL; // 没这句话就是无头节点的链表 LNode *s, *p = L;for(int i = 1;i <= n;i ++){cin >> x;s = (LNode *)malloc(sizeof(LNode)); s->data = x;s->next = p->next;p->next = s; }return L;
}

output链表
void ListPrint(LNode *L){
LNode *p = L;
p = p->next;
while(p != NULL){
cout << p->data << ' ';
p = p->next;
cout << endl;
}

完整代码:

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
typedef int ElemType;
typedef struct LNode{ElemType data;struct LNode *next;
}LNode, *LinkList;// 无头节点初始化链表 
bool InitListNoHead(LinkList &L){ return (L == NULL);
}// 有头节点的初始化链表 
bool InitListWithHead(LinkList &L){L = (LNode *) malloc(sizeof(LNode));if(L == NULL) return 0;L->next = NULL;return 1;
}// 在链表中指定位置插入值 
bool InsertElemPos(LinkList &L, int pos, int e){if(pos < 1) return 0;LNode *p = L;int j = 0;while(p != NULL && j < pos - 1){p = p->next;j ++;}if(p == NULL) return 0;LNode *t = (LNode*)malloc(sizeof(LNode));t->data = e;t->next = p->next;p->next = t;return 1;
}// 链表中指定节点后面插入(后插) 
bool InsertNextNode(LNode *p, ElemType e){if(p == NULL) return 0;LNode *s = (LNode *)malloc(sizeof(LNode));if(s == NULL) return 0;s->data = e;s->next = p->next;p->next = s;return 1;
}// 链表中指定节点前面插入(前插) 
bool InsertPriorNode(LNode *p, ElemType e){
//	cout << (p->data) << endl;p = p->next;if(p == NULL) return 0;LNode *s = (LNode*)malloc(sizeof(LNode));if(s == NULL) return 0;s->next = p->next;s->data = p->data;p->data = e;p->next = s;return 1;
}// 删除第pos个节点并传回 
bool DeleteNodePos(LinkList L, int pos, ElemType &e){if(pos < 1) return 0;LNode *p = L;int j = 0;while(p != NULL && j < pos - 1){p = p->next;j ++;}if(p == NULL || p->next == NULL) return 0;e = p->next->data;p->next = p->next->next;return 1;
}// 删除指定节点 
bool DeleteNodeVal(LNode *p){if(p == NULL) return 0;p->data = p->next->data;p->next = p->next->next;return 1; 
}// 链表中获取第i个节点 
LNode *GetElem(LinkList L, int i){if(i < 0) return NULL;LNode *p;int j = 0;p = L;while(p != NULL && j < i){p = p->next;j ++;}return p;
}// 链表中获取值为e的节点 
LNode *LocateElem(LinkList L, ElemType e){LNode *p = L;while(p != NULL && p->data != e){p = p->next;}return p;
}// 获取链表长度 
int GetLength(LinkList L){LNode *p = L;int len = 0;while(p->next != NULL){p = p->next;len ++;}return len;
}// 尾插节点 
LinkList List_TailInsert(LinkList &L, int n){int x;L = (LinkList)malloc(sizeof(LNode));LNode *s, *p = L;for(int i = 1;i <= n;i ++){cin >> x;s = (LNode *)malloc(sizeof(LNode)); s->data = x;p->next = s;p = s;}p->next = NULL;return L;
}// 头插节点 (逆置链表操作)
LinkList List_HeadInsert(LinkList &L, int n){int x;L = (LinkList)malloc(sizeof(LNode));L->next = NULL; // 没这句话就是无头节点的链表 LNode *s, *p = L;for(int i = 1;i <= n;i ++){cin >> x;s = (LNode *)malloc(sizeof(LNode)); s->data = x;s->next = p->next;p->next = s; }return L;
}// 打印链表 
void ListPrint(LNode *L){LNode *p = L;p = p->next;while(p != NULL){cout << p->data << ' ';p = p->next;}cout << endl;
}
int main(){LinkList L;ElemType val;int n; cin >> n;List_HeadInsert(L, n);ListPrint(L);cout << "获取链表长度:\n"; int len = GetLength(L);cout << "len:" << len << endl;cout << "插入指定位置:\n"; InsertElemPos(L, 3, 3);ListPrint(L);cout << "插入指定节点的后面:\n"; InsertNextNode(L, 3); ListPrint(L);cout << "插入指定节点的前面:\n"; InsertPriorNode(L, 100); ListPrint(L);cout << "获取第i个节点:\n"; LNode *T = GetElem(L, 2);cout << (T->data) << endl;cout << "获取值为e的节点:\n"; T = LocateElem(L, 2);cout << (T->data) << endl;	cout << "删除第3个节点:\n"; DeleteNodePos(L, 3, val);cout << val << endl;ListPrint(L);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/800060.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

想做数据报表?你的“后台”够硬吗

在数据驱动的时代,制作一份高效、精准的数据报表成为企业管理和决策的重要手段。但要做好数据报表,不仅需要一款功能强大的报表工具,还必须有一个强有力的“后台”管理系统来支撑。那么,为什么报表工具需要一个管理后台?以及管理后台的核心功能有哪些?今天就带大家一探究…

centos789手动无脑用sh脚本安装Java8

#老师给的文件是jdk1.8版本,所以我这边写的也是1.8的脚本 输入命令:mkdir –p /export/data #放置相关的数据文件 输入命令mkdir –p /export/servers #软件的安装目录 输入命令:mkdir –p /export/software 上传文件jdk-8u241-linux-x64.tar.gz到/export/software目录 然后…

C++ vector 的一些操作

▲ 《C++ Primer》 P87▲ 《C++ Primer》 P91

BoardLight

​​这是一个easy程度的靶机,所以博主写的也很简单,总共有2个flag。 信息收集端口扫描: ​​发现开放了22,80端口 Web渗透 ​​最底部发现域名 board.htb写进/etc/hosts​文件中 sudo echo "10.10.11.11 board.htb" | sudo tee -a /etc/hosts 对他进行子域名爆破…

LLM学习笔记-长度外推技术

长度外推为在不需要对模型进行额外训练的情况下,模型可以处理更长的序列。本篇文章主要介绍目前大模型用到的一些长度外推技术,包括以RoPE为基础进行位置插值、NTK-aware、动态NTK、NTK-by-parts 和YaRN。关于RoPE,可参见我的上一篇博客LLM学习笔记-位置编码篇 位置插值 回想…

裘立帆-第一次作业

在博客园建立个人技术博客,完善个人信息及博客设置,并发布一篇包含自我介绍、技能树与技术偏好、课程期望的随笔,以此作为课程参与的开始。这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc/这个作业的目标 熟悉博客的写作和使用,将自己介绍给老师和助教姓名…

章14——集合——集合体系

目录两个难点 底层机制,和不同应用场景下的选择集合体系图,需要背诵!总结: 1、集合主要是两组(单列集合、双列集合) 2、Collection 接口有两个重要的子接口 List Set, 他们的实现子列都是单列集合 3、Map 接口实现的子类是双列集合,存放的是key,value 4、上述两张图要记…

使用 VSCode 调试 Zig

首要条件是你本地需要安装MinGW-w64. 可以参考MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本 - jack_Meng - 博客园 (cnblogs.com) 这里有几点需要注意,在2024年9月时,我没有找exe的安装,你需要在github下载 Releases niXman/mingw-builds-binaries (github.com) …

Go 入门指南:8.5. map 的排序

原创 吃个大西瓜 Coding Big Tree2024年09月19日 08:00 云南map 默认是无序的,不管是按照 key 还是按照 value 默认都不排序(详见第 8.3 节)。 如果你想为 map 排序,需要将 key(或者 value)拷贝到一个切片,再对切片排序(使用 sort 包,详见第 7.6.6 节),然后可以使用…

频率响应9

频率响应 公式推导 正弦输入的一般形式 \[u(t)=Asin(\omega_i)+bcos(\omega_i) \]整理 \[u(t)=M_i sin(\omega_i t + \phi_i) \\其中 \phi_i=arctan \frac{B}{A} \qquad ,M_i=\sqrt{A^2+B^2} \]输入到系统 G(s) \[\begin{aligned} U(s)& =\mathcal{L}[u\left(t\right)]=\…

vscode 搜索框3个按钮分别代表什么

https://blog.csdn.net/u012292754/article/details/108307288相信坚持的力量,日复一日的习惯.