单链表的删除算法时间复杂度O(1)和O(n)

平时我们在计算单链表的第i个节点删除时间复杂度时一般认为是O(n),过程如下

1.先从头节点开始遍历链表,找到第i-1个节点

2.将第i-1节点next指向第i个节点的next

可以看到时间主要花在了遍历链表上


如果我们已经拿到了要删除的第i个节点Node(i),就不需要进行遍历操作和查找前驱节点了,直接拿Node(i+1)来覆盖Node(i)即可。

具体的做法如下:

1.Node(i)->data=Node(i)-next->data;

2.Node(i)-next=Node(i+1)->next;


这样的时间复杂度就是O(1)

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
数据结构——用C描述答案 习题解答(唐策善版)(其他版本在上面) 第一章 绪论(参考答案) 1.3 (1) O(n) (2) (2) O(n) (3) (3) O(n) (4) (4) O(n1/2) (5) (5) 执行程序段的过程中,x,y值变化如下: 循环次数 x y 0(初始) 91 100 1 92 100 2 93 100 …… …… …… 9 100 100 10 101 100 11 91 99 12 92 100 …… …… …… 20 101 99 21 91 98 …… …… …… 30 101 98 31 91 97 到y=0时,要执行10*100次,可记为O(10*y)=O(n) 1.5 2100 , (2/3)n , log2n , n1/2 , n3/2 , (3/2)n , nlog2n , 2 n , n! , n n 第二章 线性表(参考答案) 在以下习题解答中,假定使用如下类型定义: (1)顺序存储结构: #define MAXSIZE 1024 typedef int ElemType;// 实际上,ElemType可以是任意类型 typedef struct { ElemType data[MAXSIZE]; int last; // last表示终端结点在向量中的位置 }sequenlist; (2)链式存储结构(链表) typedef struct node {ElemType data; struct node *next; }linklist; (3)链式存储结构(双链表) typedef struct node {ElemType data; struct node *prior,*next; }dlinklist; (4)静态链表 typedef struct {ElemType data; int next; }node; node sa[MAXSIZE]; 2.1 头指针:指向链表的指针。因为对链表的所有操均需从头指针开始,即头指针具有标识链表的作用,所以链表的名字往往用头指针来标识。如:链表的头指针是la,往往简称为“链表la”。 头结点:为了链表操作统一,在链表第一元素结点(称为首元结点,或首结点)之前增加的一个结点,该结点称为头结点,其数据域不无实际意义(当然,也可以存储链表长度,这只是副产品),其指针域指向头结点。这样在插入和删除中头结点不变。 开始结点:即上面所讲第一个元素的结点。 2.2 只设尾指针的循环链表,从尾指针出发能访问链表上的任何结点。 2•3 void insert(ElemType A[],int elenum,ElemType x) // 向量A目前有elenum个元素,且递增有序,本算法将x插入到向量A中,并保持向量的递增有序。 { int i=0,j; while (i<elenum && A[i]<=x) i++; // 查找插入位置 for (j= elenum-1;j>=i;j--) A[j+1]=A[j];// 向后移动元素 A[i]=x; // 插入元素 } // 算法结束
工资管理系统课程设计报告 工资管理系统 课程设计报告 编写人: 同组成员、 (课程设计负责人) 、 完成日期: 、6、23 辅导教师: 批阅日期: 分数: 1 功 能 描 述 本程序主要的数据结构是链表,它由四大模块组成(如下图所示): 工资管理系统功能模块图 (1) 输入记录模块:输入记录模块主要完成数据存入链表的工作。在此工资管理系统中提 供了从键盘读入。即从键盘一一输入员工的信息(包括编号,姓名,性别,年龄,工资 等)而且读入过程会显示在屏幕上。 (2) 查询记录模块:查询也提供了两种关键字方式,按编号和按姓名查询。该模块的主要工 作是在链表中查找满足关键字的员工信息,用户能够选择以中方式进行查询,如果找 到返回该员工节点而且打印该员工的工资信息,否则返回空指针NULL,并打印没有找到 的提示。 (3) 更新记录模块:更新数据包括对员工工资信息的删除、插入、和排序(排序是对链表节点 的修改而不修改员工信息)。删除功能是彻底删除掉某员工的工资信息,也就是链表删除操作,在删除某员工的同时也要修改她所在的部门的信息;插入功能是增添以员工 的工资信息,采用的是链表的插入操作,在插入的同时也修改她所在部门的工资信息; 排序功能用到的是冒泡排序,能够按照工资的实发和应发升序排序。 (4) 输出记录模块:输出功能是将所有员工的工资信息输出到屏幕中,输出在屏幕上的为表 格形式,以便读取方便。 2 总 体 设 计 2.1 功能模块设计 1. 主函数main()执行流程 本系统提供了5个选项供用户选择,先显示目录菜,提示用户输入选择。有效值为 0到4,输入1则进入键盘输入员工信息功能模块,系统将会循环调用ADD()函数键盘添加 员工信息。输入2进入查询记录模块,主要工作是在链表中查找满足关键字的员工信息 。输入3进入更新记录模块:更新数据包括对员工工资信息的删除、插入、和排序(排序 是对链表节点的修改而不修改员工信息)。输入4进入输出记录模块:输出功能是将所有 员工的工资信息输出到屏幕中,输出在屏幕上的为表格形式,以便读取方便。输入0退出 本系统,操作结束。 main()会循环显示主界面直到输入0。(如下图所示) 主控函数流程图 2.输入记录模块 输入记录模块主要实现将数据存入链表中,这部分的操作较为简。从键盘输入, 键盘输入则是循环调用Add()函数一一提示用户输入员工各项信息包括(姓名,编号,性 别,年龄,工资等),也同时修改部门信息。这里的字符串和数值的输入分别采用了函数 来实现,在函数中完成输入数据任务,并对数据进行条件判断,直到满足条件判断为止 ,这样减少了代码的重复和冗余,符合模块化程序设计的特点。 3.查询记录模块 查询记录模块主要实现了在链表中按员工姓名和编号查找满足相关条件的员工记 录。在查询函数Sq()中,调用了Query()函数,根据*name查询信息,结果保存于link指 针数组中,避免找到的姓名相同的员工被覆盖。 4.更新数据模块 更新数据包括插入、删除、排序,前二项用ADU()函数控制,删除调用Del()函数删 除满足要求的员工信息,该操作需要遍历链表时间复杂度为O(n);插入是调用Add( )函数 从键盘一一输入员工节点信息,然后插入到链表时间复杂度为O(1);排序调用Sort() 函数采用冒泡排序的算法链表排序,时间复杂度为O(n*n)。 5. 输出信息模块 输出模块屏幕输出,屏幕输出为Display()函数按照TFORM2的格式按表格输出所有链 表中的员工信息。文件输出是Save()函数将信息以TFORM3的格式写入C盘的data.txt中, 以方便下次读取。 3 数据结构体设计 1、工资信息结构体 typedef struct //--------------员工工资信息结构体; { char gonghao[100]; //------------工人工号; char name[100]; //------------工人姓名; char bumen[1000]; //------------工人部门; int phone[100]; //------------工人基本工资; char addr[100]; //------------工人特殊津贴; }datatype; 2、链表node结构体 typedef struct node{ datatype data; struct node * next; }listnode; 4 程 序 实 现 1. 源代码分析 程序预处理 #include<stdio.h> //---------------标准输入输出头文件 ; #include <stdlib.h> //---------------开辟空间头文件; #incl
1. 算法的基本概念 利用计算机算法为计算机解题的过程实际上是在实施某种算法。 (1)算法的基本特征 算法一般具有4个基本特征:可行性、确定性、有穷性、拥有足够的情报。 (2)算法的基本运算和操作 算法的基本运算和操作包括:算术运算、逻辑运算、关系运算、数据传输。 (3)算法的3种基本控制结构 算法的3种基本控制结构是:顺序结构、选择结构、循环结构。 (4)算法基本设计方法 算法基本设计方法:列举法、归纳法、递推、递归、减半递推技术、回溯法。 (5)指令系统 所谓指令系统指的是一个计算机系统能执行的所有指令的集合。 (2)数据结构研究的3个方面 ① 数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构; ② 在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构; ③ 对各种数据结构进行的运算。 2. 逻辑结构 数据的逻辑结构是对数据元素之间的逻辑关系的描述,它可以用一个数据元素的集合和定义在此集合中的若干关系来表示。数据的逻辑结构有两个要素:一是数据元素的集合,通常记为D;二是D上的关系,它反映了数据元素之间的前后件关系,通常记为R。一个数据结构可以表示成:B=(D,R) 其中,B表示数据结构。为了反映D中各数据元素之间的前后件关系,一般用二元组来表示。 例如,如果把一年四季看作一个数据结构,则可表示成:B =(D,R) D ={春季,夏季,秋季,冬季} R ={(春季,夏季),(夏季,秋季),(秋季,冬季)} 3. 存储结构 数据的逻辑结构在计算机存储空间中的存放形式称为数据的存储结构(也称数据的物理结构)。 由于数据元素在计算机存储空间中的位置关系可能与逻辑关系不同,因此,为了表示存放在计算机存储空间中的各数据元素之间的逻辑关系(即前后件关系),在数据的存储结构中,不仅要存放各数据元素的信息,还需要存放各数据元素之间的前后件关系的信息。 一种数据的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序、链接等存储结构。 顺序存储方式主要用于线性的数据结构,它把逻辑上相邻的数据元素存储在物理上相邻的存储元里,结点之间的关系由存储元的邻接关系来体现。 链式存储结构就是在每个结点中至少包含一个指针域,用指针来体现数据元素之间逻辑上的联系。 1.2.2 线性结构和非线性结构 根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为两大类型:线性结构与非线性结构。 (1)如果一个非空的数据结构满足下列两个条件: ① 有且只有一个根结点; ② 每一个结点最多有一个前件,也最多有一个后件。 则称该数据结构为线性结构。线性结构又称线性表。在一个线性结构中插入或删除任何一个结点后还应是线性结构。栈、队列、串等都为线性结构。 如果一个数据结构不是线性结构,则称之为非线性结构。数组、广义表、树和图等数据结构都是非线性结构。 (2)线性表的顺序存储结构具有以下两个基本特点: ① 线性表中所有元素所占的存储空间是连续的; ② 线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。 元素ai的存储地址为:ADR(ai)=ADR(a1)+(i-1)k,ADR(a1)为第一个元素的地址,k代表每个元素占的字节数。 (3)顺序表的运算有查找、插入、删除3种。 1.3 栈 1. 栈的基本概念 栈(stack)是一种特殊的线性表,是限定只在一端进行插入与删除的线性表。 在栈中,一端是封闭的,既不允许进行插入元素,也不允许删除元素;另一端是开口的,允许插入和删除元素。通常称插入、删除的这一端为栈顶,另一端为栈底。当表中没有元素时称为空栈。栈顶元素总是最后被插入的元素,从而也是最先被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。 栈是按照“先进后出”或“后进先出”的原则组织数据的。例如,枪械的子弹匣就可以用来形象的表示栈结构。子弹匣的一端是完全封闭的,最后被压入弹匣的子弹总是最先被弹出,而最先被压入的子弹最后才能被弹出。 二级公共基础知识速学教程 2. 栈的顺序存储及其运算 栈的基本运算有3种:入栈、退栈与读栈顶元素。 ① 入栈运算:在栈顶位置插入一个新元素; ② 退栈运算:取出栈顶元素并赋给一个指定的变量; ③ 读栈顶元素:将栈顶元素赋给一个指定的变量。 1.4 队列 1. 队列的基本概念 队列是只允许在一端进行删除,在另一端进行插入的顺序表,通常将允许删除的这一端称为队头,允许插入的这一端称为队尾。当表中没有元素时称为空队列。 队列的修改是依照先进先出的原则进行的,因此队列也称为先进先出的线性表,或者后进后出的线性表。例如:火车进遂道,最先进遂道的是火车头,最后是火车尾,而火车出遂道的时候也是火车头先出,最后出的是火车尾。若有队列: Q =(q1,q2,…,qn) 那么,q1为队头元素(排头

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值