单链表不带头标准c语言实现

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。

使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。

 

下面给出不带头的单链表标准实现:

定义节点:

typedef struct node 
{ int data;struct node * next;
}Node;

尾插:

void pushBackList(Node ** list, int data) 
{ Node * head = *list;Node * newNode = (Node *)malloc(sizeof(Node));//申请空间newNode->data = data; newNode->next = NULL;if(*list == NULL)//为空*list = newNode;else//非空{while(head ->next != NULL)head = head->next;head->next = newNode;}
}

插入:

int insertList(Node ** list, int index, int data) 
{int n;int size = sizeList(*list); Node * head = *list; Node * newNode, * temp;if(index<0 || index>size) return 0;//非法newNode = (Node *)malloc(sizeof(Node)); //创建新节点newNode->data = data; newNode->next = NULL;if(index == 0) //头插{newNode->next = head; *list = newNode; return 1; }for(n=1; n<index; n++) //非头插head = head->next;if(index != size) newNode->next = head->next; //链表尾部next不需指定head->next = newNode; return 1;
}

按值删除:

void deleteList(Node ** list, int data) 
{ Node * head = *list; Node * temp; while(head->next!=NULL) { if(head->next->data != data) { head=head->next; continue; } temp = head->next;if(head->next->next == NULL) //尾节点删除head->next = NULL; else head->next = temp->next; free(temp);}    head = *list; if(head->data == data) //头结点删除{ temp = head; *list = head->next; head = head->next; free(temp); }
}

打印:

void printList(Node * head) 
{ Node * temp = head; for(; temp != NULL; temp=temp->next) printf("%d ", temp->data); printf("\n"); 
}

清空:

void freeList(Node ** list) 
{ Node * head = *list; Node * temp = NULL; while(head != NULL) //依次释放{ temp = head; head = head->next; free(temp); } *list = NULL; //置空
}

别的也没啥了,都是基本操作

有些代码要分情况,很麻烦,可读性较强吧

看我压缩代码:https://blog.csdn.net/hebtu666/article/details/81261043

 

 

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

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

相关文章

Java设计模式(4 / 23):单例模式

文章目录单例模式的应用场景饿汉式单例模式懒汉式单例模式改进&#xff1a;synchronized改进&#xff1a;双重检查锁改进&#xff1a;静态内部类破坏单例用反射破坏单例用序列化破坏单例解密注册式单例模式枚举式单例模式解密容器式单例线程单例实现ThreadLocal单例模式小结参考…

约瑟夫环-(数组、循环链表、数学)

约瑟夫环&#xff08;约瑟夫问题&#xff09;是一个数学的应用问题&#xff1a;已知n个人&#xff08;以编号1&#xff0c;2&#xff0c;3...n分别表示&#xff09;围坐在一张圆桌周围。从编号为k的人开始报数&#xff0c;数到m的那个人出列&#xff1b;他的下一个人又从1开始报…

Ubuntu麒麟下搭建FTP服务

一.怎么搭建FTP服务&#xff1a; 第一步>>更新库 linuxidclinuxidc:~$ sudo apt-get update 第二步>>采用如下命令安装VSFTPD的包 linuxidclinuxidc:~$ sudo apt-get install vsftpd 第三步>>安装完成后打开 /etc/vsftpd.conf 文件&#xff0c;按如下所述…

《数据结构上机实验(C语言实现)》笔记(1 / 12):绪论

文章目录验证性实验求1~n的连续整数和说明放码结果常见算法时间函数的增长趋势分析说明放码结果设计性实验求素数个数说明放码结果求连续整数阶乘的和说明放码结果验证性实验 求1~n的连续整数和 说明 对于给定的正整数n&#xff0c;求12…n12…n12…n&#xff0c;采用逐个累…

线性表实现一元多项式操作

数组存放&#xff1a; 不需要记录幂&#xff0c;下标就是。 比如1&#xff0c;2&#xff0c;3&#xff0c;5表示12x3x^25x^3 有了思路&#xff0c;我们很容易定义结构 typedef struct node{float * coef;//系数数组int maxSize;//最大容量int order;//最高阶数 }Polynomial…

ubuntu下解压缩zip,tar,tar.gz和tar.bz2文件

在Linux下面如何去压缩文件或者目录呢&#xff1f; 在这里我们将学习zip, tar, tar.gz和tar.bz2等压缩格式的基本用法。 首先了解下Linux里面常用的压缩格式。 在我们探究这些用法之前&#xff0c;我想先跟大家分享一下使用不同压缩格式的经验。当然&#xff0c;我这里讲到的只…

《数据结构上机实验(C语言实现)》笔记(2 / 12):线性表

文章目录验证性实验实现顺序表各种基本运算的算法放码sqlist.hsqlist.cppexp2-1.cpp结果实现单链表各种基本运算的算法放码linklist.hlinklist.cppexp2-2.cpp结果实现双链表各种基本运算的算法放码dlinklist.hdlinklist.cppexp2-3.cpp结果实现循环单链表各种基本运算的算法放码…

链表排序-归并

链表排序&#xff0c;可以插入排序&#xff0c;我就不写了。 实现归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&…

ubuntu麒麟下安装并启用搜狗输入法

1.首先打开UK软件&#xff0c;输入搜狗寻找搜狗拼音软件 然后下载搜狗拼音软件 接着点击启动该软件 2.点击搜狗拼音的图标&#xff0c;进入搜狗拼音的设置窗口 点击高级&#xff0c;并打开FCITX设置 加入英语输入法 3.这样就可以进行中英文切换了

线性表表示集合

集合我们高中都学过吧&#xff1f; 最重要的几个特点&#xff1a;元素不能重复、各个元素之间没有关系、没有顺序 集合内的元素可以是单元素或者是集合。 对集合的操作&#xff1a;交集并集差集等&#xff0c;还有对自身的加减等。 需要频繁的加减元素&#xff0c;所以顺序…

家用无线路由器购买入门指南

视频一&#xff1a;「白问」普通大众 买路由器关注这几个点就够了 来源 例如商品名&#xff1a;AC 1200M 双频 AX前缀wifi6IEEE 802.11 AX AC前缀wifi5IEEE 802.11 AC AX比AC好 1200M 理论峰值 和网速无关 商家噱头 MIMO SU-MIMO 单用户多进多出&#xff08;早期&#xff…

ubuntu linux下执行.sh文件

ubuntu linux下执行.sh文件 首先&#xff0c;要确保这个文件的类型是可执行的。 有两种办法把文件设置为可执行文件。 1) 直接在文件属性标签中选中 "可执行"&#xff0c;--b 如果用的是图形界面&#xff0c;这个方法最简单直接。 2) 使用命令 chmod x file.sh。将可…

链表相交问题

本来想自己写&#xff0c;写了一半发现一篇文章&#xff0c;解释写得简单易懂&#xff0c;我就直接拿过来了。 这个问题值得反复地写&#xff0c;锻炼链表coding能力的好题。 //如果两个链表都不带环 int NotCycleCheckCross(pLinkNode head1,pLinkNode head2) {pLinkNode lis…

用JS写了一个模拟串行加法器

在重温《编码&#xff1a;隐匿在计算机软硬件背后的语言》第12章——二进制加法器时&#xff0c;心血来潮用JS写了一个模拟串行加法器。 测试断言工具TestUtils.js function assertTrue(actual){if(!actual)throw "Error actual: " actual " is not true.&q…

Android学习路线总结

title: Android学习路线总结&#xff0c;绝对干货 tags: Android学习路线,Android学习资料,怎么学习android grammar_cjkRuby: true --- 一、前言 不知不觉自己已经做了几年开发了&#xff0c;由记得刚出来工作的时候感觉自己能牛X&#xff0c;现在回想起来感觉好无知。懂的越…

双栈

利用栈底位置相对不变的特性&#xff0c;可以让两个顺序栈共享一个空间。 具体实现方法大概有两种&#xff1a; 一种是奇偶栈&#xff0c;就是所有下标为奇数的是一个栈&#xff0c;偶数是另一个栈。但是这样一个栈的最大存储就确定了&#xff0c;并没有起到互补空缺的作用&a…

Error when loading the SDK:解决方案

错误情况&#xff1a; 当打开eclipse时出现如下窗口&#xff08;内容如下&#xff09; Error when loading the SDK: Error: Error parsing \Android\adt-bundle-windows-x86_64-20140702\sdk\system-images\android-22\android-wear\armeabi-v7a\devices.xml cvc-complex-type…

单调队列优化的背包问题

对于背包问题&#xff0c;经典的背包九讲已经讲的很明白了&#xff0c;本来就不打算写这方面问题了。 但是吧。 我发现&#xff0c;那个最出名的九讲竟然没写队列优化的背包。。。。 那我必须写一下咯嘿嘿&#xff0c;这么好的思想。 我们回顾一下背包问题吧。 01背包问题 …

用Python去除扫描型PDF中的水印

内容概述 含水印扫描型PDF文件&#xff0c;其中某页如下图所示&#xff0c;用Python去除其页顶及页底的水印。 处理思路&#xff1a;PDF中的每一页的水印的相对位置基本相同&#xff0c;将PDF每一页输出成图片&#xff0c;然后进行图片编辑&#xff0c;用白色填充方形覆盖水印…

链表实现栈

栈&#xff0c;是操作受限的线性表&#xff0c;只能在一端进行插入删除。 其实就是带尾指针的链表&#xff0c;尾插 #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define Status int #define SElemType int //只在头部进行插入和删除(…