目录

  • 1 课程资料
    • 1.1 课程标准
    • 1.2 教学日历
    • 1.3 说课课件
  • 2 第一章绪论
    • 2.1 本章教学目标
    • 2.2 数据结构简介
    • 2.3 数据结构类型
    • 2.4 算法分析
    • 2.5 本章讲义
    • 2.6 本章测验题
    • 2.7 测验
  • 3 线性结构
    • 3.1 本章教学目标
    • 3.2 线性表
    • 3.3 线性表的顺序存储及运算实现
      • 3.3.1 本节讲义
    • 3.4 线性表的链式存储和 运算实现
      • 3.4.1 本节讲义
    • 3.5 应用
    • 3.6 数组
      • 3.6.1 讲义
    • 3.7 本章测验题
    • 3.8 测验
    • 3.9 作业
  • 4 第三章栈和队列
    • 4.1 本章教学目标
    • 4.2 第一课时栈
      • 4.2.1 讲义
    • 4.3 第二课时队列
      • 4.3.1 讲义
    • 4.4 应用
      • 4.4.1 讲义
    • 4.5 本章测验题
  • 5 第四章串
    • 5.1 第一课时概念
    • 5.2 本章学习目标
    • 5.3 本章测验题
  • 6 第五章树和二叉树
    • 6.1 本章学习目标
    • 6.2 第一课时树的定义及基本术语
    • 6.3 第二课时二叉树定义性质存储
    • 6.4 第三课时二叉树遍历
    • 6.5 第四二叉排序与平衡二叉树
    • 6.6 第五树森林二叉树之间转换
    • 6.7 第六课时哈夫曼树
    • 6.8 本章测验题
    • 6.9 测验
    • 6.10 作业
  • 7 第六章图
    • 7.1 本章学习目标
    • 7.2 第一课时图的基本概念
    • 7.3 第二课时图的存储
    • 7.4 第三课时图的遍历
    • 7.5 第四课时最小生成树
    • 7.6 第五课时最短路径
    • 7.7 第六课时拓扑排序
    • 7.8 第七课时关键路程
    • 7.9 本章测验题
    • 7.10 测验
    • 7.11 作业
  • 8 第七章查找
    • 8.1 本章学习目标
    • 8.2 第一课时顺序查找二分查找
    • 8.3 第二课时哈希表
    • 8.4 本章测验题
    • 8.5 测验
    • 8.6 作业
  • 9 第八章排序
    • 9.1 本章学习目标
    • 9.2 第一课时基本概念
    • 9.3 第二课时插入选择排序
    • 9.4 第三课时交换排序
    • 9.5 第四课时归并 基排序及比较
    • 9.6 本章测验题
    • 9.7 测验
    • 9.8 作业
线性表的顺序存储及运算实现


线性表的存储结构主要有以下两类:

u定长的顺序存储结构——向量型的一维数组结构

特点:线性表元素可以按地址相邻存储在数组的一片连续地址区域中。缺陷:数组的固定长度限制了线性表长度变化不得超过该固定长度。

u变长的线性表存储结构——链接式存储结构、动态数组

链接式存储结构:使用指针,按照线性表的前驱、后继关系将元素用指针链接。

动态数组:既不限制长度,也不直接链接,而是为线性表的长度变化提供方法,当长度增加到一定量时,可以再申请一块较大的存储空间。

一般情况下,(a1a2,…, ai-1ai , …,an)的顺序存储:

Loc(ai)=Loc(a1) + (i-1)×d

随机存取:顺序存储结构中随机存取数据元素,代价:O(1)

Const int MAXSIZE=顺序表的容量;


typedef  struct


   {   datatype  data[MAXSIZE];  


   int  last;


} SeqList;          


SeqList   L ;      或      SeqList   *L


空表:last =-1表长:last+1

初始化算法:




SeqList *init_SeqList ( )


        {   SeqList *L;


             L=malloc(sizeof(SeqList));


             L->last=-1;  


             return L;


        }

算法如下:


 int  Insert_SeqList(SeqList *Lint idatatype x)


     { int j;


           if (L->last==MAXSIZE-1)


                {  printf("表满"); return(-1); }  /*表空间已满,不能插入*/


                   if (i<1 || i>L->last+2)  /*检查插入位置的正确性*/


                       {  printf("位置错");return(0); }


           for(j=L->last;j>=i-1;j--)


           L->data[j+1]=L->data[j];      /* 结点移动 */


           L->data[i-1]=x;     /*新元素插入*/


           L->last++;  /*last仍指向最后元素*/


           return (1);   /*插入成功,返回*/


      } 

删除算法如下:


  int Delete_SeqList(SeqList *L;int i) 


  {    int  j;


       if (i<1 || i>L->last+1)   /*检查空表及删除位置的合法性*/


            { printf ("不存在第i个元素");


               return(0); }


       for(j=i;j<=L->last;j++)


            L->data[j-1]=L->data[j]; /*向上移动*/


            L->last--;   


            return(1);        /*删除成功*/


       }