学习笔记之链表

题目:有一串已经从小到大排好序的数2 3 5 8 9 10 18 26 32。现需要往这串数中插入6使其得到的新序列仍符合从小到大排列。

输入样例

9
2 3 5 8 9 10 18 26 32
6

输出样例

2 3 5 6 8 9 10 18 26 32

采用链表的方法实现

#include<stdio.h>
#include<stdlib.h>//创建一个结构体用来表示链表的结点类型
struct node{int data;struct node *next;
};int main(){struct node *head,*p,*q,*t;int i,n,a;scanf("%d",&n);head=NULL;//头指针初始为空//循环读入n个数 for(int i=1;i<=n;i++){scanf("%d",&a);//动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点p=(struct node *)malloc(sizeof(struct node));//将数据存储到当前结点的值中p->data=a;//设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空 p->next=NULL;if(head==NULL){//如果这是第一个创建的结点,则将头指针指向这个结点 head=p;	}else{//如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点 q->next=p;}//指针q也指向当前结点 q=p;} //读入待插入的数 scanf("%d",&a);//从链表头部开始遍历 t=head; //当没有到达链表尾部的时候循环 while(t!=NULL){//如果当前结点下一个结点的值大于待插入数,将数插入到中间 if(t->next->data>a){//动态申请一个空间,用来存放新增结点 p=(struct node *)malloc(sizeof(struct node));p->data=a;//新增结点的后继指针指向当前结点的后继指针所指向的结点p->next=t->next;//当前结点的后继指针指向新增结点t->next=p;//插入完毕退出循环 break; }t=t->next; }t=head;while(t!=NULL){printf("%d ",t->data);t=t->next;} return 0; 
}

模拟链表(用数组的方式实现)

#include<stdio.h>int main(){int data[101],right[101];int i,n,t,len;//读入已有的数scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&data[i]);} len=n;//初始化数组rightfor(i=1;i<=n;i++){if(i!=n){right[i]=i+1;}else{right[i]=0;}} //直接在数组data的末尾增加一个数len++;scanf("%d",&data[len]);//从链表的头部开始遍历t=1;while(t!=0){//如果当前结点下一个结点的值大于待插入数,将数插入到中间 if(data[right[t]]>data[len]){//新插入数的下一个结点标号等于当前结点的下一个结点编号 right[len]=right[t]; //当前结点的下一个结点编号就是新插入数的编号right[t]=len;//插入完成跳出循环break; }t=right[t];} //输出链表中的所有数t=1;while(t!=0){printf("%d ",data[t]);t=right[t];} return 0; 
}

单链表

