线性表的顺序表示与实现

[cpp] view plaincopy

/*  线性表是有N个元素的非空有限序列

存在惟一的一个被称作“第一个”数据的元素

存在惟一的一个被称作“第后一个”数据的元素

除第一个与最后一个之外,其它元素都存在唯一的一个前驱和唯一的一个后续

复杂的线性表中的元素可以由多个数据项组成

同一个线性表中的元素类型必须相同

线性表的顺序表,是用一组地址连续的存储单元依次存储线性表的数据元素

算法复杂度:取表长与访问表中的的元素为O(1),插入与删除的时间复杂度为O(n)

顺序表适用于频繁访问,只有较少(或不进行)“插入删除操作” */

#ifndef SQLIST_H

#define SQLIST_H

#define MAXSIZE  100 //顺序表的最大存储容量

#define INFINITY 65535 //设置为β

typedef int ElemType;  //顺序表的数据类型,自定义

typedef struct {

ElemType data[MAXSIZE]; //定义一个顺序表,大小为MAXSIZE

int len;                //顺序表的当前长度

}SqList;

void InitList(SqList *q); //初始化顺序表

void GetElem(SqList *q,int i,ElemType *e); //返回元素,将第i个位置的元素存入*e

void GetListLength(SqList *q,int *len); //返回顺序表的长度,将长度存入*len

void InsertList(SqList *q,int i,ElemType e); //在第i个位置插入e,最坏的情况下i为第一个位置,时间复杂度为O(n)

void DeleteList(SqList *q,int i,ElemType *e); //删除第i个位置的元素,将删除的元素存入*e,最坏情况i为第一个位置

//时间复杂度为O(n)

int LocateElem(SqList *q,ElemType e); //在顺序表中查找元素e是否存在,不存在返回-1,否则返回所在的位置

#endif //SQLIST_H

[cpp] view plaincopy

#include "SqList.h"

#include

#include

void InitList(SqList *q) //初始化顺序表

{

memset(q->data,0,sizeof(ElemType) * MAXSIZE); //初始化顺序表的元素为0

q->len = 0; //初始化顺序表的当前大小为0

}

void GetElem(SqList *q,int i,ElemType *e) //获取第i个位置的元素(下标值从零开始,i个位置的元素在表中位置为i-1)

{

if(i > 0 && i len) //如果i存在于顺序表中

*e = q->data[i - 1]; //返回第i个位置的元素

else

*e = INFINITY; //返回β值

}

void InsertList(SqList *q,int i,ElemType e) //在顺序表的第i个位置插入元素e

