线性表的实现
目录
1、线性表的定义和特性
1.1 线性表的定义
1.2 线性表的特征
2、顺序表
2.1顺序表——存储结构
3、总代码——测试
4、动态分配内存地址初始化
1、线性表的定义和特性
1.1 线性表的定义
定义:线性表(linear List)是具有相同特性的数据元素的一个有限序列。
线性表中元素的个数n(n >= 0) 定义为线性表的长度,当n = 0时称之为空表。第一个元素称为表头元素,最后一个元素称之为表尾元素。
1.2 线性表的特征
- 有穷性:一个线性表中的元素个数是有限的。
- 一致性:一个线性表中所有元素的性质相同。从实现角度看,所有元素具有相同的数据类型。
- 序列性:一个线性表中所有元素之间的相对位置是线性的,即存在唯一的开始元素和终端元素,除此之外,每个元素只有唯一的前驱元素和后继元素。各元素在线性表中的位置只取决于它们的序号,所以在一个线性表中可以存在两个值相同的元素。
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;
}
在这里实现了增删等重要内容的代码过于简单的并没提到,如果这些搞明白,像是求顺序表的长度自然就明白啦。