数据结构之线性表(顺序表)

有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步。另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体)

核心算法

1.顺序表插入操作的基本步骤:要在顺序表中第 i 个数据元素之前插入一 个数据元素 x,首先要判断插入位置 i 是否合法,假设线性表的长为 n,则 i 的 合法值范围: 1≤i≤n+1,若是合法位置,就再判断顺序表否满,如果满,则增 加空间或结束操作,如果不满,则将第 i 个数据元素及其之后的所有数据元素都 后移一个位置,此时第 i 个位置已经腾空,再将待插入的数据元素 x 插入到该位 置上,最后将线性表的长增加 1。

2.顺序表删除操作的基本步骤:要删除顺序表中第 i 个数据元素,首先仍然 要判断 i 的合法性, i 的合法范围是 1≤i≤n,若是合法位置,则将第 i 个数据 元素之后的所有数据都前移一个位置,最将线性表长减 1。

3.顺序表查找操作的基本步骤:要在顺序表中查找一个给定值的数据元素 则可以采用顺序查找的方法,从表中第 1 个数据元素开始依次将值与给定值进行 比较,若相等则返回该数据元素在顺序表中的位置,否则返回 0 值。

算法实现

线性表的动态分配顺序存储结构—C语言实现

#define MaxSize 50//存储空间的分配量
Typedef char ElemType;
Typedef struct{ ElemType data[MaxSize]; int length;      //表长度(表中有多少个元素)
}SqList;

动态创建一个空顺序表的算法:

void InitList(SqList  *&L)      //初始化线性表
{ L=(SqList *)malloc(sizeof(SqList));      //分配存放线性表的空间 L->length=0;                        //置空线性表长度为0
}

线性表的插入:

status Sqlist_insert(Sqlist &L,int i,Elemtype x) /*在顺序表L中第i个元素前插入新元素x*/
{ if (i<1||i>L.length+1)  return ERROR;    /*插入位置不正确则出错*/ if (L.length>=MAXLEN)return OVERFLOW; /*顺序表L中已放满元素,再做插入操作则溢出*/ for(j=L.length-1;j>=i-1;j--) L.elem[j+1]=L.elem[j];      /*将第i个元素及后续元素位置向后移一位*/ L.elem[i-1]=x;               /*在第i个元素位置处插入新元素x*/ L.length++;                 /*顺序表L的长度加1*/ return OK;
}

线性表的删除:

status Sqlist_delete(Sqlist &L,int i,Elemtype &e) /*在顺序表L中删除第i个元素*
{ if (i<1||i>L.length) return  ERROR;      /*删除位置不正确则出错*/ for(j=i;j<=L.length-1;j++) L.elem[j-1]=L.elem[j];    /*将第i+1个元素及后继元素位置向前移一位*/ L.length--;/*顺序表L的长度减1*/ return OK;
}

线性表元素的查找:

int LocateElem(SqList *L, ElemType e)    //按元素值查找
{ int i=0; while (i<L->length && L->data[i]!=e) i++;     //查找元素e if (i>=L->length)   //未找到时返回0 return 0; else return i+1;      //找到后返回其逻辑序号
}

输出线性表:

void DispList(SqList *L)        //输出线性表
{ int i; if (ListEmpty(L))  return; for (i=0;i<L->length;i++) printf("%c ",L->data[i]); printf("\n");
}

输出线性表第i个元素的值:

bool GetElem(SqList *L,int i,ElemType &e)//求线性表中某个数据元素值
{ if (i<1 || i>L->length) return false;     //参数错误时返回false e=L->data[i-1];  //取元素值 return true;     //成功找到元素时返回true
}

实践出真知,代码案例