#include <cstring>   // 包含字符串处理库
#include <cstdlib>   // 包含标准库,用于内存分配和转换
#include <iostream>  // 包含输入输出流库
using namespace std; // 使用标准命名空间// 声明一个链表节点的结构体
typedef struct Node
{int data;              // 存储节点的值struct Node *next;     // 指向下一个节点的指针
} *LinkedList, LNode; // 定义LinkedList为Node的指针,LNode为Node// 尾插法创建单链表
void CreatLinkedList(LinkedList &L, int n)   
{L = (LinkedList)malloc(sizeof(LNode));  // 为头节点分配内存L->next = NULL;                         // 初始化下一个指针为NULLL->data = 0;                            // 初始化节点计数为0LinkedList Tail = L;                    // 尾指针,用于跟踪链表的末尾cout << "Enter " << n << " number(s)" << endl; // 提示用户输入数字for(int i = 0; i < n; i++)              // 循环读取'n'个数字{LinkedList Temp = (LinkedList)malloc(sizeof(LNode)); // 为新节点分配内存cin >> Temp->data;                  // 读取数据到新节点Tail->next = Temp;                  // 将新节点链接到链表末尾Tail = Temp;                        // 移动尾指针到新节点Temp = NULL;                        // 将Temp设为NULL(不严格必要)L->data++;                          // 增加头节点中的计数}Tail->next = NULL;                      // 确保最后一个节点的下一个指针为NULL
}// 获取指定位置的元素
bool GetElem(int &e, int i, LinkedList L) 
{while(L != NULL && i > 0)              // 遍历链表,直到达到指定索引{i--;                                // 索引递减L = L->next;                        // 移动到下一个节点}if(i == 0 && L != NULL)                // 如果索引为0且当前节点不为NULL{e = L->data;                       // 获取当前节点的数据return true;                       // 返回成功}else return false;                     // 返回失败
}// 在指定位置插入元素
bool InsertElem(int e, int i, LinkedList L)  
{if(i > L->data + 1 || i < 1)           // 检查位置是否有效return false;                      // 如果无效,返回falseelse{L->data++;                         // 增加节点计数while(i > 1)                       // 遍历到插入位置的前一个节点{i--;                           // 索引递减L = L->next;                   // 移动到下一个节点}LinkedList Temp = (LinkedList)malloc(sizeof(LNode)); // 为新节点分配内存Temp->data = e;                    // 设置新节点的数据Temp->next = L->next;              // 将新节点链接到下一个节点L->next = Temp;                    // 将当前节点链接到新节点Temp = NULL;                       // 将Temp设为NULL(不严格必要)return true;                       // 返回成功}
}// 删除指定位置的元素
bool DeleteElem(int i, LinkedList L) 
{if(i > L->data || i < 1)               // 检查位置是否有效return false;                      // 如果无效,返回falseelse{L->data--;                         // 减少节点计数while(i > 1)                       // 遍历到删除位置的前一个节点{i--;                           // 索引递减L = L->next;                   // 移动到下一个节点}LinkedList Temp = L->next;        // 存储要删除的节点L->next = Temp->next;              // 将当前节点链接到被删除节点的下一个节点free(Temp);                        // 释放被删除节点的内存Temp = NULL;                       // 将Temp设为NULL(不严格必要)return true;                       // 返回成功}
}// 销毁单链表并释放内存
bool DestoryLinkedList(LinkedList &L)   
{if(L->next != NULL)                    // 如果还有更多节点要处理DestoryLinkedList(L->next);       // 递归销毁下一个节点free(L);                               // 释放当前节点的内存L = NULL;                              // 将指针设为NULLreturn true;                           // 返回成功
}// 清空单链表但不销毁头节点
bool ClearLinkedList(LinkedList &L) 
{DestoryLinkedList(L->next);            // 清除下一个节点L->next = NULL;                        // 将头节点的下一个指针设为NULLL->data = 0;                           // 重置节点计数为0return true;                           // 返回成功
}// 遍历并打印链表的所有元素
void GetLinkedList(LinkedList L)    
{LinkedList Head = L->next;             // 从第一个实际节点开始while(Head != NULL)                     // 遍历链表直到结束{cout << Head->data << endl;        // 打印当前节点的数据Head = Head->next;                 // 移动到下一个节点}
}int main()
{int n, i, Elem;                         // 用于存储元素个数、位置和元素值的变量bool Flag;                              // 用于表示成功与否的标志LinkedList L;                           // 声明链表cout << "How many Elem(s) do you want to create?" << endl; // 提示用户输入元素个数cin >> n;                               // 读取元素个数CreatLinkedList(L, n);                  // 创建包含'n'个元素的链表cout << "Here is what they look like:" << endl; // 显示链表GetLinkedList(L);                       // 调用函数打印链表cout << "Which position of Elem do you want?" << endl; // 提示输入要获取的元素位置cin >> i;                               // 读取位置Flag = GetElem(Elem, i, L);             // 尝试获取指定位置的元素if(Flag == true)                        // 检查元素是否找到cout << Elem << endl;               // 打印找到的元素elsecout << "No matching Elem" << endl; // 如果没有找到,打印错误信息cout << "What Elem you wanna insert, and where?" << endl; // 提示用户输入要插入的元素cout << "Elem :";cin >> Elem;                           // 读取要插入的元素值cout << "Position :";cin >> i;                              // 读取插入位置Flag = InsertElem(Elem, i, L);         // 尝试插入元素if(Flag == true)                       // 检查插入是否成功{cout << "Succeeded!" << endl;      // 打印成功信息GetLinkedList(L);                  // 显示插入后的链表}elsecout << "Failed!" << endl;         // 打印失败信息cout << "Which position of Elem do you want to delete:" << endl; // 提示输入删除位置cin >> i;                              // 读取删除位置Flag = DeleteElem(i, L);               // 尝试删除指定位置的元素if(Flag == true)                       // 检查删除是否成功{cout << "Succeeded!" << endl;      // 打印成功信息GetLinkedList(L);                  // 显示删除后的链表}elsecout << "Failed!" << endl;         // 打印失败信息if(ClearLinkedList(L))                 // 尝试清空链表cout << "LinkedList Cleared!" << endl; // 打印成功信息GetLinkedList(L);                      // 验证链表是否为空if(DestoryLinkedList(L))               // 尝试销毁链表cout << "LinkedList Destroyed!" << endl; // 打印成功信息if(L == NULL)                         // 检查链表指针是否为NULLcout << "Check" << endl;          // 打印验证信息return 0;                              // 程序结束
}

