数据结构(C语言版)02---链表

链表:

声明:LNode*   LinkList在链表里面这两个是等价的;

#include<stdio.h>
#include<stdlib.h> 
typedef int Elemtype;
typedef struct LNode{Elemtype data;struct LNode* next;
}LNode,*LinkList;

链表打印函数:

 //打印void Print(LinkList L){L=L->next;while(L){printf("%3d",L->data);L=L->next;}printf("\n");} 

头插法新建链表:

定义链表头指针--》头结点申请空间--》scanf读取第一个值--》while循环读取

//头插法建立新链表LinkList list_head(LinkList&L){LNode *s;int x;L=(LinkList)malloc(sizeof(LNode));//带头结点的链表L->next=NULL;scanf("%d",&x);while(x!=9999){s=(LinkList)malloc(sizeof(LNode));s->data=x;s->next=L->next;L->next=s;scanf("%d",&x);} return L;}int main(){LinkList L;list_head(L);Print(L);return 0;}

 头插法:带头结点的链表,头结点的位置是不动的,头插法新建链表,每次添加的新节点是放在第一个结点前,并非头结点前。所以输出是逆序的。

cin:3 3 7 8 9999
cout:8  7  3  3

申请空间:申请空间malloc返回的是void* 指针,因此我们需要强制转化为(LNode*),但是空间的大小必须是结构体的大小才可以,所以写法是(即前面有幸后无形)

s=(LNode*)malloc(sizeof(LNode));
或者
s=(LinkList)malloc(sizeof(LNode));

尾插法:

 