编写一个程序,实现顺序表的各种基本运算(假设顺序表的元素类型为 char), 并在此基础上设计一个主程序完成如下功能:
(1)初始化顺序表 L;
(2)依次采用尾插法插入 a、b、c、d、e 元素;
(3)输出顺序表 L;
(4)输出顺序表 L 的长度;
(5)判断顺序表 L 是否为空;
(6)输出顺序表 L 的第 3 个元素;
(7)输出元素 a 的位置
(8)在第 4 个元素位置上插入 f 元素
(9)输出顺序表 L;
(10)删除 L 的第 3 个元素;
(11)输出顺序表 L;
(12)释放顺序表 L。

案例源码

typedef char ElemType;
typedef struct
{ElemType data[MaxSize];int length;
} SqList;
void InitList(SqList *&L);
void DestroyList(SqList *L);
bool ListEmpty(SqList *L);
int ListLength(SqList *L);
void DispList(SqList *L);
bool GetElem(SqList *L,int i,ElemType &e);
int LocateElem(SqList *L, ElemType e);
bool ListInsert(SqList *&L,int i,ElemType e);
bool ListDelete(SqList *&L,int i,ElemType &e);
void InitList(SqList *&L)   //初始化线性表
{L=(SqList *)malloc(sizeof(SqList));   //分配存放线性表的空间L->length=0;                        //置空线性表长度为0
}
void DestroyList(SqList *L)     //销毁线性表
{free(L);
}
bool ListEmpty(SqList *L)   //判线性表是否为空表
{return(L->length==0);
}
int ListLength(SqList *L)   //求线性表的长度
{return(L->length);
}
void DispList(SqList *L)    //输出线性表
{int i;if (ListEmpty(L)) return;for (i=0;i<L->length;i++)printf("%c ",L->data[i]);printf("\n");
}
bool GetElem(SqList *L,int i,ElemType &e)   //求线性表中某个数据元素值
{if (i<1 || i>L->length)return false;          //参数错误时返回falsee=L->data[i-1];               //取元素值return true;              //成功找到元素时返回true
}
int LocateElem(SqList *L, ElemType e)   //按元素值查找
{int i=0;while (i<L->length && L->data[i]!=e)i++;                  //查找元素eif (i>=L->length)         //未找到时返回0return 0;elsereturn i+1;              //找到后返回其逻辑序号
}bool ListInsert(SqList *&L,int i,ElemType e)   //插入数据元素
{int j;if (i<1 || i>L->length+1)return false;         //参数错误时返回falsei--;                      //将顺序表逻辑序号转化为物理序号for (j=L->length;j>i;j--)   //将data[i]及后面元素后移一个位置L->data[j]=L->data[j-1];L->data[i]=e;               //插入元素eL->length++;                //顺序表长度增1return true;               //成功插入返回true
}
bool ListDelete(SqList *&L,int i,ElemType &e)   //删除数据元素
{int j;if (i<1 || i>L->length)     //参数错误时返回falsereturn false;i--;                     //将顺序表逻辑序号转化为物理序号e=L->data[i];for (j=i;j<L->length-1;j++)  //将data[i]之后的元素前移一个位置L->data[j]=L->data[j+1];L->length--;                //顺序表长度减1return true;               //成功删除返回true
}
int main()
{SqList *L;ElemType e;printf("顺序表的基本运算如下:\n");printf("  (1)初始化顺序表L\n");InitList(L);printf("  (2)依次采用尾插法插入a,b,c,d,e元素\n");ListInsert(L,1,'a');ListInsert(L,2,'b');ListInsert(L,3,'c');ListInsert(L,4,'d');ListInsert(L,5,'e');printf("  (3)输出顺序表L:");DispList(L);printf("  (4)顺序表L长度=%d\n",ListLength(L));printf("  (5)顺序表L为%s\n",(ListEmpty(L)?"空":"非空"));GetElem(L,3,e);printf("  (6)顺序表L的第3个元素=%c\n",e);printf("  (7)元素a的位置=%d\n",LocateElem(L,'a'));printf("  (8)在第4个元素位置上插入f元素\n");ListInsert(L,4,'f');printf("  (9)输出顺序表L:");DispList(L);printf("  (10)删除L的第3个元素\n");ListDelete(L,3,e);printf("  (11)输出顺序表L:");DispList(L);printf("  (12)释放顺序表L\n");DestroyList(L);
}