双链表

#include <iostream> 
#include<cstring>
using namespace std;
class ListNode
{
public:char data;ListNode* prev;ListNode* next;ListNode(){data = '0';prev = nullptr;next = nullptr;}ListNode(int x){data = x;prev = nullptr;next = nullptr;}
};
class DoubleLinkedList
{
public:void InsertElement(int, char);//插入功能void CreatList(const char*);//创建列表功能void SequentialPrint(void);//顺序输出void ReversePrint(void);//逆序输出void DeleteElement(int);//删除功能bool Judge_HUIWEN(void);//判断回文DoubleLinkedList(){head = new ListNode;tail = new ListNode;length = 0;head->data = '0';head->next = tail;head->prev = nullptr;tail->data = '0';tail->prev = head;tail->next = nullptr;}~DoubleLinkedList(){ListNode* p = nullptr;while (head){p = head;head = head->next;delete p;};}ListNode* head;ListNode* tail;
private:int length = 0;
};
void DoubleLinkedList::InsertElement(int position, char element)
{if (position <1 || position>length + 1){return;}ListNode* p = head;for (int i = 1; i < position; i++){p = p->next;}ListNode* q = p->next;ListNode* tmp = new ListNode(element);length++;tmp->prev = p;p->next = tmp;tmp->next = q;q->prev = tmp;
}
void DoubleLinkedList::CreatList(const char* str)
{int x_len = strlen(str);for (int i = 0; i < x_len; i++){this->InsertElement(i + 1, str[i]);}
}
void DoubleLinkedList::SequentialPrint()
{if (length == 0){return;}ListNode* p = head->next;while (p->next){cout << p->data;p = p->next;}cout << endl;
}
void DoubleLinkedList::ReversePrint()
{if (length == 0){return;}ListNode* p = tail->prev;while (p->prev){cout << p->data;p = p->prev;}cout << endl;
}
void DoubleLinkedList::DeleteElement(int location)
{if (location > length || location < 1){return;}ListNode* p = head;if (location == length){for (int i = 1; i < location; i++){p = p->next;}ListNode* q = p->next;delete q;length--;p->next = this->tail;this->tail = p;}else{for (int i = 1; i < location; i++){p = p->next;}ListNode* q1 = p->next;ListNode* q2 = p->next->next;delete q1;length--;p->next = q2;q2->prev = p;}
}
bool DoubleLinkedList::Judge_HUIWEN()
{ListNode* p = head;ListNode* q = tail;while (true){if ((p == q) || (p->prev == q))return 1;if (p->data != q->data)return 0;p = p->next;q = q->prev;}
}
int main() {DoubleLinkedList obj;char temp[105] = {};cin >> temp;obj.CreatList(temp);if (obj.Judge_HUIWEN()){obj.SequentialPrint();cout << "True" << endl;}else{obj.SequentialPrint();cout << "False" << endl;}while (true){int x;cin >> x;obj.DeleteElement(x);obj.SequentialPrint();}system("pause");return 0;
}

循环链表

