数据结构单链表的查找

2023-05-16

1.单链表的查找运算 
(1)按序号查找
① 链表不是随机存取结构
     在链表中,即使知道被访问结点的序号i,也不能像顺序表中那样直接按序号i访问结点,而只能从链表的头指针出发,顺链域next逐个结点往下搜索,直至搜索到第i个结点为止。因此,链表不是随机存取结构。

② 查找的思想方法
     计数器j置为0后,扫描指针p指针从链表的头结点开始顺着链扫描。当p扫描下一个结点时,计数器j相应地加1。当j=i时,指针p所指的结点就是要找的第i个结点。而当p指针指为null且j≠i时,则表示找不到第i个结点。
注意:
     头结点可看做是第0个结点。


③具体算法实现 
   

ListNode* GetNode(LinkList head,int i)
     {//在带头结点的单链表head中查找第i个结点,若找到(0≤i≤n),
      //则返回该结点的存储位置,否则返回NULL。
      int j;
      ListNode *p;
      p=head;j=0;//从头结点开始扫描
      while(p->next&&j<i){//顺指针向后扫描,直到p->next为NULL或i=j为止
          p=p->next;
          j++;
        }
      if(i==j)
         return p;//找到了第i个结点
      else return NULL;//当i<0或i>0时,找不到第i个结点
     } 


④算法分析
     算法中,while语句的终止条件是搜索到表尾或者满足j≥i,其频度最多为i,它和被寻找的位置有关。在等概率假设下,平均时间复杂度为:(2) 按值查找
①思想方法 
     从开始结点出发,顺着链逐个将结点的值和给定值key作比较,若有结点的值与key相等,则返回首次找到的其值为key的结点的存储位置;否则返回NULL。

②具体算法实现
   

ListNode* LocateNode (LinkList head,DataType key)
      {
//在带头结点的单链表head中查找其值为key的结点

        ListNode *p=head->next;
//从开始结点比较。表非空,p初始值指向开始结点

        while(p&&p->data!=key)


//直到p为NULL或p->data为key为止

         p=p->next;//扫描下一结点
         return p;
//若p=NULL,则查找失败,否则p指向值为key的结点
       }



③算法分析
     该算法的执行时间亦与输入实例中key的取值相关,其平均时间复杂度分析类似于按序号查找,为O(n)。

//附源代码

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
char data;
struct node *next;
}ListNode;
typedef ListNode * LinkList;

//头插入法
LinkList creatListF(void)
{
LinkList head=NULL;
ListNode *s;
char ch;
ch=getchar();

while(ch!='\n')
{
s=(ListNode *)malloc(sizeof(ListNode));
if(s==NULL)
{
return NULL; 
}
s->data=ch;
s->next=head;
head=s;//head要不断向前移动,一直指着最前线,这样存储的数据与输入的数据顺序相反
ch=getchar();
}

return head;
}

//尾插入法
LinkList creatListR(void)
{
LinkList head=NULL,r=NULL;
ListNode *s;
char ch;
ch=getchar();

while(ch!='\n')
{
s=(ListNode *)malloc(sizeof(ListNode));

s->data=ch;
if(head==NULL)
head=s;//新结点插入空表 
else
r->next=s;//如果是头结点,不执行这一步,头结点特别处理

r=s;//一直指向最后一个,无论点,r肯定是指向最后一个
if(r!=NULL)
r->next=NULL;//对于非空表,将尾结点指针域置空,防止内存读写错误

ch=getchar();
}

return head;
}

//根据查找第i个结点
ListNode * getNodebyi(LinkList head,int i)
{
LinkList p=head;
int j=0;
while(p->next && j<i)//如果p->next为NULL,那么没有后结点,关键判断后继结点
{
p=p->next;
j++;
}
//循环结束后,要不p为NULL,要不j=i
if(j==i)
{
return p;
}
else 
return NULL;
}
ListNode * getNodebykey(LinkList head,char key)
{
LinkList p=head;//本程序是不带头结点的
while(p && key!=p->data)//直到p为NULL或p->data为key为止
{
p=p->next;
}
return p;//若p=NULL,则查找失败,否则p指向值为key的结点

}

void print(LinkList head)
{

while(head)
{
printf("%c ",head->data);
head=head->next;//在创建时,要将head设置为NULL,否则内存出错;LinkList head这样声明只是指向一个未知的值

}
}

int main()
{
//LinkList head=creatListF();
LinkList head=creatListR();

print(head);

//LinkList node=getNode(head,2);
//printf("\n查找第2个\n");

LinkList node=getNodebykey(head,'c');

printf("\n查找第2个\n");
printf("%c",node->data);

getchar();
return 0;
}

如有疑问,请您留言。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构单链表的查找 的相关文章