LinkList tail_insert(LinkList&L){int x;L=(LNode*)malloc(sizeof(LNode));//带头结点的链表LNode* s;LNode* r=L;scanf("%d",&x);while(x!=9999){s=(LinkList)malloc(sizeof(LNode));s->data=x;r->next=s;r=s;scanf("%d",&x);} r->next=NULL;return L;} 

 尾插法新建链表,需要使用一个辅助指针r ,始终指向尾部,从而避免每次尾插都需要从头开始。

使得复杂度为0(1)

结点顺序,同输入顺序相同。

cin:11 2 45 9999
cout: 11  2 45

 查找:按值查找,按序查找     时间复杂度都是0(n)

//按序号查找,返回第i个 LinkList GetElem(LinkList L,int i){if(i==0) return L;if(i<0)	return NULL;int j=1;LNode*p=L->next;while(p&&j<i){p=p->next;j++;}if(!p)return NULL;return p;} //按值查找LinkList GetNum(LinkList L,int a){LNode *p=L->next;while(p&&p->data!=a){if(p->data==a) return p;p=p->next;}return NULL;} //main()函数插入
LNode* elem=GetElem(L,2);if(elem)	printf("%d ",elem->data);else printf("NULL ");LNode* num=GetNum( L,3);if(num) printf("%d",num->data);else printf("NULL ");

  注意:

1、按位置查找时,头结点一般不放值,所以按值查找从第一个结点遍历。头结点是位置 0,头结点之后的结点,是第一个结点。如果链表内元素是3,4,5,6,7,那么我们最多只能查第5个结点
2、单链表只能从前往后遍历,不能像顺序表那样拿某个位置可以直接到达,顺序表的按位置获取元素时间复杂度是0(1),但是链表位置查找的时间复杂度是 0(n),链表按值查找的时间复杂度是 O(n)                                                                                                    

插入 &删除  主要就是断链问题

//在第i个位置插入元素 bool insert_i(LinkList &L,int i,int a){if(i<1) return false;LNode *pre=GetElem(L,i-1);if(!pre) return false; LNode *p=(LNode*)malloc(sizeof(LNode));p->data=a;p->next=pre->next;pre->next=p;return true;} //在第i个位置删除元素 bool delete_i(LinkList &L,int i){if(i<0) return false;LNode *pre=GetElem(L,i-1);if(!pre) return false;LNode *p=pre->next;pre->next=p->next;free(p);return true;} //main()插入
bool insert=insert_i(L,2, 3);if(insert)	Print(L);else printf("NULL ");bool delet=delete_i(L,2);if(delet)	Print(L);else printf("NULL ");
cin:1 2 3 4 5 6 7 8 9999
cout:  1  2  3  4  5  6  7  81  3  2  3  4  5  6  7  81  2  3  4  5  6  7  8

注意:

1.往第i个位置插人,首先我们需要 GetElern 两数,拿到第i-1 个位置元素的地址,这样我们才能把要插人的元素放到 i-1 元素的后面,从而成为第i个元素


2.链表有5个元素时,我们只能插人到 1-6 位置,不能插人到第 10个位置了。可以通过 GetElem() 函数实现:获取第 i-1 个元素的地址时,如果返回的是 NULL,代表插人位置i不合法,这时我们不进行插人,所以不会给新结点申请空间

作业:王道OJ | 课时11作业 (lgwenda.com) 

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

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

相关文章

【iOS ARKit】RealityKit 同步机制

协作 Session 可以很方便地实现多用户之间的AR体验实时共享&#xff0c;但开发者需要自行负责并确保AR场景的完整性&#xff0c;自行负责虚拟物体的创建与销毁。为简化同步操作&#xff0c;RealityKit 内建了同步机制&#xff0c;RealityKit 同步机制基于 Multipeer Connectivi…

Python标准库sys常用函数、方法及代码实战解析【第108篇—标准库sys常用函数】

Python标准库sys常用函数、方法及代码实战解析 在Python的标准库中&#xff0c;sys 模块是一个常用而强大的工具&#xff0c;它提供了与Python解释器交互的函数和变量。本文将介绍sys模块的一些常用函数和方法&#xff0c;并通过实际的代码实例来解析它们的用法。 1. sys.argv…

C语言统计文件夹下所有文件数量/C语言删除文件夹下所有文件

代码解法不唯一&#xff0c;欢迎在评论区留下你的实现方式和想法&#xff0c;我会将好的解法更新到文章中&#xff01;&#xff01; 在C语言中&#xff0c;可以使用标准库中的函数来完成对文件夹中文件数量的判断和删除操作。下面是使用POSIX标准的代码示例&#xff0c;这段代…

Kafka是如何防止消息丢失的

Kafka通过一系列机制来防止消息丢失&#xff0c;主要包括以下几个方面&#xff1a; 生产者端&#xff08;Producer&#xff09;保证&#xff1a; 同步发送&#xff1a;生产者默认是异步发送消息的&#xff0c;但如果希望保证消息不丢失&#xff0c;可以选择将异步发送改为同步…

2024.2.19

1.TCP模型 服务器端 #include <myhead.h> #define SER_IP "192.168.199.129" #define SER_PORT 8899int main(int argc, const char *argv[]) {//1.创建用于连接的套接字文件int sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd-1){perror("socket error"…

P1331 海战

难度&#xff1a;普及- 题目背景 在峰会期间&#xff0c;武装部队得处于高度戒备。警察将监视每一条大街&#xff0c;军队将保卫建筑物&#xff0c;领空将布满了 F-2003 飞机。 此外&#xff0c;巡洋船只和舰队将被派去保护海岸线。不幸的是&#xff0c;因为种种原因&#x…

react 原理揭秘

1.目标 A. 能够知道setState()更新数据是异步的 B. 能够知道JSX语法的转化过程 C. 能够说出React组件的更新机制 D. 能够对组件进行性能优化 E. 能够说出虚拟DOM和Diff算法 2.目录 A. setState()的说明 B. JSX语法的转化过程 C. 组件更新机制 D. 组件性能优化 E. 虚拟DOM和D…

[Vulnhub]靶场 Web Machine(N7)

kali:192.168.56.104 主机探测: arp-scan -l 靶机ip:192.168.56.104 端口扫描 nmap -p- 192.168.56.106 看一下web 目录扫描 gobuster dir -u http://192.168.56.106 -x html,txt,php,bak,zip --wordlist/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt exp…

【QT 5 +Linux下软件qt软件打包+qt生成软件创建可以安装压缩包+学习他人文章+第三篇:学习打包】

【QT 5 Linux下软件qt软件打包qt生成软件创建可以安装压缩包学习他人文章第三篇&#xff1a;学习打包】 1、前言2、实验环境3、自我学习总结-本篇总结&#xff08;1&#xff09;了解安装包的目录结构&#xff08;2&#xff09;了解要编写文件与编写脚本1. control文件2. postin…

NVMFS5113PLWFT1G汽车级功率MOSFET 60V 10A/64A满足AEC-Q101标准

AEC-Q101认证标准详细解读&#xff1a; AEC-Q101是一种汽车电子元件可靠性标准&#xff0c;由汽车电子委员会&#xff08;Automotive Electronics Council&#xff0c;简称AEC&#xff09;制定。该标准旨在确保在汽车环境中使用的电子元件具有足够的可靠性和耐久性。 AEC-Q10…

springboot/ssm工作量统计系统Java工作记录可视化管理系统web

springboot/ssm工作量统计系统Java工作记录可视化管理系统web 基于springboot(可改ssm)vue项目 开发语言&#xff1a;Java 框架&#xff1a;springboot/可改ssm vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;…

探索JavaScript中的构造函数,巩固你的JavaScript基础

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

element-ui附件上传及在线查看详细总结,后续赋源码

一、附件上传 1、在element-ui上面复制相应代码 a、accept"image/*,.pdf,.docx,.xlsx,.doc,.xls" 是规定上传文件的类型&#xff0c;若是不限制&#xff0c;可以直接将accept‘all即可&#xff1b; b、:action"action" 这个属性就是你的上传附件的地址&am…

如何解决局域网tcp延迟高来进行安全快速内外网传输呢?

在当今企业运营中&#xff0c;数据的快速流通变得至关重要&#xff0c;但局域网内的TCP延迟问题却成为了数据传输的障碍。本文旨在分析局域网TCP延迟的成因&#xff0c;并探讨几种企业数据传输的常见模式&#xff0c;以及如何为企业选择合适的传输策略&#xff0c;以确保数据在…

非功能测试的定义、类型和示例

软件已从推动者转变为不同行业企业成功的核心支柱。因此&#xff0c;非功能测试活动成为人们关注的焦点。然而&#xff0c;许多技术和质量保证专业人员并没有意识到非功能测试的必要性。 他们必须了解什么是非功能测试以及为什么必须鼓励将其作为企业应用程序开发项目的实践。…

突破编程_C++_面试(内存管理)

面试题 1 &#xff1a;C 中的堆和栈有什么区别&#xff1f; 在 C 中&#xff0c;堆&#xff08;heap&#xff09;和栈&#xff08;stack&#xff09;是两种不同类型的内存区域&#xff0c;它们用于存储程序运行时的数据&#xff0c;并且有着各自的特点和用途。 栈&#xff08…

java之servlet

动态的web资源开发技术 不同的用户&#xff0c;或者携带不同的参数&#xff0c;访问服务器 服务器添加判断层&#xff0c;实现访问不同的web资源

【iOS ARKit】协作 Session 实例

协作 Session 使用注意事项 协作 Session 是在 ARWorldMap 基础上发展起来的技术&#xff0c;ARWorldMap 包含了一系列的地标、ARAnchor 及在观察这些地标和 ARAnchor 时摄像机的视场&#xff08;View&#xff09;。如果用户在某一个位置新创建了一个 ARAnchor&#xff0c;这时…

禅道安装与使用

文章目录 1.下载2.安装 1.下载 进入禅道官网下载 2.安装 登录后

hadoop基础

启动Hadoop cd /usr/local/hadoop ./sbin/start-dfs.sh #启动hadoop打开 ./bin/hdfs dfs ./bin/hdfs dfs -ls 针对 DataNode 没法启动的解决方法 cd /usr/local/hadoop ./sbin/stop-dfs.sh # 关闭 rm -r ./tmp # 删除 tmp 文件&#xff0c;注意这会删除 HDFS 中原有的…