大一新生必看,自学必看,里昂详解数据结构之线性表相关推荐

  1. 大一新生必看,自学必看,里昂详解数据结构之队列

    数据结构之队列 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思想 ...

  2. 大一新生必看,自学必看,里昂详解数据结构之二叉树

    数据结构之二叉树 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思 ...

  3. 大一新生必看,自学必看,里昂详解数据结构之图

    数据结构之图 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思想 ...

  4. 大一新生必看,自学必看,里昂详解数据结构之链表

    数据结构之链表 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思想 ...

  5. 大一新生必看,自学必看,里昂详解数据结构之堆栈

    数据结构之堆栈 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思想 ...

  6. 大一新生上手题(题目加源代码详解)(每日一题,一题多解)

    2019 数列有序! Problem Description 有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序.n从键盘输 ...

  7. 思科ccna认证工程师必看路由协议IGRP和EIGRP详解

    思科ccna认证工程师必看路由协议IGRP和EIGRP详解单单从他们的名字当中,我们就能猜到他们之间有很多的关联. IGRP: 一种内部网关路由协议,它由Cisco公司八十年代中期设计.使用组合用户配 ...

  8. 数据结构之线性表----一文看懂顺序表、单链表、双链表、循环链表

    ​ 线性表是数据结构中比较基础的内容,不过也是入门的所需要客服的第一个难关.因为从这里开始,就需要我们动手编程,这就对很多同学的动手能力提出了挑战.不过这些都是我们需要克服的阵痛,学习新的知识总是痛苦 ...

  9. 一看就懂的CE-NET详解

    一看就懂的CE-NET详解 针对问题 u-net及其变体存在限制,连续的pooling和交错的卷积运算会导致一些空间信息的丢失. 文章贡献 提出了一个DAC模块和一个RMP模块来捕获更多的高级特征并保 ...

最新文章

  1. 腾讯天津数据中心余热回收应用初探
  2. Python基础教程— Struct模块
  3. win7计算机管理对话框功能,win7鼠标设置在哪里|win7打开鼠标属性对话框方法
  4. java修改配置文件参数_在java类中获取在.properties配置文件中设置的参数
  5. Verilog中wire与reg类型的区别(转载自http://www.cnblogs.com/farbeyond/p/5204586.html)
  6. MySQL中的空间扩展
  7. 如何创建一个Mybatis程序,实现对数据库的简单查询?
  8. 记录——《C Primer Plus (第五版)》第十章编程练习第八题
  9. python程序封装成exe_如何将python脚本封装成exe程序?
  10. iocp三层架构服务器模型
  11. 玩转Eclipse1--基本知识与配置
  12. MIT 最新 AI 医疗系统公布:“重症监护室干预” 与”电子医疗档案模型迁移“...
  13. 《Fortran 95 程序设计》阅读笔记一
  14. 二分类模型评价指标-KS值
  15. Xshell6复制粘贴快捷设置
  16. kaldi中文语音识别
  17. String Shifting(今日头条2017秋招真题)
  18. 日积一步3(求解点到平面二次曲线的最近距离)
  19. 座席成功所需的 5 项数字客户服务技能
  20. SK Innovation全球锂电战略布局揭秘

热门文章

  1. 活动星投票网络文明公益广告网络评选微信的投票方式线上免费投票
  2. 安利几款软件给需要的你
  3. 实验三 使用CSS3
  4. POI导出word表格 office打开没问题 wps打开列有问题
  5. 常见的图像重采样算法
  6. transferwise怎么提现_境外收款和汇款工具推荐:TransferWise 可提现美元到国内
  7. 邱锡鹏《神经网络与深度学习》第一章 绪论
  8. 三元组顺序表表示的稀疏矩阵转置(10分)
  9. Emscripten 单词_这300个单词务必让孩子在三年级前搞定
  10. jdm分布式架构框架