{

if(i > MAXSIZE || i

{

printf("超出范围,元素插入失败\n");

return;

}

for(int j = q->len - 1;j >= i - 1;--j)//将i个位置与i之后的所有元素向后移一位(下标值从零开始i - 1)

q->data[j + 1] = q->data[j];

q->data[i - 1] = e; //将元素插入到顺序表中,下标值从零开始

++q->len; //增加当前顺序表的长度值

}

void DeleteList(SqList *q,int i,ElemType *e) //将顺序表中第i个位置的元素删除,将删除的元素存入*e

{

if(i  q->len)

{

printf("超出范围,元素删除失败\n");

*e = INFINITY; //返回β值

return;

}

*e = q->data[i - 1];

for(int j = i - 1;j len - 1;++j) //第i个位置之后的所有元素向后移

q->data[j] = q->data[j + 1];

--q->len; //当前的顺序表长度减1

}

int LocateElem(SqList *q,ElemType e) //在顺序表中查找元素e,如果找到返回位置,否则返回-1

{

for(int i = 0;i len;++i)

{

if(q->data[i] == e)

return i + 1; //下标从0开始,所以要加上1

}

return -1;

}

[cpp] view plaincopy

#include "SqList.h"

#include

int main()

{

SqList q;

InitList(&q); //初始化顺序表

int element;

int i = 1; //插入的位置

printf("请输入要插入顺序表中的内容:(CTRL + Z)结束\n");

while((scanf("%d",&element)) != EOF)

{

InsertList(&q,i,element);

++i;

}

i = 2; //第顺序表的第2个位置插入元素

fflush(stdin); //清空缓冲区,确保输入正确

printf("请输入要在第2个位置插入的元素\n");

scanf("%d",&element);

InsertList(&q,i,element);

printf("顺序表的内容为:\n");

for(int j = 0;j

printf("%d ",q.data[j]);

printf("\n");

int e; //用于存入被删除的元素

printf("请输入要删除的元素的位置\n");

fflush(stdin);

scanf("%d",&i);

DeleteList(&q,i,&e);

printf("被删除的元素为:%d\n",e);

printf("顺序表的内容为:\n");

for(int j = 0;j

printf("%d ",q.data[j]);

printf("\n");

printf("请输入要在表中查找的元素:\n");

fflush(stdin);

scanf("%d",&element);

if((i = LocateElem(&q,element)) == -1)

printf("顺序表中不存在元素:%d\n",element);

else

printf("在顺序表的第%d个位置找到元素:%d\n",i,element);

return 0;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

[cpp] view plaincopy

/*  线性表是有N个元素的非空有限序列

存在惟一的一个被称作“第一个”数据的元素

存在惟一的一个被称作“第后一个”数据的元素

除第一个与最后一个之外,其它元素都存在唯一的一个前驱和唯一的一个后续

复杂的线性表中的元素可以由多个数据项组成

同一个线性表中的元素类型必须相同

线性表的顺序表,是用一组地址连续的存储单元依次存储线性表的数据元素

算法复杂度:取表长与访问表中的的元素为O(1),插入与删除的时间复杂度为O(n)

顺序表适用于频繁访问,只有较少(或不进行)“插入删除操作” */

#ifndef SQLIST_H

#define SQLIST_H

#define MAXSIZE  100 //顺序表的最大存储容量

#define INFINITY 65535 //设置为β

typedef int ElemType;  //顺序表的数据类型,自定义

typedef struct {

ElemType data[MAXSIZE]; //定义一个顺序表,大小为MAXSIZE

int len;                //顺序表的当前长度

}SqList;

void InitList(SqList *q); //初始化顺序表

void GetElem(SqList *q,int i,ElemType *e); //返回元素,将第i个位置的元素存入*e

void GetListLength(SqList *q,int *len); //返回顺序表的长度,将长度存入*len

void InsertList(SqList *q,int i,ElemType e); //在第i个位置插入e,最坏的情况下i为第一个位置,时间复杂度为O(n)

void DeleteList(SqList *q,int i,ElemType *e); //删除第i个位置的元素,将删除的元素存入*e,最坏情况i为第一个位置

//时间复杂度为O(n)

int LocateElem(SqList *q,ElemType e); //在顺序表中查找元素e是否存在,不存在返回-1,否则返回所在的位置

#endif //SQLIST_H

[cpp] view plaincopy

#include "SqList.h"

#include

#include

void InitList(SqList *q) //初始化顺序表

{

memset(q->data,0,sizeof(ElemType) * MAXSIZE); //初始化顺序表的元素为0

q->len = 0; //初始化顺序表的当前大小为0

}

void GetElem(SqList *q,int i,ElemType *e) //获取第i个位置的元素(下标值从零开始,i个位置的元素在表中位置为i-1)

{

if(i > 0 && i len) //如果i存在于顺序表中

*e = q->data[i - 1]; //返回第i个位置的元素

else

*e = INFINITY; //返回β值

}

void InsertList(SqList *q,int i,ElemType e) //在顺序表的第i个位置插入元素e

{

if(i > MAXSIZE || i

{

printf("超出范围,元素插入失败\n");

return;

}

for(int j = q->len - 1;j >= i - 1;--j)//将i个位置与i之后的所有元素向后移一位(下标值从零开始i - 1)

q->data[j + 1] = q->data[j];

q->data[i - 1] = e; //将元素插入到顺序表中,下标值从零开始

++q->len; //增加当前顺序表的长度值

}

void DeleteList(SqList *q,int i,ElemType *e) //将顺序表中第i个位置的元素删除,将删除的元素存入*e

{

if(i  q->len)

{

printf("超出范围,元素删除失败\n");

*e = INFINITY; //返回β值

return;

}

*e = q->data[i - 1];

for(int j = i - 1;j len - 1;++j) //第i个位置之后的所有元素向后移

q->data[j] = q->data[j + 1];

--q->len; //当前的顺序表长度减1

}

int LocateElem(SqList *q,ElemType e) //在顺序表中查找元素e,如果找到返回位置,否则返回-1

{

for(int i = 0;i len;++i)

{

if(q->data[i] == e)

return i + 1; //下标从0开始,所以要加上1

}

return -1;

}

[cpp] view plaincopy

#include "SqList.h"

#include

int main()

{

SqList q;

InitList(&q); //初始化顺序表

int element;

int i = 1; //插入的位置

printf("请输入要插入顺序表中的内容:(CTRL + Z)结束\n");

while((scanf("%d",&element)) != EOF)

{

InsertList(&q,i,element);

++i;

}

i = 2; //第顺序表的第2个位置插入元素

fflush(stdin); //清空缓冲区,确保输入正确

printf("请输入要在第2个位置插入的元素\n");

scanf("%d",&element);

InsertList(&q,i,element);

printf("顺序表的内容为:\n");

for(int j = 0;j

printf("%d ",q.data[j]);

printf("\n");

int e; //用于存入被删除的元素

printf("请输入要删除的元素的位置\n");

fflush(stdin);

scanf("%d",&i);

DeleteList(&q,i,&e);

printf("被删除的元素为:%d\n",e);

printf("顺序表的内容为:\n");

for(int j = 0;j

printf("%d ",q.data[j]);

printf("\n");

printf("请输入要在表中查找的元素:\n");

fflush(stdin);

scanf("%d",&element);

if((i = LocateElem(&q,element)) == -1)

printf("顺序表中不存在元素:%d\n",element);

else

printf("在顺序表的第%d个位置找到元素:%d\n",i,element);

return 0;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。


相关内容

  • 线性表的顺序表示和实现
  • 实验一 线性表的顺序表示和实现 实验人:张俊为 学号: Xb11640218 时间:2013.9.26 一. 实验目的 1. 掌握线性表的动态分配顺序存储结构 2. 掌握线性表合并算法. 二. 实验内容 已知顺序线性表La 和Lb 的元素按值非递减排列,归并La 和Lb 得到新的顺序线性表Lc ,L ...

  • [数据结构]教学大纲
  • <数据结构>教学大纲 Data Structure 课程编号:J6110G0003 课程性质:学科基础课程 适用专业:计算机科学与技术.网络工程.数字媒体技术 先行课:计算机科学导论.离散数学.高级语言程序设计: 后续课:无 . 学分数:5 主讲教师:任燕.王命延.冯豫华.周石林.王玮立 ...

  • 谈顺序存储与链式存储的异同
  • 谈顺序存储与链式存储的异同 摘要: 顺序存储与链式存储的应用范围较为广泛.顺序存储就是用一组地址连续的存储单元依次存储该线性表中的各个元素,由于表中各个元素具有相同的属性,所以占用的存储空间相同,而链式存储无需担心容量问题,读写速度相对慢些,由于要存储下一个数据的地址所以需要的存储空间比顺序存储大. ...

  • 数据结构大纲
  • 数据结构大纲 第1章 数据结构概述 数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作的学科.数据结构主要有三个方面的内容: 数据的逻辑结构.数据的存储结构和对数据的算法. 逻辑结构:反映数据之间的逻辑关系,是对数据之间关系的描述,主要有集合.线性表.树.图等四种结 ...

  • 第1章数据结构与算法笔试题考点分析
  • 1算法 考试的内容: 1.1 算法的基本概念 1.算法的概念(必记) : 是指解题方案的准确而完整的描述. 分析:要用计算机实现某一任务时,先应设计出一整套解决问题的指导方案,然后具体实现.整套的指导方案称之为算法,而具体的实现称之为程序.并且在设计指导方案时,可不用过多考虑到实现程序的具体细节(即 ...

  • 线性表的顺序存储结构和实现
  • 石家庄经济学院 实 验 报 告 学 院: 数理学院 专 业: 数学与应用数学 班 级 学 号: XXXXXXXX 姓 名: XXXXXX 信息工程学院计算机实验中心制 实验题目:线性表的顺序存储结构和实现 一.实验内容 1.熟悉C 语言的上机环境,掌握C 语言的基本结构. 2.会定义线性表的顺序存储 ...

  • 公共基础知识重点分析
  • 公共基础知识 本章导读:本章介绍了公共基础知识的相关知识.本章内容在选择题中所占比例基本是固定的.作为后面章节的学习基础,建议考生理解学习,以便更好地掌握本章的相关概念和知识点. 本章考试大纲:(1)数据结构与算法(基础,识记):(2)程序设计基础(基础,理解):(3)软件工程基础(基础,理解):( ...

  • 二级公共基础重点知识
  • 二级公共基础知识辅导讲义 目录 第一章 数据结构与算法 ................................................................................................................... 1 1.1 ...

  • 数据结构与算法面试总结
  • 一. 算法的基本概念 计算机解题的过程实际上是在实施某种算法,这种算法称为计算机算法. 1. 算法的基本特征:可行性,确定性,有穷性,拥有足够的情报. 2. 算法的基本要素:算法中对数据的运算和操作.算法的控制结构. 3. 算法设计的基本方法:列举法.归纳法.递推.递归.减半递推技术.回溯法. 4. ...