zoukankan      html  css  js  c++  java
  • 数据结构学习心得(二)-----线性表

    线性表是由n个数据元素(结点)a1,a2,a3……an组成的有限序列。

    线性表的数据元素ai所代表的具体含义随具体应用的不同而不同,在线性表的定义中,只不过是一个抽象的符号。

    1.线性表的结点可以是单值元素(每个元素只有一个数据项)例如:26个英文字母表(A,B,C……Z)扑克的点数(2,3,4,5……J,Q,K)

    2.线性表中的结点可以是记录型元素,每个元素含有多个数据项,每个项称为结点的一个域,每个元素有一个可以唯一标识每个结点的数据项组,称为关键字。

    例子:某校2001级同学的基本情况{(‘201112’,‘张三’,‘男’,‘1983/2/4’),('201113','章华寺‘,’男‘1984/2/8)……}

    顺序线性表:数组表示粗出线性表的元素,顺序表还需要长度的属性,所以用结构类型来定义顺序表类型。

    typedef struct sqlist
    {
    ElemType Elem_array[MAX_SIZE];
    int length;
    }Sqlist;

    链式线性表:为了正确表示节点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其直接后继结点的地址(或位置),称为指针或链

    链表是通过每个节点的指针域将线性表的n个节点按其逻辑次序链接在一起的。每一个结点只包含一个指针域的链表,称为单链表。

    为操作方便,总是在链表的第一个节点之前附设一个头结点(头指针)head指向第一个结点。头结点的数据域可以不存储任何信息(或链表长度等信息)。

    结点的描述与实现

    typedef struct Lnode
    {
    ElemType data;
    struct Lnode *next;
    }LNode;
    结点的实现:结点是通过动态分配和释放来实现的,即需要时分配,不需要时释放。实现时分别使用的c语言标准函数为:malloc(),realloc(),sizeof(),free();

    p=(LNode*)malloc(sizeof(LNode));函数malloc分配了一个类型为LNode的节点变量的空间,并将其首地址放入指针变量p中。

    动态释放free(p);系统回收由指针变量p所指向的内存区,p必须是最近一次调用malloc函数时的返回值。

    单链表     循环链表      双向链表      双向循环链表,这是四个基本链表的形式。

    单链表

    typedef  struct  Lnode
    {   ElemType  data;     /*数据域,保存结点的值 */
    struct   Lnode  *next;      /*指针域*/
    }LNode;        /*结点的类型 */

    双向链表

    typedef struct Dulnode
    {     ElemType  data ;
    struct Dulnode  *prior , *next ;
    }DulNode ;//就是多了一个前指向

    最常用的基本操作。

    1.结点的赋值LNode *p;p=(LNode*)malloc(sizeof(LNode));p->data=20;p->next=NULL;

    2.指针操作。1.q=p 2.q=p->next  3.p=p->next   4.q->next=p;  5.q->next=p->next;

    单链表的查找:1.按序号查找2.按值查找

    单链表的插入

    单链表的删除:1.按序号删除2.按值删除

    链表上实现插入和删除运算,无需移动结点,仅需修改指针。解决了顺序表的插入或删除操作需要移动大量元素的问题。

    变形题目:删除单链表中值为key的所有节点。删除单链表中所有值重复的节点,使得所有节点的值都不相同。

    单链表的合并

    指针除了定义的时候加*表示是指针变量外,其他时候加*表示指向的内容,不加星号表示的地址。


    循环链表:是一种头尾相接的链表。其特点是最后一个结点的指针域指向链表的头结点,整个链表的指针域链接成一个环

    从循环链表的任意一个结点出发都可以找到链表的其他结点,使得表处理更加方便灵活。

    循环链表的操作:对于单循环链表,除链表的合并外,其他的操作和单链表基本一致,仅仅需要在单线性链表操作算法基础上作以下简单修改:

    1.判断是否为空链表:head->next==head;2.判断是否是表尾结点:p->next==head;

    双向链表:构成链表的每个节点中设立两个指针域:一个指向其直接前趋的指针域prior,一个指向其直接后继的指针域next,这样形成的链表中有两个不同的链,故称双向链表。双向链表一般增加头指针也能使双链表的某些运算变得方便。

    将头节点和尾结点连接起来也能构成循环链表,并称之为双向循环链表。

    双向链表是为了客服单链表的单向性的缺陷而引入的。

    双向链表结构具有对称性,设p指向双向链表中的某一结点,其对称性用下式表示:(p->prior)->next=p=(p->next)->prior;

    双向链表的插入:1.如果插入时仅仅指出其直接前驱结点,钩链时必须注意先后顺序是“先右后左”2.插入时同时指出直接前驱结点p和直接后继结点q,钩链时无须注意先后次序。

    双向链表的结点删除:设要删除的节点为p,删除时可以不引入新的辅助指针变量,可以直接先断链,在释放结点。

    语句如下:p->prior->next=p->next;p->next-prior=p->prior;free(p);

    与单链表的插入和删除操作不同的是,在双向链表中插入和删除必须同时修改两个方向上的指针域的指向。


  • 相关阅读:
    C++ 什么是多态
    *和&的使用
    静态链接库与动态链接库
    利尔达CC3200模块烧写程序笔记
    创龙TMS320C6748开发找不到 tl.dsp.evm6748的问题研究
    RTSC和XDCTool的理解
    创龙DSP6748开发板SYS/BIOS的LED闪烁-第2篇
    Coap协议学习笔记-第一篇
    linux进程的学习笔记(未完)
    创龙DSP6748开发板LED闪烁-第一篇
  • 原文地址:https://www.cnblogs.com/didi520/p/4165515.html
Copyright © 2011-2022 走看看