• 数据结结构学习 线性表


    1. 线性表的顺序表示指用一组地址连续的存储单元依次存取线性表的数据

    线性表动态分配顺序存储结构

    #define LIST_INIT_SIZE 100

    #define LIST_INCREMENT 10

    typedef struct

    {

      ElemType* elem;

      int length;

      int listsize;
    }SqList;

    2。 线性表的链式存取结构的特点是用一组任意的存储单元存储线性表的数据(这组存储单元可以是连续的,也可以是不连续的)为了表达某个元素ai和其直接后继元素ai+1之间的

    逻辑关系,对于数据ai除了存储其本身的信息外,还存储一个指向其后继元素的信息(即直接后继的位置)。这两部分信息组成数据元素ai的存储影像,成为节点。他包括两个域。

    其中存储数据元素信息的域为数据域。存取直接后继位置的域为指针域,指针域存储的信息为指针或链。

    -----线性表单链表存储结构------

    typedef struct LNode {

    ElemType data;

    struct LNode * next;

    }LNode, *LinkList;

    LNode head;

    if (head.next == NULL)  // 空表

     void CreateList ( LinkList & L,int n)

    {

      L = (LinkList) malloc(sizeof(LNode));

      L->next = NULL ;  //先建立头结点

      for ( int i=0; i<n; i++) {

        p = (LinkList) malloc (sizeof(LNode));

        scanf(&p->data);

        p->next = L->next; //插入表头

        L->next = p;

      }

    }

    3.用一维数组描述线性链表

    -----线性表静态链表存储结构------

    #define MAXSIZE 1000

    typdef struct {

    ElemType data;

    int cur;//游标(指示器)

    }componet, SLinkList[MAXSIZE];

    假设由终端输入集合元素,先建立表示集合A的静态链表S,而后输入集合B的元素的同时查找S表,弱存在B相同的元素,则从S删除之,否则将元素插入到S。

    void InitSpace_SL(SLinkList ( & space )

    {

      for(i=0 ; i<MAXSIZE; i++;) {

        space[i].cur = i+1;

      }

      space[MAXSIZE-1] = 0;

    }

    int Malloc_SL(SLinkList & space)

    {

    //若备用空间链表非空,则返回分配的节点下标,否则返回0.

      i = space[0].cur;

      if (space[0].cur) space[0].cur = space[i].cur;

      return i;

    }

    void Free_SL(SLinkList & space,int k)

    {

    //将K的空闲节点回收到备用链表。

      space[k].cur = space[0].cur;

       space[0].cur = k;

    }

     

    4. 循环链表是令一种形式的链式存储结构,他的特点是表中最后一个节点的指针指向头结点,整个链表形成一个环。由次,从表中任一个节点出发都能找到其他节点。

    5。双向链表,有2个指针域,其中一个指向后继,另一个指向前驱。

    -----线性表双向链表结构-----

    typedef struct DulNode{

      ElemType data;

      struct DulNode * prior ;

      struct DulNode *next;

    }DulNode,*DuLinkList;

     

    -----带头结点的线性链表------

    typedef struct LNode{

      ElemType data;

      struct LNode * next;

    } * Link, *Position;

    typdef struct {

      Link head,tail;

      int len;  //指示线性表中元素的个数

    }LinkList;

    应用 ,一元多项式的表示及相加

    typedef struct {

      float coef;  // 系数

      int expn; //指数

    } ElemType;

    typedef LinkList polynomail;

    基本操作的函数原型

    void CreatePolyn(polynomail &p ,int m) ; //输入m项的系数和指数,建立一个一元多项式的有序链表P

    void DestroyPolyn(polynomail &p);

    void PrintPolyn(polynomail &p);

    int PolynLength(polynomail &p);

    void AddPolyn(polynomail &pa,polynomail &pb);

    void SubtractPolyn(polynomail &pa,polynomail &pb);

    void MultiPlyPolyn(polynomail &pa,polynomail &pb);

    void CreatePolyn(polynomail &p ,int m){

      InitList(p); h= GetHead(p);

      e.coef = 0.0; e.expn = -1; SetCurElem(h,e); //设置头结点的数据元素

      for ( i =0; i<= m; i++) {

        scanf(e.coef,e.expn);

        if(!LocateElem(p,e,q,(*cmp)())){  //当前链表不存在该数据项

          if(MakeNode(s,e)) InsFirst(q,s);  //生成结点并插入链表

        }

       }

    }

    void AddPolyn(polynomail &pa,polynomail &pb) {

      ha = GetHead(pa); hb = GetHead(pb);

      qa = NextPos(pa,ha); qb = NextPos(pb,hb);

      while( qa && qb) {

        a = GetCurElem(qa); b = GetCurElem(qb);

        switch(*cmp(a,b)) {

          case -1:  // 多项式pa中当前结点的指数小

            ha = qa; qa = NextPos(pa,qa); break;

          case 0: //两者的指数相同

            sum = a.coef+b.coef;

            if (sum != 0.0) {

              SetCurElem(qa,sum}; ha = qa;}  // 修改多项式PA当前结点的系数值

            else { //删除多项式PA当前结点

              DelCurElem(qa,sum); ha = qa;

            }

            DelFirst(hb,qb); FreeNode(qb); qb = NextPos(pb,hb);

            qa = NextPos(pa,ha); break;

          case 1: //多项式PB当前结点的指数小

            DelFirst(hb,pb);  InsFirst(ha,qb);

            qb = NextPos(pb,hb); ha = NextPos( pa,ha); break;

         } //switch

      }//while

      if(!Empty(pb))  Append(pa,pb); // 链接pb中剩余的结点

      FreeNode(hb); //释放pb的头结点

    }

  • 相关阅读:
    清除控件某个事件的所有响应函数
    docker常用命令
    WPF 如何自定义一个弹框
    C#目录:藏锋
    杂谈001:晨曦Dawn的重新连接
    SpringBoot-08:SpringBoot采用json的方式实现前后台通用的配置文件
    Mysql:存储过程游标不进循环的原因详解
    Java中如何创建一个确保唯一的名字,文件名
    C#:设置CefSharp的一些参数,比如忽略安全证书
    C#:在AnyCPU模式下使用CefSharp
  • 原文地址:https://www.cnblogs.com/zhoug2020/p/2783363.html
Copyright © 2020-2023  润新知