栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

2.3.3 单链表的查找操作实现以及时间复杂度分析

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2.3.3 单链表的查找操作实现以及时间复杂度分析

文章目录
  • 一、单链表的查找
  • 二、代码实现
    • 1.按位查找
    • 2.按值查找
    • 3.遍历的另一个应用,求表的长度

一、单链表的查找

与顺序表类似,单链表的查找也包括按位查找和按值查找。而且按值查找类似,都需要遍历线性表,然后一次对比数据的子变量。
与顺序表不同的是,由于顺序表是由数组实现的,可以无需遍历,可以直接按位查找,实际上,这也是与顺序表的本质有关,顺序表中逻辑结构相邻物理结构就一定相邻,所以根据位序,就可以确定数据元素的位置。但是单链表必须通过遍历,才能按位查找。

二、代码实现 1.按位查找

按位查找实际上在之前的按位插入,按值插入的操作中都已经实现过了,只不过有一些细节上的不同。
比如:按位查找不用用&

//按位查找,返回第i个元素(带头结点)
LNode * GetElem(Linklist L,int i){
	if(i<0)
		return NULL;
	LNode *p;				//指针p指向当前扫描到的结点
	int j=0;				//当前p指向的是第几个结点,也就是结点的位序
	p=L;					//头结点是第零个结点
	while(p!=NULL&&j	//循环找到第i个结点
		p=p->next;
		j++;
	}
	return p;				//返回指向对应结点的指针
}

这里的代码很简单,但是值得注意的是在这个查找函数中,返回值是对应数据元素的指针,要注意在单链表中,一个数据元素的指针就是它的名字,还有,返回值可以是任意的数据类型,这个点要注意,在使用其它人写的函数时间,要注意利用好这一点。
很容易可以看出单链表按位查找的时间复杂度是O(n),这也是所谓的按位插入和按位删除的操作的时间复杂度来源。
可以看出,在很多对于单链表的操作中,少不了对链表的遍历或者是按位查找,将这些代码封装起来更加简洁,还可以避免重复的代码,易于维护。

2.按值查找

按值查找同样是需要对于单链表进行遍历,同时进行元素值的对比,当数据元素的类型是结构体类型的时候,需要对于结构体的数据域进行比较。(是不是叫子变量来着)
按值查找同样是需要提供头结点的指针,另外还需要提供查找的值,另外进行同样的遍历,依次对比就好了,同样要返回查找到的结点的指针。

//按值查找,找到数据域==e的结点,在数据结构这门各种可以这样写,但是在C语言对于结构体的比较中,这并不可行。
LNode *(LinkList L,int e){
	LNode *p=L->next;			//这里与按位查找不同,没有一个数位数的int变量,p指针也跳过了头结点
	while(p->data!=e&&p!=NULL)
		p=p->next;
	return p;					//找到后返回结点的指针
}

上面的代码没有考虑到找不到的情况,其实直接在最后面增加一个return NULL,就好了 ,只要没有找到对应的结点,那就一律是没有找到,不管是什么不合法还是真的不存在。除非是需要特别区分。

3.遍历的另一个应用,求表的长度

求单链表的长度的一个方法就是遍历,相当于查找NULL的位置,代码如下

int Length(LinkList L){
	int len = 0;
	LNode *p=L;
	while(p->next!NULL){
		p=p->next;
		len++;
	}
	return len;
}

只要能够遍历,就可以求数量、长度或者大小。

只要看得见,就知道有多长

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/943167.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号