当前位置: 首页 > news >正文

线性表的实现

目录

1、线性表的定义和特性

1.1 线性表的定义

1.2 线性表的特征

2、顺序表

2.1顺序表——存储结构

3、总代码——测试

4、动态分配内存地址初始化


1、线性表的定义和特性

1.1 线性表的定义

        定义:线性表(linear List)是具有相同特性的数据元素的一个有限序列。

         线性表中元素的个数n(n >= 0) 定义为线性表的长度,当n = 0时称之为空表。第一个元素称为表头元素,最后一个元素称之为表尾元素。

1.2 线性表的特征

  1. 有穷性:一个线性表中的元素个数是有限的。
  2. 一致性:一个线性表中所有元素的性质相同。从实现角度看,所有元素具有相同的数据类型。
  3. 序列性:一个线性表中所有元素之间的相对位置是线性的,即存在唯一的开始元素和终端元素,除此之外,每个元素只有唯一的前驱元素和后继元素。各元素在线性表中的位置只取决于它们的序号,所以在一个线性表中可以存在两个值相同的元素。

2、顺序表

        用一组连续的内存单元依次存储线性表的各个元素,也就是说,逻辑上相邻的元素,实际的物理存储空间也是连续的。

2.1顺序表——存储结构

#define MaxSize 50
typedef int ElemType;  //这里可以快速的帮助修改数据类型//顺序表的存储类型
typedef struct
{ElemType data[MaxSize];		//存放顺序表元素int length;					//存放顺序表的长度
} SqList;						//顺序表的类型

初始化顺序表

//初始化线性表
void initList(SqList* L) {L->length = 0;
}

顺序表—在尾部添加元素

//顺序表—在尾部添加元素
bool appendElem(SqList* L, ElemType e) {if (L->length > MaxSize) {printf("数据表已满\n");return false;}L->data[L->length] = e;L -> length++;return true;
}

线性表—遍历

//顺序表-遍历
void DispList(SqList* L) {int i = 0;for (i = 0; i < L->length; i++) {printf("%d ", L->data[i]);}printf("\n");
}

线性表—插入元素

