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

河北省建设工程质量监督网站/互联网营销师报名入口官网

河北省建设工程质量监督网站,互联网营销师报名入口官网,广东网站建设制作价格,如何看网站做的好坏链表分为单链表、双链表和循环链表&#xff0c;这些理论知识在笔记中自然写了&#xff0c;这里我只写出其中的实现&#xff1a; 单链表的实现 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Book {char bookname[20];char a…

链表分为单链表、双链表和循环链表,这些理论知识在笔记中自然写了,这里我只写出其中的实现:

单链表的实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>	typedef struct Book {char bookname[20];char author[10];
}Book;typedef struct Node {Book book;struct Node *next;
}Node,*LinkList;//初始化链表 
void initChainedTable(Node **L){    //ok*L=(LinkList)malloc(sizeof(Node));(*L)->next=NULL;
}
//尾结点插入 
Node* putNodeByTail(Book book,Node *r){   //okNode *node=(Node*)malloc(sizeof(Node));node->book= book;node->next=NULL;r->next=node;return node;
}
//首节点插入
void putNodeByHead(Book book,LinkList L){   //okNode *node=(Node*)malloc(sizeof(Node));node->book=book;node->next=L->next;L->next=node;
} 
//删除其中一个结点
void deleteNode(int i,LinkList L){   //okNode *node=L->next;int counter=1;if (i == 1) {if (node != NULL) {L->next = node->next;free(node);} else {printf("List is empty, cannot delete.\n");}return;}while(node&&counter<(i-1)){node=node->next;++counter;}if(!node||i<=0){printf("index is out of bound \n");}else{Node* delnode = node->next;if (delnode) {node->next = delnode->next;free(delnode);} else {printf("Node at index %d does not exist\n", i);}}}
//向链表中插入元素
void insertNode(Book book,int i,LinkList L){   //okNode *newnode=(Node*)malloc(sizeof(Node));Node *node=L->next;newnode->book=book;int count=1;while(node&&count<(i-1)){node=node->next;++count;}if(!node||i<=0){printf("index is out of bound\n");}else{newnode->next=node->next;node->next=newnode;	}} 
//判断链表是否为空
int isEmpty(LinkList L){  //okreturn L->next==NULL?1:0;
} //获取第i个结点 
Node*  getNode(int i,LinkList L){  //okNode* node=L->next;int count=1;while(node&&count<i){node=node->next;++count;}if(node&&i>0) return node;printf("index is out of bound\n"); 
} 
//通过值获取到它的位置
int getIndex(Book book,LinkList L){  //okNode* node=L->next;int count=1;while(node&&strcmp(node->book.author,book.author)&&strcmp(node->book.bookname,book.bookname)){node=node->next;++count;}if(node) return -1;return count;
} 
//打印链表中的数据 
void printNodeData(LinkList L){    //okNode *node=L->next;while(node){printf("bookname:%s;author:%s\n",node->book.bookname,node->book.author);node=node->next;}if(!node) printf("你所给的是个空链表!\n"); 
}
//释放一个链表
void freeChainedTable(LinkList L){ Node *p=L->next;Node *q;while(p){  q=p->next;free(p);p=q; }printf("清除完成!\n");L->next=NULL;
}int main(){LinkList L;initChainedTable(&L);Book book1={"java","zhangyu"};Book book2={"php","zhang"};Book book3={"c#","nanchengyu"};putNodeByHead(book1,L);putNodeByHead(book2,L);putNodeByHead(book3,L);Book book4={"java","zhang"};freeChainedTable(L);printNodeData(L);system("pause");return 0;
}

双链表的实现

#include <stdio.h>
#include <stdlib.h>//这个源文件描述的是不循环双向链表typedef struct Book {char bookname[20];char author[10];
}Book;
typedef struct doLinkList{Book book;struct doLinkList *prior,*next;struct doLinkList *ele;
}Node,*LinkList;
//初始化链表 
void initDoLinkList(LinkList *L){*L=(LinkList)malloc(sizeof(Node));(*L)->prior=NULL;(*L)->next=NULL;(*L)->ele=*L;
}
//向链表添加结点 
void putNode(Book book,Node *listNode){Node *node=(Node*)malloc(sizeof(Node));node->book=book;listNode->ele->next=node;node->prior=listNode->ele;node->next=NULL;listNode->ele=node;
}
//打印结点数据 
void printNodeData(LinkList list){if(!list->next){printf("你所给的是个空链表!\n"); return;	} Node *node=list->next;while(node){printf("bookname:%s;author:%s\n",node->book.bookname,node->book.author);node=node->next;}
}
//查找链表数据 
Node* getNode(int i,LinkList list){Node *node=list->next;int counter=1;while(node&&counter!=i&&i>0){node=node->next;++counter;}if(i<0||i>counter){printf("索引超出范围!\n");return NULL;}return node;
}//删除链表结点
void delNode(int i,LinkList list){Node *p;if(!(p=getNode(i,list))){printf("并没有找到该节点!\n");}else if(p->next){p->prior->next=p->next;p->next->prior=p->prior;}else{p->prior->next=NULL;}free(p);} //向双向节点中插入结点(末尾节点不可以插入) 
void insertNode(int i,Book book,LinkList list){Node *p;Node *node=(Node*)malloc(sizeof(Node));node->book=book;if(p=getNode(i,list)){p->prior->next=node;node->prior=p->prior;node->next=p;p->prior=node;}else {printf("插入失败!\n");}
} int main(){LinkList L;initDoLinkList(&L);Book book1={"java","zhangyu"};Book book2={"php","zhang"};Book book3={"c#","nan"};putNode(book1,L);putNode(book2,L);
//	putNode(book3,L);insertNode(2,book3,L);printNodeData(L);system("pause");return 0;
}

循环链表的实现

#include <stdio.h>
#include <stdlib.h>//这个源代码设计的是循环链表,包括设计的尾指针,两个循环链表的组合,但是链表的其他操作我们在这就不去写了
// 设计这个尾指针的目的是在对表的首尾部分进行操作的时候可以降低时间复杂度
typedef struct Book {char bookname[20];char author[10];
}Book;typedef struct Node{Book book;struct Node *next;
}Node;typedef struct LoopLinkList{Node *headNode;Node *tailNode;
} *LoopList;
//初始化循环列表 
void initLoopLinkList(LoopList *L){  //okNode *headNode=(Node*)malloc(sizeof(Node));*L=(LoopList)malloc(sizeof(LoopList));(*L)->headNode=headNode;(*L)->tailNode=headNode;
}
//向循环链表中添加结点 
void putNode(Book book,LoopList L){   //okNode *node=(Node*)malloc(sizeof(Node));node->book=book;L->tailNode->next=node;L->tailNode=node;node->next=L->headNode;
}//将第二个循环链表添加到第一个循环链表后
LoopList  connectTable(LoopList L1,LoopList L2){   //0kL1->tailNode->next=L2->headNode->next;free(L2->headNode);L2->tailNode->next=L1->headNode;L1->tailNode=L2->tailNode;return L1;
}//打印链表中的数据 
void printNodeData(LoopList L){      //okNode *node=L->headNode->next;while(node!=L->headNode){printf("bookname:%s;author:%s\n",node->book.bookname,node->book.author);node=node->next;}if(!node) printf("你所给的是个空链表!\n"); 
}
//获取循环列表的长度 
int getSize(LoopList L){    //okNode *node=L->headNode->next;int counter=0;while(L->headNode!=L->tailNode&&node!=L->headNode){node=node->next;++counter;}return counter;
}int main(){LoopList L;initLoopLinkList(&L);Book book1={"java","zhangyu"};Book book2={"php","zhang"};Book book3={"c#","nan"};putNode(book1,L);putNode(book2,L);putNode(book3,L);printf("表1:\n");printNodeData(L);LoopList L2;initLoopLinkList(&L2);Book book4={"jaa","hangyu"};Book book5={"ph","zhng"};Book book6={"c","an"};putNode(book4,L2);putNode(book5,L2);putNode(book6,L2);printf("表2:\n");printNodeData(L2);LoopList list=connectTable(L,L2);printf("连接后的表:\n");printNodeData(list);system("pause");return 0;
}

补充:能不能实现循环双链表?这样循环有意义吗或者说这种数据结构有其特点和优势吗?有的话可以设计一下

相关文章:

链表的实现(c语言)

链表分为单链表、双链表和循环链表&#xff0c;这些理论知识在笔记中自然写了&#xff0c;这里我只写出其中的实现&#xff1a; 单链表的实现 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Book {char bookname[20];char a…...

【Redis】渐进式遍历

scan命令渐进式遍历 Redis使⽤scan命令进⾏渐进式遍历键&#xff0c;进⽽解决直接使⽤keys获取键时可能出现的阻塞问题。每次scan命令的时间复杂度是O(1)&#xff0c;但是要完整地完成所有键的遍历&#xff0c;需要执⾏多次scan。 SCAN 以渐进式的⽅式进⾏键的遍历。 SCAN…...

uni-app开发微信小程序的报错[渲染层错误]排查及解决

一、报错信息 [渲染层错误] Framework nner error (expect FLOW INITIALCREATION end but get FLOW CREATE-NODE) 二、原因分析及解决方案 第一种 原因&#xff1a;基础库版本的原因导致的。 解决&#xff1a; 1.修改调试基础库版本 2.详情—>本地设置—>调试基础库…...

三、C语言常用运算符

1、算术运算符 符号说明加号-减号*乘号/除号%取余符号&#xff0c;相除以后余数是几自增运算符&#xff0c;整数值增加 1--自减运算符&#xff0c;整数值减少1 2、关系运算符 符号说明检查两个操作数的值是否相等&#xff0c;如果相等则条件为真。!检查两个操作数的值是否相…...

ubuntu联网图标消失

sudo service NetworkManager stopsudo rm /var/lib/NetworkManager/NetworkManager.statesudo service NetworkManager start执行 sudo rm /var/lib/NetworkManager/NetworkManager.state 命令将删除位于 /var/lib/NetworkManager 目录下的 NetworkManager.state 文件。...

中华人民共和国网络安全法

中华人民共和国网络安全法 《中华人民共和国网络安全法》已由中华人民共和国第十二届全国人民代表大会常务委员会第二十四次会议于2016年11月7日通过&#xff0c;现予公布&#xff0c;自2017年6月1日起施行。2022年9月12日&#xff0c;国家互联网信息办公室发布关于公开征求《…...

Java并发面试题:(二)线程池参数和使用

线程池参数 线程池工作过程 当提交一个新任务到线程池时&#xff0c;具体的执行流程如下&#xff1a; 当我们提交任务&#xff0c;线程池会根据corePoolSize大小创建若干任务数量线程执行任务 当任务的数量超过corePoolSize数量&#xff0c;后续的任务将会进入阻塞队列阻塞排…...

Python机器学习零基础理解AffinityPropagation亲和力传播聚类

如何解决社交媒体上的好友推荐问题? 想象一下,一个社交媒体平台希望提供更加精准的好友推荐功能,让用户能更容易地找到可能成为好友的人。这个问题看似简单,但当面对数百万甚至数千万的用户时,手动进行好友推荐就变得几乎不可能。 解决这个问题的一个方案就是使用机器学…...

Open3D 进阶(12)PCA拟合空间直线

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 见:Open3D 最小二乘拟合空间直线(方法一) 二、代码实现 import numpy as np import open3d as o...

4种实现JS深拷贝的方法

浅拷贝与深拷贝 浅拷贝是创建一个新对象&#xff0c;这个对象有着原始对象属性值的拷贝。如果属性是基本类型&#xff0c;拷贝的就是基本类型的值&#xff0c;如果属性是引用类型&#xff0c;拷贝的是内存地址 。 如果不进行深拷贝&#xff0c;其中一个对象改变了对象的值&am…...

六、RocketMQ发送事务消息

事务消息介绍 在一些对数据一致性有强需求的场景&#xff0c;可以用 Apache RocketMQ 事务消息来解决&#xff0c;从而保证上下游数据的一致性。 以电商交易场景为例&#xff0c;用户支付订单这一核心操作的同时会涉及到下游物流发货、积分变更、购物车状态清空等多个子系统的…...

Node.js初体验

Node.js简介 node.js的运行环境 1.V8引擎对js代码进行解析与执行 2.内置API&#xff1a;fs、path、http...等&#xff0c;提供了一些能力&#xff0c;能够使得js调用这些API去做一些后端的事情 流程&#xff1a;我们在node.js的运行环境中编写待执行的JavaScript代码&#…...

激活函数理解

激活函数&#xff08;Activation Function&#xff09;是神经网络中的一种数学函数&#xff0c;它的作用是为神经元&#xff08;或人工神经元&#xff09;引入非线性特性&#xff0c;从而使神经网络能够学习和表示更复杂的函数。激活函数通常位于神经元的输出端&#xff0c;接收…...

【docker - 安装】windows 10 专业版 安装docker,以及 WSL kernel version too low 解决方案

一、开启 Hyper-V 二、下载 docker 三、安装 docker 四、问题 Stage 1&#xff1a;打开 powershell&#xff0c;并执行 Stage 2&#xff1a;下载Linux内核更新包&#xff0c;并安装 Stage 3&#xff1a;将 WSL 2 设置为默认版本 Stage 4&#xff1a;安装所选的 Linux 分…...

洛谷P1601

题目见&#xff1a;P1601 AB Problem&#xff08;高精&#xff09; - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 1. 问题分析 加法计算问题应该和在界面输出“Hello,world!”是一个难度级别&#xff0c;但是问题在于受限于原始数据类型的限制&#xff0c;无法进行大数据的精…...

Elasticsearch:使用 LangChain 对话链和 OpenAI 的聊天机器人

在此笔记本中&#xff0c;我们将构建一个聊天机器人&#xff0c;它可以回答有关自定义数据的问题&#xff0c;例如雇主的政策。 聊天机器人使用 LangChain 的 ConversationalRetrievalChain&#xff0c;具有以下功能&#xff1a; 用自然语言回答问题在 Elasticsearch 中运行混…...

铜死亡+机器学习+WGCNA+分型生信思路

今天给同学们分享一篇单基因泛癌免疫实验生信文章“IGF2BP3 overexpression predicts poor prognosis and correlates with immune infiltration in bladder cancer”&#xff0c;这篇文章于2023年2月3日发表在BMC Cancer期刊上&#xff0c;影响因子为3.8。 膀胱癌是全球最常见…...

GB28181平台简介

产品简介 LiveMedia视频中间件是支持部署到本地服务器或者云服务器的纯软件服务&#xff0c;也提供服务器、GPU一体机全包服务&#xff0c;提供视频设备管理、无插件、跨平台的实时视频、历史回放、语音对讲、设备控制等基础功能&#xff0c;支持视频协议有海康、大华私有协议…...

JVM基础:初识JVM

IDE&#xff1a;IntelliJ IDEA 2022.1.3 x64 操作系统&#xff1a;win10 x64 位 家庭版 文章目录 一、JVM是什么&#xff1f;二、JVM有哪些功能&#xff1f;2.1 解释和运行2.2 内存管理2.3 即时编译 三、有哪些常见的JVM&#xff1f;3.1 常见JVM3.2 Java虚拟机规范3.3 HotSpot的…...

至强服务器BIOS/UEFI驱动开发笔记

至强服务器BIOS/UEFI驱动开发笔记 驱动开发基础Hello UEFI Driver 项目选择项目位置初始化驱动代码文件结构驱动程序入口和基本功能导入AMI工程AMI平台Hello UEFI Driver 编译问题测试结果打印设备列表继续开发`HelloWorldSupported`函数依赖配置使用脚本编译编译测试此DXE驱动…...

Linux:Termius连接本地虚拟机与虚拟机快照

Termius连接本地虚拟机与虚拟机快照 1. Termius连接本地虚拟机2. 虚拟机快照与还原2.1 设置快照以及恢复 附录 1. Termius连接本地虚拟机 ifconfig -a 查看配置 连接成功 2. 虚拟机快照与还原 在学习阶段我们无法避免的可能损坏Linux操作系统。 如果损坏的话&#xff0c;重新…...

高校教务系统登录页面JS分析——四川大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…...

Kafka SASL认证授权(四)认证源码解析

Kafka SASL认证授权(四)认证源码解析。 官网地址:https://kafka.apache.org/ 一、认证流程 在了解kafka网络模型的基础上,了解它的认证流程: ApiVersionsRequest->SaslHandshakeRequest->a series of SASL client and server tokens corresponding to the mechani…...

软件测试学习(一)基础概念、实质、说明书测试、分类、动态黑盒测试

目录 软件测试概念、背景 软件测试员究竟做些什么 大多数软件测试员应该具备的素质 软件测试的实质 完全测试程序是不可能的 测试无法显示潜伏的软件缺陷 并非所有软件缺陷都要修复 软件测试员在产品小组中不受欢迎 术语&#xff1a;精准和准确 产品说明书的测试技术…...

在fastapi中实现异步

在FastAPI应用中使用异步特性可以提高并发性能&#xff0c;但如果您要调用的模型是同步的&#xff0c;可能会导致阻塞。为了实现异步处理&#xff0c;您可以将阻塞的操作委托给线程池或进程池&#xff0c;以便异步执行。 以下是一种基本方法来实现异步处理图片识别任务&#x…...

js数组去重

在JavaScript中&#xff0c;有很多方法可以用来去除数组中的重复项。以下是一些常见的方法&#xff1a; 方法一&#xff1a;使用Set Set是ES6中的新数据类型&#xff0c;它只存储唯一值。因此&#xff0c;我们可以利用这一特性来去重。 let array [1, 2, 3, 2, 1, 4, 3, 5,…...

【前端】根据后端返回的url进行下载并设置文件下载名称

在我们项目当中存储文件是存储到厂商的服务器上的&#xff0c;然后厂商返回一个可以直接下载url地址&#xff0c;但是前端使用这个url下载的时候永远都是保存一个名字&#xff0c;这时候我们就需要设置文件保存的名称&#xff0c; 那么如何实现呢&#xff1f;使用了fet…...

《视觉SLAM十四讲》公式推导(一)

文章目录 CH3 三维空间刚体运动CH3-1 旋转矩阵的推导CH3-2 旋转矩阵是正交矩阵的证明CH3-3 变换矩阵的逆的推导CH3-4 罗德里格斯公式推导 CH3 三维空间刚体运动 CH3-1 旋转矩阵的推导 &#xff08;1&#xff09;二维空间中的旋转矩阵 易得 { x ′ ∣ O P ′ ∣ c o s ( θ …...

简单好用的解压缩软件:keka 中文 for mac

Keka是一款功能全面、易于使用的文件压缩和解压缩软件&#xff0c;为Mac用户提供了便捷的文件管理工具。它支持多种压缩格式&#xff0c;具有快速解压和强大的压缩功能&#xff0c;让您能够轻松地处理各种文件压缩需求。 隐私非常重要 安全共享只需设置密码并创建高度加密的文…...

【UE 插件】UE4 虚幻引擎 插件开发(带源码插件打包、无源码插件打包) 有这一篇文章就够了!!!

目录 0 引言1 快速入门1.1 新建插件的前提1.2 创建插件步骤1.3 打包插件 2 无源代码的插件制作3 插件详细介绍3.1 插件的使用方法3.1 UE 预置插件模版3.1.1 空白3.1.2 纯内容3.1.3 编辑器独立窗口3.1.4 编辑器工具栏按钮3.1.5 编辑器模式3.1.6 第三方库3.1.7 蓝图库 3.2 插件中…...