顺序表:

一般使用数组(C语言中的数组采用顺序存储方式。即连续地址存储)来描述。

优点:在于随机访问元素,

缺点:插入和和删除的时候,需要移动大量的元素。

链表:

优点:插入或删除元素时很方便,使用灵活。

缺点:存储密度小,空间单位利用效率低

顺序表中实现的基本运算:

·插入:平均移动结点次数为n/2;平均时间复杂度均为O(n)。

·删除:平均移动结点次数为(n-1)/2;平均时间复杂度均为O(n)。

链表头结点的作用:

总结为:

头结点的作用主要是使插入和删除等操作统一,在第一个元素之前插入元素和删除第一个结点不必另作判断。另外,不论链表是否为空,链表指针不变。

顺序表的存储地址必须是连续的,链表可以是连续的,也可以不是连续的;

单链表的相关操作:

定义:

typedef struct LNode{
    ElemType  data;
    struct LNode   *next;
}LNode, *LinkList;

初始化:

Status initList(LinkList &L){
    /*单链表的初始化*/
    L = (LinkList)malloc(sizeof(LNode));    //申请一个头节点
    if(!L) exit(OVERFLOW);            //申请空间失败
    L->next=NULL;                //建立一个带都节点的空链表
    return OK;

    /*
    需要改变指针的指针,所以参数必须是引用或者是 *L:
    (*L) = (Lnode *)malloc(sizeof(Lnode));
    (*L)->next=NULL;
    return 1;
    */

}

创建链表:

void createList(LinkList L, int n){
    /*单链表的初始化*/
    if (!L) {
        initList(L);
    }
    ElemType data;
    LinkList p,q = L;
    printf("输入节点数据的个数%d:\r\n", n);
    ; i<n; i++) {
        p = (LinkList) malloc( sizeof(LNode)); //申请一个新节点
        scanf("%d",&data);
        p->data = data;
        p->next = q->next;
        q->next = p;
        q = p;
    }
}

元素插入:

Status insertList(LinkList L, ElemType e, int i){
    LinkList s, p = L;
    ;
    while (p && j<i){                //寻找i节点
        p = p->next;
        j++;
    }
    if (!p ||j >i) return ERROR;
    s = (LinkList) malloc(sizeof(LNode));        //生成新节点
    s->data = e; s->next = p->next;            //插入L中
    p->next = s;
    return OK;

}

元素删除:

Status deleteListElem(LinkList L, int i, ElemType &e){
    LinkList p, q;
    ;
    p = L;
    while (p && j<i){
        p = p->next;
        ++j;
    }
    if (!p->next || j>i)  return ERROR;   //删除的位置不对
    q  = p->next; p->next = q->next;
    e = q->data; free(q);            //释放节点
    return OK;
}
 

链表排序:(插入)

void  InsertSort(LinkList L)
{
	LinkList  list;				/*为原链表剩下用于直接插入排序的节点头指针*/
	LinkList  node;				/*插入节点*/
	LinkList  p;
	LinkList  q;

	list = L->next;				/*原链表剩下用于直接插入排序的节点链表*/
	L->next = NULL;				/*只含有一个节点的链表的有序链表。*/
	while (list != NULL)   {	/*遍历剩下无序的链表*/
		node = list, q = L;
		while (q && node->data > q->data  ) {
			p = q;
			q = q->next;
		}

		if (q == L) {  /*插在第一个节点之前*/
			L = node;
		}  else {	  /*p是q的前驱*/
			p->next = node;
		}
		list = list->next;
		node->next = q; /*完成插入动作*/

	}
}

  

链表归并:

void mergeList(LinkList  &La, LinkList  &Lb,  LinkList &Lc){
    LinkList pa, pb, pc;
    pa    = La->next;
    pb    = Lb->next;
    Lc =  pc = La;
    while (pa && pb) {
        if (pa->data > pb->data) {
            pc->next = pb;
            pc = pb;
            pb =pb->next;
        }else{
            pc->next = pa;
            pc = pa;
            pa =pa->next;
        }
    }
    pc->next = pa? pa :pb;
    free(Lb);
}

区间删除:

void ListDelete_CL(LinkList &CL,ElemType min,ElemType max)
{
    LNode *p,*sub;
    p = CL;
    while (p->next!=CL)
    {
    sub = p->next;
    if (sub->data > min&&sub->data < max) {
    p->next = sub->next;
    }
    // 通俗的说,sub 就是侦查兵,手中同时拿着 p->next 和 sub->next 这两条线,如果这和侦查兵位置被删除,他会把p->next 联到 sub->next 上
    else p = p->next;
    }
}

元素定位:

int ListLocate_L(LinkList L, ElemType x)
{
    LNode *p = L;
    ;
    while(p->next)
    {

        if(p->data==x) return ipos;
        p=p->next;
        ipos++;
    }
    return ipos;
}

单链表代码汇总

顺序表代码汇总


2-7

h为不带头结点的单向链表。在h的头上插入一个新结点t的语句是

在头部插入新节点,那么新的节点下一个节点指向原来的头结点,新的头结点指针指向新插入的节点;

2-10

在单链表中,若p所指的结点不是最后结点,在p之后插入s所指结点,则执行

这个样子,S节点就成功插入了。


1-7

在顺序表上进行插入、删除操作时需要移动元素的个数与待插入或待删除元素的位置无关

错误:

假设原顺序表长度为n,在头节点插入(删除),需要移动n(n-1)个元素,尾节点不需要移动;

