目录
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;
}
在这里实现了增删等重要内容的代码过于简单的并没提到,如果这些搞明白,像是求顺序表的长度自然就明白啦。