创建链表:头插法与尾插法
两种方法的区别无非是插入的位置:
头插法:新插入结点始终未当前的第一个结点
尾插法:新插入结点始终为当前的最后一个结点
头插法建表
![](http://upload-images.jianshu.io/upload_images/1233356-a44dae25871efaa7.png)
实现代码:
//头插法建链表
void HeadCreateList(LinkList L,int n)
{ int i;srand(time(0)); //初始化随机数种子L = (LinkList)malloc(sizeof(LNode));L ->next = NULL;LinkList p;//利用循环生成结点并添加到单链表中 for(i = 0;i < n;i++){p = (LinkList)malloc(sizeof(LNode)); //生产新结点 p ->data = rand()%100 + 1; //生产两位随机数100p ->next = L ->next; L ->next = p; //插到表头 }
}
尾插法建表
![](http://upload-images.jianshu.io/upload_images/1233356-bf0c3251afd60e05.jpg)
实现代码:
void TailCreateList(LinkList L,int n)
{LinkList p,tail;int i;srand(time(0)); //初始化随机数种子L = (LinkList)malloc(sizeof(LNode));tail = L;for(i = 0;i < n;i++){p = (LinkList)malloc(sizeof(LNode)); //生产新结点 p ->data = rand()%100 + 1; //生产两位随机数100tail ->next = p; //将表尾终端结点的指针指向新结点 tail = p; //将当前的新结点定义为表尾的尾结点 }tail->next = NULL; //当前链表结束
}
有趣的算法:查找单链表的中间结点
就是给你一个单链表,要你获得单链表中位置中间的结点?你会怎么做?
一般我们可能用一个指针,从头到尾撸一遍,同时记录单链表的长度,然后再除以2得出第几
项为中间结点,然后再撸length / 2获得中间节点,重复遍历很繁琐,有没有其他的方法呢?
有,肯定有,这里提供一个简单的方法:
用两个不同的指针,按照不同的移动顺序来移动,这里我们暂且把他们成为快慢指针!
每次循环,快指针向后移动两个结点: p = p -> next -> next;
慢指针向后移动一个结点: q = q -> next;
当快指针到达尾部的时候,慢指针不就指向中间结点了,你说是吧~
原理非常简单,下面我们写下代码实现:
Status GetMidLNode(LinkList *L,ElemType *e)
{LinkList p,q;p = q = *L;while(p ->next ->next != NULL){if(p ->next ->next != NULL){p = p ->next ->next;q = q ->next;}else{p = p ->next;}} e = q ->data;return OK;
}
12种基础基本操作代码实现
从本节开始就不像上一节一样一步步地讲解了,直接上代码,难点部分会写下注释!
1)构造空表
void InitList(LinkList L)
{L = (LinkList)malloc(sizeof(LNode));if(!L)exit(ERROR);L ->next = NULL;
}
2)将链表置为空表
void ClearList(LinkList L)
{LinkList p = L ->next;L ->next = NULL;//接着就是释放头结点以外的结点了while(p){p = L->next;free(L); //释放首元结点L = p; //移动到当前的首元结点 }
}
3)判断是否为空表
这里要区分两种情况:
有头结点:L -> next = NULL;此时表为空表!
无头结点:L = NULL;此时为空表!
Status ListEmpty(LinkList L)
{//有头节点的情况,只需判断头结点的指针域是否为空即可if(L ->next)return FALSE;else return TRUE;
}
4)销毁单链表
void DestoryList(LinkList L)
{LinkList q;//删除头结点外的结点 while(L){//指向首元结点,而不是头结点 q = L ->next;free(L);L = q; //删除后指向首元 }
}
5)获得表长度
int ListLength(LinkList L)
{int i = 0;LinkList p = L ->next;while(p){i++;p = p ->next;}return i;
}
6)获得表中第i个元素的值
Status GetElem(LinkList L,int i,ElemType *e)
{int j = 1;//指向首元,然后依次后移,假如到了结尾或者j的值大于i//还没找个改元素说明i不合法LinkList p = L ->next;while(p && j < i){j++;p = p ->next;} if(!p || j> i)return ERROR;e = p ->data;return OK;
}
7)查找表中是否存在满足条件的元素
int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
{int i = 0; LinkList p = L -> next; while(p) { i++; if(compare(p->data,e))return i; p = p -> next; } return 0;
}
8)获得某个结点的直接前驱
Status BeforeElem(LinkList L,ElemType choose,ElemType *before)
{LinkList q,p = L ->next;while(p ->next){q = p ->next;//判断p的后继是否为choose,是的话返回OK,否则继续后移 if(q ->data == choose){before = p ->data;return OK; }p = q; }return ERROR;
}
9.获得某个结点的直接后继
Status NextElem(LinkList L,ElemType choose,ElemType *behind)
{LinkList p = L ->next;while(p ->next){if(p ->data == choose){behind = p ->next ->data;return OK;}p = p ->next;}return ERROR;
}
10.往表中第i个位置插入元素
Status ListInsert(LinkList L,int i,ElemType e)
{int j = 0;LinkList p,q =L; //让q指向头结点while(p && j < i - 1){j++;p = p ->next; //p指向下一个节点 }if(!p || j > i - 1)return ERROR;p = (LinkList)malloc(sizeof(LNode));//要先让插入的结点的指针域指向插入位置的后继结点 //再让插入节点的前驱的指针域指向插入结点 //!!!顺序不能乱哦1 p ->data = e;p ->next = q ->next;q ->next = p;return OK;
}
![](http://upload-images.jianshu.io/upload_images/1233356-1a506fcf06dd2227.png)
11.删除表中第i个元素
Status ListDelete(LinkList L,int i,ElemType *e)
{int j = 0;LinkList p,q = L;while(q ->next && j < i -1){j++;q = q->next;}if(!q || j >i -1)return ERROR;p = q ->next; //指向准备删除的结点q ->next = p ->next; //删除结点的前驱的指针域指向删除结点的后继 e = p ->data; free(p); //释放要删除的结点 return OK;
}
![](http://upload-images.jianshu.io/upload_images/1233356-37b7521d4fe87596.png)
12.遍历单链表中的所有元素
void ListTraverser(LinkList L,void(*visit)(ElemType))
{LinkList p = L ->next;while(p){visit(p ->data);p = p ->next;}printf("\n");
}
参考:https://www.it610.com/article/1277924529858953216.htm
http://www.taodudu.cc/news/show-4317554.html
相关文章:
- 循环双链表的p所指的结点之前插入q所指结点的操作为()
- NotePad++ 添加HEX-Editor插件
- Notepad++安装--16进制插件HexEditor
- Notepad++增加读取二进制文件的功能——HexEditor的所有
- notepad++查看二进制.class文件——HexEditor插件(64/32位)安装教程
- 面试刷题11-26
- 达观数据中标大华智能搜索平台,助力企业打造知识共享系统
- DolphinDB智臾科技CEO周小华:《从反向控制的终极目标谈时序数据库的架构设计》
- 多测师拱墅校区__肖sir__项目讲解(1)
- 企业数字化转型思考系列文章(一)何为数字化转型?
- 一键调用API,聚合数据API服务助力企业应用创新
- 惠普HP LaserJet M42523n 打印机驱动
- 下载kaggle比赛的数据集
- tensorflow2.0实现DeepFM
- FATE —— 二.4.2 Criteo上的联邦经典CTR模型训练
- 红黑树详解,对插入旋转独到理解
- ADT 随笔 b树
- 如何利用Ghost整理硬盘的磁盘碎片
- 计算机突然断电磁盘中的程序,电脑突然断电对硬盘有影响吗 保护电脑硬盘方法【详解】...
- 文件碎片/磁盘碎片的一些知识
- 计算机点击应用时总是跳到顶端,电脑总是跳出当前应用程序
- 对计算机的磁盘进行维护,电脑硬盘如何进行维护?
- 计算机怎么改磁盘位置,如何修改磁盘0和磁盘1的硬盘位置
- 15. Linux系统中的磁盘管理
- 计算机碎片整理,如何对计算机进行碎片整理
- 深圳互联网科技公司|外企篇
- Nodejs报内部错误 TypeError: Cannot read property ‘destroy‘ of undefined的解决方法
- [ATPG]解读report_nonscan_cells -summary得到的report
- 改良IFDS扰动流场三维避障规划算法实现
- Tessent scan ATPG(7) 设计规则检查 (DRC)
创建链表:头插法与尾插法相关推荐
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
http://blog.csdn.net/xiaofeige567/article/details/27484137 C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表) ...
- 头插法、尾插法建立单链表(含详细注释C++)
一.信息须知: 1:malloc()函数,头文件为cstdlib. 用法: node *p=(node *)malloc(sizeof(node)). 作用:分配一个node类型大小的内存空间, 并把 ...
- 头插法、尾插法建立单链表
头插法.尾插法建立单链表 #include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define ...
- 头插法与尾插法建立单链表
头插法与尾插法建立单链表 import java.util.*; class Node {int value;Node next;Node(int x) {value = x;} } public c ...
- 单链表的头插法与尾插法代码实现及详解
1. 头插法 2. 尾插法 3. 代码测试 1. 头插法 头插法: 从一个空表开始,重复读入数据,生成新结点,将读入数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头结点之后,直到读入结 ...
- java单向链表中的头插法与尾插法
单链表属于数据结构中的一种基本结构,是一种线性结构,在此使用Java对其中的头插法以及尾插法进行解释.数据结构 首先定义好链表中的节点类: 其中,data表明节点所存放的数据,next表明指向下一节点 ...
- HashMap面试题 头插法、尾插法、hash冲突、数组扩容、ConcurrentHashMap
文章目录 HashMap 的数据结构? HashMap 的工作原理? HashMap 的 table 的容量如何确定?loadFactor 是什么?该容量如何变化?这种变化会带来什么问题? 数组扩容的 ...
- [数据结构]头插法与尾插法
#include "stdio.h" #include "stdlib.h" typedef struct List {int data; //数据域struc ...
- 头插法、尾插法的理解
/*************************************************************** Author :bryant~xw Created Time :201 ...
- 链表的两种创建方法——头插法与尾插法
链表创建的两种方法 引言 首先讲述了我自己在动态实现数据结构的时候遇到的大坑结构体指针问题,随后就是头插法和尾插法的介绍. 结构体指针 引言 首先需要讲述的是一个让我改了一天半的bug.实际上 ...
最新文章
- FPGA优化之高扇出
- 中国乒乓球,牛!!!!
- C#字符串:转数组、数字
- python 元组与列表的异同点 1125
- 语法分析程序的设计与实现_编译工程7:语法分析(5)
- World Wind Java开发之十四——添加WMS地图服务资源(转)
- DocumentHelper解析xml文件
- 声网 环信:是的,我们在一起了!
- Vivado Launching SDK Importing Hardware Specification error的解决方法
- 【cofface】酷派手机升级助手Coolpad Download Assistant图文教程
- UCGUI动态内存分析
- BP神经网络简单应用实例,bp神经网络应用举例
- vs2015 相关
- sicp2.4消息传递总结
- Proxy ARP--即ARP代理
- js两只手指控制div图片放大缩小功能(2)
- java计算机毕业设计智能医技预约系统源码+mysql数据库+系统+部署+lw文档
- linux中read函数读取文件夹内文件,linux下read函数
- 小岛经济学--为什么会有储蓄
- matlab深度学习工具箱LSTM学习心得