#include <iostream>
#include <cstring>
using namespace std;class ListNode {
public:char data;ListNode* next;ListNode() : data('0'), next(nullptr) {}ListNode(char x) : data(x), next(nullptr) {}
};class CircularLinkedList {
public:CircularLinkedList();~CircularLinkedList();void InsertElement(int position, char element);void CreateList(const char* str);void SequentialPrint() const;void DeleteElement(int position);bool Judge_HUIWEN() const;private:ListNode* head;int length;
};CircularLinkedList::CircularLinkedList() : head(nullptr), length(0) {}CircularLinkedList::~CircularLinkedList() {if (head) {ListNode* current = head;do {ListNode* nextNode = current->next;delete current;current = nextNode;} while (current != head);}
}void CircularLinkedList::InsertElement(int position, char element) {if (position < 1 || position > length + 1) {return;}ListNode* newNode = new ListNode(element);if (length == 0) {head = newNode;newNode->next = head; // point to itself} else {ListNode* current = head;for (int i = 1; i < position - 1; i++) {current = current->next;}newNode->next = current->next;current->next = newNode;if (position == 1) {head = newNode; // update head if inserted at the beginning}}length++;
}void CircularLinkedList::CreateList(const char* str) {for (int i = 0; i < strlen(str); i++) {InsertElement(i + 1, str[i]);}
}void CircularLinkedList::SequentialPrint() const {if (length == 0) {return;}ListNode* current = head;do {cout << current->data;current = current->next;} while (current != head);cout << endl;
}void CircularLinkedList::DeleteElement(int position) {if (position < 1 || position > length) {return;}ListNode* current = head;if (position == 1) {if (length == 1) {delete head;head = nullptr;} else {ListNode* tail = head;while (tail->next != head) {tail = tail->next;}tail->next = head->next;delete head;head = tail->next;}} else {for (int i = 1; i < position - 1; i++) {current = current->next;}ListNode* toDelete = current->next;current->next = toDelete->next;delete toDelete;}length--;
}bool CircularLinkedList::Judge_HUIWEN() const {if (length == 0) return true;ListNode* front = head;ListNode* back = head;for (int i = 0; i < length; i++) {back = back->next;}for (int i = 0; i < length / 2; i++) {if (front->data != back->data) {return false;}front = front->next;back = head; // Reset back to headfor (int j = 0; j < length - i - 1; j++) {back = back->next;}}return true;
}int main() {CircularLinkedList obj;char temp[105] = {};cin >> temp;obj.CreateList(temp);if (obj.Judge_HUIWEN()) {obj.SequentialPrint();cout << "True" << endl;} else {obj.SequentialPrint();cout << "False" << endl;}while (true) {int x;cin >> x;obj.DeleteElement(x);obj.SequentialPrint();}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

LEAN 赋型唯一性(Unique Typing)之 Church-Rosser 定理 (Church-Rosser Theorem)及 赋型唯一性的证明

有了并行K简化的概念及其属性&#xff0c;以及其在LEAN类型理论中的相关证明&#xff0c;就可以证明&#xff0c;在K简化下的Church-Rosser 定理。即&#xff1a; 其过程如下&#xff1a; 证明如下&#xff1a; 其中的 lemma 4.9 和 4.10 &#xff0c;及 4.8 是 这整个证明过程…

ImportError: /lib/x86 64-linux-gnu/libm.so.6:version GLIBc 2.29‘ not found

一、概述 在编译时出现一些问题&#xff0c;在网上搜索之后&#xff0c;对问题进行整理记录。 二、具体解决方法 &#xff08;一&#xff09;问题 如图所示&#xff0c;在编译过程中出现如下的问题。 &#xff08;二&#xff09;问题分析 通过在网络查询&#xff0c;在github…

后端-navicat查找语句(单表与多表)

表格字段设置如图 语句&#xff1a; 1.输出 1.输出name和age列 SELECT name,age from student 1.2.全部输出 select * from student 2.where子语句 1.运算符&#xff1a; 等于 >大于 >大于等于 <小于 <小于等于 ! <>不等于 select * from stude…

传统软件在定制化方面有哪些优势,SaaS 软件如何克服这一劣势?

一、传统软件在定制化优势 传统软件在定制化方面的优势主要体现在以下几个方面&#xff1a; 个性化需求满足&#xff1a;传统软件可以根据客户的特定需求进行个性化定制&#xff0c;提供定制化的解决方案&#xff0c;满足客户的业务流程和功能需求。灵活性和扩展性&#xff1a…

使用 Vue 3、Vite 和 TypeScript 的环境变量配置

使用 Vue 3、Vite 和 TypeScript 的环境变量配置 在开发现代前端应用时&#xff0c;环境变量是一个非常重要的概念。它可以帮助我们根据不同的环境&#xff08;开发、测试、生产&#xff09;配置不同的行为&#xff0c;比如 API 请求地址、调试选项等。在 Vue 3、Vite 和 Type…

一个.NET开发且功能强大的Windows远程控制系统

项目介绍 SiMayRemoteMonitorOS是一个基于Windows的远程控制系统&#xff0c;完全采用C#.NET开发&#xff0c;遵循AGPL-3.0开源协议。 核心功能 远程桌面&#xff1a;基于逐行扫描算法&#xff0c;提供流畅的远程桌面体验&#xff0c;支持多屏幕切换&#xff0c;以及全屏监控…

【C++】类和对象(下):再探构造函数、类型转换、static成员、友元、内部类、匿名对象、拷贝对象时编译器的优化

这篇博文是C中类和对象的最后一些知识&#xff0c;包括再探构造函数、类型转换、static成员、友元、内部类、匿名对象、拷贝对象时编译器的优化这些知识点。 1.再探构造函数 之前我们实现构造函数时&#xff0c;初始化成员变量主要是使用函数体内赋值&#xff0c;构造函数初始化…

neo4j:ubuntu环境下的安装与使用

一、neo4j安装 1. 下载安装包 进入网站&#xff1a;https://neo4j.com/deployment-center/#community 在上图中选择下载即可&#xff08;社区版免费&#xff09; 注意&#xff1a;neo4j的版本要和电脑安装的jdk版本对应&#xff0c;jdk版本使用java --version查看&#xff1a;…

计算机视觉的应用34-基于CV领域的人脸关键点特征智能提取的技术方法

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用34-基于CV领域的人脸关键点特征智能提取的技术方法。本文主要探讨计算机视觉领域中人脸关键点特征智能提取的技术方法。详细介绍了基于卷积神经网络模型进行人脸关键点提取的过程&#xff0c;包括使…

长列表加载性能优化

一、长列表优化概述 列表是应用开发中最常见的一类开发场景&#xff0c;它可以将杂乱的信息整理成有规律、易于理解和操作的形式&#xff0c;便于用户查找和获取所需要的信息。应用程序中常见的列表场景有新闻列表、购物车列表、各类排行榜等。随着信息数据的累积&#xff0c;特…

基于SpringBoot的漫画网设计与实现

博主介绍&#xff1a;专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

Java 每日一刊(第14期):抽象类和接口

“抽象是所有能力的精髓。” 前言 这里是分享 Java 相关内容的专刊&#xff0c;每日一更。 本期将为大家带来以下内容&#xff1a; 抽象类接口抽象类和接口的区别什么时候用抽象类&#xff0c;什么时候用接口抽象类可以实现接口接口中的常量其实是 public static final标记…

C语言图形编程:构建视觉效果与应用

引言 在计算机科学的领域中&#xff0c;C语言凭借其简洁、高效以及对底层硬件的强大控制能力&#xff0c;一直是系统级编程的首选语言之一。尽管近年来出现了许多高级语言&#xff0c;但C语言仍然在多个领域占据着重要地位&#xff0c;特别是在图形编程方面。本文将深入探讨如…

粒子向上持续瀑布动画效果(直接粘贴到记事本改html即可)

代码&#xff1a; 根据个人喜好修改即可 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>宽粒子向上…

MOSFET是什么,终于有了一点点感知

目录 MOSFET是什么&#xff1f;FETMOS MOSFET和功率MOSFETMOSFET功率MOSFET MOSFET是什么&#xff1f; 英文是metal-oxide-semiconductor-field-effect-transistor&#xff0c;金属氧化物半导体场效应晶体管。 可以分开来看一下&#xff0c;MOS和FET FET 其中&#xff0c;FE…

图片类型转化---模拟某wps

文件上传功能的深入探讨 文件上传是Web应用程序中常见的功能&#xff0c;它允许用户将本地文件通过Web界面发送到服务器。在Flask中&#xff0c;这通常是通过处理表单数据来实现的。表单必须设置enctype为multipart/form-data&#xff0c;这样浏览器才能将文件作为多部分消息发…

Linux常用命令(部分学习待继续补充)

pwd print working directory 打印当前的工作目录 / 根目录 ls list 列出当前目录下的所有文件 ls / ls -h(human) ls -l(long) cd change directory 更改目录 cd … 回到上一级目录 ls list ls -l 会列出文件的详细信息 第一个字符是-表示普通文件 d表示是一个目录 rwx read …

keil 下载安装 保姆级教程

一.前言 最近被安排开发一个单片机的项目&#xff0c;回头想了一下&#xff0c;自己上次弄单片机的时候&#xff0c;还都是在大学期间&#xff0c;到现在也有三四年没有碰过了&#xff0c;大部分的知识点都忘了&#xff0c;所以又重新的把以前的笔记和资料&#xff0c;拿出来温…

NXP实战笔记(十六):NXP 32K3xx系列单片机有关OTA升级的思考

目录 1、概述 2、参考资料 3、思考点1&#xff1a;需不需要传统BootLoader&#xff1f; 3.1、无需传统BootLoader 3.2、有传统BootLoader 4、OTA升级之后是否立即实施切换 5、兼容编程会话 6、APP内部集成34、36、37服务 7、Flash放置问题 1、概述 NXP的S32K3系列单片机…

初写MySQL四张表:(4/4)

进度条很喜人&#xff0c;你是否已经修炼到这一步了呢&#xff1f; 初写MySQL四张表:(1/4)-CSDN博客 初写MySQL四张表:(2/4)_数据库表样例-CSDN博客 初写MySQL四张表:(3/4)-CSDN博客 若现在你已经有了前面的基础&#xff0c;那就正式开始吧。 四张表&#xff1a; 这次在实现…