2-7

要将一个顺序表{a​0​​,a​1​​,……,a​n−1​​}中第i个数据元素a​i​​(0≤i≤n-1)删除,需要移动( )个数据元素。

ai 是 第 i+1 个元素,需要移动剩下的元素,也就是 n-(i+1) ->B

 
1-3
将长度分别为m,n的两个单链表合并为一个单链表的时间复杂度为O(m+n)

错误:

合并成一个链表只需要让m的尾节点->next=n头结点,复杂度为 1

两个有序链表合并成一个有序链表的时间复杂度是O(m+n)

 
2-3
带头结点的单链表h为空的判定条件是

带头结点:h->next=null

不带头结点:h=null

这是单链表判空的两种方式;

2-4

将两个结点数都为N且都从小到大有序的单向链表合并成一个从小到大有序的单向链表,那么可能的最少比较次数是

对于这类题目来说,可以用这个么一个方式来解决,要求的是最小的比较次数,可以假设理想情况:假设其中一个链表中的元素全小于另一个链表里最小的元素

或者是全大于另一个链表里最大的元素,假设表长分别是m,n,那么最少比较次数就是 min(m,n)

2-7

对于一个具有N个结点的单链表,在给定值为x的结点后插入一个新结点的时间复杂度为

这就是常见的坑了,这道题其实是分解成了两道题,单链表询值,和插入操作

查询 O(n) + 插入O(1) = O(n)

2-10

将长度为n的单链表连接在长度为m的单链表之后的算法的时间复杂度为( )

还是和上面一样的坑,寻找到m表尾,时间复杂度O(m)+链接1 = O(m)

这几道题推荐记下来:


Made by dong

数据结构 单链表&顺序表的更多相关文章

  1. C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作

    1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...

  2. 数据结构——单链表java简易实现

    巩固数据结构 单链表java实现 单链表除了表尾 每个几点都有一个后继 结点有数据和后继指针组成  通过构建表头和表尾(尾部追加需要)两个特殊几点 实现单链表的一些操作,代码如下 package co ...

  3. python实现数据结构单链表

    #python实现数据结构单链表 # -*- coding: utf-8 -*- class Node(object): """节点""" ...

  4. C# 数据结构 - 单链表 双链表 环形链表

    链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一 ...

  5. 数据结构—单链表(类C语言描写叙述)

    单链表 1.链接存储方法 链接方式存储的线性表简称为链表(Linked List). 链表的详细存储表示为: ① 用一组随意的存储单元来存放线性表的结点(这组存储单元既能够是连续的.也能够是不连续的) ...

  6. python算法与数据结构-单链表(38)

    一.链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括 ...

  7. NET 数据结构-单链表

    概念介绍: 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. 链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元 ...

  8. C实现通用数据结构--单链表

    单链表概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 从概念上讲,可以把链表想象成一系列连续的元素,然而,由于这些元素是动态分配的(C语言 ...

  9. C# 数据结构--单链表

    什么是单链表 这两天看到很多有关单链表的面试题,对单链表都不知道是啥的我.经过学习和整理来分享一下啥是单链表和单链表的一些基本使用方法.最后看些网上有关单链表的面试题代码实例. 啥是单链表? 单链表是 ...

随机推荐

  1. Oracle10g物理DG详细配置方法及步骤

    --测试环境:    OS:Redhat linux(64)    Primary:    IP:192.168.94.198    SID:dgdb1    Hostname:dg1    DB_U ...

  2. maven常见问题处理(3-2)maven打包时跳过测试的几个方法

    运行mvn install时跳过Test方法一:<project> [...] <build> <plugins> <plugin> <group ...

  3. SpringBoot 概念和起步

    一.概念和由来 1.什么是 Spring Boot Spring Boot 的设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用特定方式来进行配置,从而使开发人员不再需要定义样板化 ...

  4. python flask框架 蓝图的使用

    蓝图的目的是实现 各个模块的视图函数写在不同的py文件当中. 主视图 中 导入 分路由视图的模块,并且注册蓝图对象 分路由视图中 利用 蓝图对象 的route 进行装饰视图函数 主路由视图函数: #c ...

  5. django中图片的上传和显示

    上传图片实际上是 把图片存在服务器的硬盘中,将图片存储的路径存在数据库中. 1 首先要配置文件上传的路径: 1.1 建立静态文件目录 在项目根目录下 新建一个 static文件夹,下面再建立一个med ...

  6. python request

    python request a. 客户端向服务端发送多层字典的值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 obj =  ...

  7. tornada模板学习笔记

    import tornado.web import tornado.httpserver import tornado.ioloop import tornado.options import os. ...

  8. 基于 MySQL 的数据库实践(自然连接)

    在基本查询一节的示例中,我们有从 instructor 和 teaches 表组合信息,匹配条件是 instructor.ID 等于 teaches.ID 的查询,ID 属性是两个表中具有相同名称的所 ...

  9. github git 在GitHub上创建项目并将本地项目push到网站上

    众所周知,git是与svn类似的版本控制系统,git的去中心化.分布式等的优点,在不久将来用户量大有可能超过svn, 常见的代码托管网站有GitHub,coding.net, gitee.com 码云 ...

  10. 对于python这门课程的一些想法、计划、期望

    本人是一名大二的码农,专业信息安全.之前在知乎上看到过对于python一些评论,说用python写的代码和诗一样.也在网上大概的了解了一下,python要求有严格的缩进.学习python语言,最想学的 ...