随机推荐

  • spyder增加模块代码提示功能

    最近在配置tensorflow xff0c 可是发现使用spyder的时候无法加载tensorflow的代码提示 xff0c 需要自己输入完整的函数名称 xff0c 十分不方便 xff0c 于是从网上找了一些资料 xff0c 来解决spyd
  • conda activate报错:gbk相关错误

    使用conda create n 建立新的虚拟环境后 xff0c 使用activate无法进入虚拟环境 xff0c 报了一个和gbk相关的错误 xff0c 后来经排查发现 xff0c 是系统环境变量中包含中文字符 xff0c 把系统变量中所
  • scanf源码分析

    本文分析的是glibc2 31中的scanf相关源码 xff0c 目的不是研究scanf的算法 xff0c 而是说明scanf在IO attack中的利用方法 xff0c 属于CTF的范畴 scanf c 其实就是对 vscanf inte
  • windows建立定时任务执行bat脚本

    在Linux中我们可以通过crontab来定时执行脚本 xff0c 那么windows中如何执行呢 xff1f 为了避免分支冲突 xff0c 准备在每天上班的时候自动将git远程仓库的最新版本pull下来 xff0c 然后在下班时间自动将重
  • 需账号密码登陆的网页爬虫

    对于普通网页的爬取十分简单 xff0c 如果网站没有任何反爬机制 xff0c 只要以下代码就可以实现对于网页的爬取 span class token keyword import span requests html span class
  • sqlserver通过OPENJSON转换 json数据

    OPENJSON 行集函数可将 JSON 文本转换为一组行和列 使用 OPENJSON 将 JSON 集合转换为行集后 xff0c 可以在返回的数据上运行任意 SQL 查询或将其插入到 SQL Server 表中 OPENJSON 函数采用
  • [linux]armbian修改为清华源

    查看系统发行版本 命令lsb release a 本机为基于Debian的armbian buster 所以用清华Debian源 修改apt为清华软件源 备份原文件 sudo cp etc apt sources list etc apt
  • 基础的三角函数,反三角函数,双曲函数的图形绘制(matlab)

    matlab基本图形绘制 基础的三角函数 xff0c 反三角函数 xff0c 双曲函数的图形绘制 xff1b 在此过程 xff0c 可以熟悉基础的matlab指令 xff1b 三角函数 y1 61 sin x y2 61 cos x y3
  • tkinter实现带背景图片的登录窗口

    实现功能 xff1a 打开系统登录窗口 xff0c 输入用户名密码 xff0c 点击登录后跳转到程序主界面 xff0c 用户名密码在程序代码里 xff0c 注意运行时需要自己准备一张背景图片back png 主要代码 xff1a self
  • CCF 201809-3 2018年9月第三题元素选择器(python 100分题解)

    问题描述 试题编号 xff1a 3试题名称 xff1a 元素选择器时间限制 xff1a 10 0s内存限制 xff1a 512 0MB问题描述 xff1a 提交后100分代码 xff1a 注意标签选择器大小写不敏感 xff0c 匹配时都转成
  • GitHub项目徽章的添加和设置

    原文出处 xff1a https lpd ios github io 2017 05 03 GitHub Badge Introduction 许多同学在 GitHub 上发布了自己的开源项目 xff0c 有辛苦开发的实用工具 构思巧妙的开
  • 【C++】买鸡问题练手题

    C 43 43 买鸡问题 公鸡 5 元 1 只 xff0c 母鸡 3 元 1 只 xff0c 小鸡 1 元 3 只 xff0c 花了 100 元钱买 100 只鸡 xff0c 问公鸡 母鸡 小鸡各多少只 xff1f include lt i
  • 关于Vue中的axios数据异步 获取后,更改数据,页面没有更新

    更改axios数据后 xff0c 页面没有更新解决办法 列子解决 列子 span class token comment 页面视图HTML span span class token operator lt span span span c
  • C# ToString()方法一些特殊用法

    转帖 http hi baidu com crp8 blog item d19ab0cc131b8f1300e92869 html 一 取中文日期显示 1 年月日时分 currentTime ToString 34 f 34 不显示秒 2
  • 树莓派3B+ 搭建 esp32开发环境

    目前来说esp32的整体开发体验还是不错的 xff0c 关于esp32开发环境的搭建官方也有给出指导文档 xff08 https docs espressif com projects esp idf zh CN latest esp32
  • printf源代码的分析

    1 常见的格式 span class hljs built in printf span xff08 span class hljs string 34 show int d char s 34 span span class hljs k
  • 野火学习笔记(3) —— 使用寄存器点亮 LED 灯

    文章目录 1 GPIO 简介2 GPIO 框图剖析2 1 基本结构分析2 2 GPIO 工作模式 3 实验 xff1a 使用寄存器点亮 LED 灯3 1 硬件连接3 2 启动文件3 3 stm32f10x h 文件3 4 main 文件 1
  • Meta的使用方法技巧

    Meta的使用方法技巧 xff1a Meta标签是用来描述网页属性的一种语言 xff0c 标准的Meta标签可以便于搜索引擎排序 xff0c 提高搜索引擎网站权重排名 要想网站做的更符合搜索引擎标准就必须了解meta标签 xff0c 下面由
  • CentOS 8关闭图形界面

    CentOS 8关闭图形界面 span class token comment 查看默认的启动方式 span span class token comment multi user target analogous to runlevel
  • 数据结构单链表的查找

    1 单链表的查找运算 xff08 1 xff09 按序号查找 链表不是随机存取结构 在链表中 xff0c 即使知道被访问结点的序号i xff0c 也不能像顺序表中那样直接按序号i访问结点 xff0c 而只能从链表的头指针出发 xff0c 顺