线性表的实现

目录

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;
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值