//顺序表插入元素
//在第i个位置插入e
bool ListInsert(SqList* L, int i, ElemType e) {if (i < 1 || i > L->length + 1 || i >= MaxSize) {return false; //插入的位置不合法}i--;int j = 0;for (j = L->length; j >= i; j--) {L->data[j] = L->data[j - 1];}L->data[i] = e;L->length++;return true; // 插入成功
}

线性表—删除元素

//顺序表—删除元素
//删除第i个元素
//删除成功返回true删除失败返回false
bool ListDelete(SqList* L, int i, ElemType *e) {*e = L->data[i - 1];//所删除的元素if (i < 1 || i > L->length) {return false; // 删除失败}i--;int j = 0;for (j = i; j < L->length - 1; j++) {L->data[j] = L->data[j + 1];}L->length--;return true;}

线性表——按照元素值查找

//按照元素值查找--查找成功返回下标失败返回-1.
int LocateElem(SqList* L, ElemType e) {int i = 0;for (i = 0; i < L->length; i++) {if (L->data[i] == e) {return i + 1;}}return -1;
}

线性表—按序号求线性表中的元素

//线性表-得到出线性表第i的元素
bool GetElem(SqList* L, int i, ElemType *e) {if (i < 1 || i > L->length) {return false;}*e = L->data[i - 1];return true;}

3、总代码——测试

这里需要三个文件:

Seqlist.h 头文件:

#pragma once
#include<stdio.h>
#include<malloc.h>
#include<stdbool.h>typedef int ElemType;  //这里可以快速的帮助修改数据类型
#define MaxSize 50
//顺序表的存储类型
typedef struct
{ElemType data[MaxSize];		//存放顺序表元素int length;					//存放顺序表的长度
} SqList;						//顺序表的类型//初始化线性表
void initList(SqList* L);//顺序表—在尾部添加元素
//返回ture添加成功,否则失败
bool appendElem(SqList* L, ElemType e);//顺序表-遍历
void DispList(SqList* L);//顺序表插入元素
//在第i个位置插入e
bool ListInsert(SqList* L, int i, ElemType e);//顺序表—删除元素
//删除第i个元素
bool ListDelete(SqList* L, int i, ElemType* e);//按照元素值查找元素--查找成功返回下标失败返回-1.
int LocateElem(SqList* L, ElemType e);//线性表-得到出线性表第i的元素
bool GetElem(SqList* L, int i, ElemType *e);

Seqlist.c 文件

#include"Seqlist.h"//初始化线性表
void initList(SqList* L) {L->length = 0;
}//顺序表—在尾部添加元素
bool appendElem(SqList* L, ElemType e) {if (L->length > MaxSize) {printf("数据表已满\n");return false;}L->data[L->length] = e;L -> length++;return true;
}//顺序表-遍历
void DispList(SqList* L) {int i = 0;for (i = 0; i < L->length; i++) {printf("%d ", L->data[i]);}printf("\n");
}//顺序表插入元素
//在第i个位置插入e
bool ListInsert(SqList* L, int i, ElemType e) {if (i < 1 || i > L->length + 1 || i >= MaxSize) {return false; //插入的位置不合法}i--;int j = 0;for (j = L->length; j >= i; j--) {L->data[j] = L->data[j - 1];}L->data[i] = e;L->length++;return true; // 插入成功
}//顺序表—删除元素
//删除第i个元素
//删除成功返回true删除失败返回false
bool ListDelete(SqList* L, int i, ElemType *e) {*e = L->data[i - 1];//所删除的元素if (i < 1 || i > L->length) {return false; // 删除失败}i--;int j = 0;for (j = i; j < L->length - 1; j++) {L->data[j] = L->data[j + 1];}L->length--;return true;}//按照元素值查找--查找成功返回下标失败返回-1.
int LocateElem(SqList* L, ElemType e) {int i = 0;for (i = 0; i < L->length; i++) {if (L->data[i] == e) {return i + 1;}}return -1;
}//线性表-得到出线性表第i的元素
bool GetElem(SqList* L, int i, ElemType *e) {if (i < 1 || i > L->length) {return false;}*e = L->data[i - 1];return true;}

test.c 测试

#include"Seqlist.h"int main() {//声明并初始化顺序表SqList list;initList(&list);printf("初始化顺序表的长度—> %d\n", list.length);//向顺序表添加数据appendElem(&list, 1);appendElem(&list, 5);appendElem(&list, 61);ListInsert(&list, 1, 88);//删除元素i的位置的元素int e = 1;ListDelete(&list, 1, &e);printf("删除的元素为%d \n", e);DispList(&list);// 按数值查找元素printf("查找元素61的下标:%d \n", LocateElem(&list, 61));printf("查找元素99的下标:%d \n", LocateElem(&list, 99));ElemType m = 0;GetElem(&list,2, &m);printf("线性表中第2个元素:%d\n", m);//遍历数据表DispList(&list);return 0;
}

这里我只是进行了简单的测试代码是没有问题的。读者们可以自行测试

4、动态分配内存地址初始化

Seqlist.h 头文件:

#pragma once
#include<stdio.h>
#include<malloc.h>
#include<stdbool.h>typedef int ElemType;  //这里可以快速的帮助修改数据类型
#define MaxSize 50
////顺序表的存储类型
//typedef struct
//{
//	ElemType data[MaxSize];		//存放顺序表元素
//	int length;					//存放顺序表的长度
//} SqList;						//顺序表的类型typedef struct
{ElemType *data;		//存放顺序表元素int length;					//存放顺序表的长度
} SqList;						//顺序表的类型//初始化线性表
SqList* initList(L);//顺序表—在尾部添加元素
//返回ture添加成功,否则失败
bool appendElem(SqList* L, ElemType e);//顺序表-遍历
void DispList(SqList* L);//顺序表插入元素
//在第i个位置插入e
bool ListInsert(SqList* L, int i, ElemType e);//顺序表—删除元素
//删除第i个元素
bool ListDelete(SqList* L, int i, ElemType* e);//按照元素值查找元素--查找成功返回下标失败返回-1.
int LocateElem(SqList* L, ElemType e);//线性表-得到出线性表第i的元素
bool GetElem(SqList* L, int i, ElemType *e);

Seqlist.c 文件

#include"Seqlist.h"//初始化线性表
SqList* initList() {SqList*  L = (SqList*)malloc(sizeof(SqList));L-> data = (ElemType*)malloc(MaxSize * sizeof(ElemType));L->length = 0;return L;
}//顺序表—在尾部添加元素
bool appendElem(SqList* L, ElemType e) {if (L->length > MaxSize) {printf("数据表已满\n");return false;}L->data[L->length] = e;L -> length++;return true;
}//顺序表-遍历
void DispList(SqList* L) {int i = 0;for (i = 0; i < L->length; i++) {printf("%d ", L->data[i]);}printf("\n");
}//顺序表插入元素
//在第i个位置插入e
bool ListInsert(SqList* L, int i, ElemType e) {if (i < 1 || i > L->length + 1 || i >= MaxSize) {return false; //插入的位置不合法}i--;int j = 0;for (j = L->length; j >= i; j--) {L->data[j] = L->data[j - 1];}L->data[i] = e;L->length++;return true; // 插入成功
}//顺序表—删除元素
//删除第i个元素
//删除成功返回true删除失败返回false
bool ListDelete(SqList* L, int i, ElemType *e) {*e = L->data[i - 1];//所删除的元素if (i < 1 || i > L->length) {return false; // 删除失败}i--;int j = 0;for (j = i; j < L->length - 1; j++) {L->data[j] = L->data[j + 1];}L->length--;return true;}//按照元素值查找--查找成功返回下标失败返回-1.
int LocateElem(SqList* L, ElemType e) {int i = 0;for (i = 0; i < L->length; i++) {if (L->data[i] == e) {return i + 1;}}return -1;
}//线性表-得到出线性表第i的元素
bool GetElem(SqList* L, int i, ElemType *e) {if (i < 1 || i > L->length) {return false;}*e = L->data[i - 1];return true;}

test.c 测试

#include"Seqlist.h"int main() {//声明并初始化顺序表SqList* list =  initList();printf("初始化顺序表的长度—> %d\n", list->length);//向顺序表添加数据appendElem(list, 1);appendElem(list, 5);appendElem(list, 61);ListInsert(list, 1, 88);//删除元素i的位置的元素int e = 1;ListDelete(list, 1, &e);printf("删除的元素为%d \n", e);DispList(list);// 按数值查找元素printf("查找元素61的下标:%d \n", LocateElem(list, 61));printf("查找元素99的下标:%d \n", LocateElem(list, 99));ElemType m = 0;GetElem(list, 2, &m);printf("线性表中第2个元素:%d\n", m);//遍历数据表DispList(list);return 0;
}

        在这里实现了增删等重要内容的代码过于简单的并没提到,如果这些搞明白,像是求顺序表的长度自然就明白啦。

http://www.dtcms.com/a/443272.html

相关文章:

  • 传播文化有限公司网站建设查询网138网站域名
  • YOLO入门教程(番外):卷积神经网络—从全连接层到卷积
  • 技术支持 东莞网站建设大型门户网站开发案例
  • Rust程序语言设计(1-4)
  • 做北京电梯招标的网站合肥seo外包平台
  • CodeForces 20251003 - ?
  • node服务端通过socket.io保持长连接通信示例
  • Super-Resolution Delay-Doppler Estimation for OFDM Passive Radar
  • 九江开发区建设环保局网站贵州住房建设厅官网查询
  • 郑州诺耀科技 - 郑州高端网站建设营销推广网站路径怎么做
  • 招聘网站源码下载岳阳市交通建设投资公司门户网站
  • 单细胞空间--免疫细胞与肾脏细胞的时空相互作用调控自身免疫性肾病中肾小球新月体形成
  • 巨野做网站的网站策划与运营考试题
  • 正品海外购网站有哪些中国十大建筑设计院排名
  • Docker Compose 多容器编排实战
  • 初创公司 建网站网站设计和营销
  • 救援启动!
  • Android 事件分发机制 图解
  • 做网站价钱电脑版qq在线登录网页入口
  • 140、【OS】【Nuttx】【周边】效果呈现方案解析:strace 日志解析(六)
  • 免费网站建设软件大全wordpress禁止中国ip
  • 有界区域上具有常数右端项的泊松方程解的上界估计
  • 做区位分析的地图网站wordpress主题分类目录主题
  • 网站建设实习每天内容手机网站开发 html
  • 手机网站制作案例教育网站建设备案
  • 网站开发时的闭包写法进一步加强区门户网站建设管理办法
  • 计算机网站设计怎么做扬中信息网
  • 专业网站名词解释资讯网站 怎样 增强用户粘度
  • 现代C++——并发编程
  • Dotnet通过OpenAI方式接入DeepSeek