线性表的C代码实现(根据书本进行了部分修改,修改部分代码有注解)

线性表的抽象数据类型

ADT 线性表(List)
Data
	线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType。其中,除了第一个元素a1外,
	每个元素有且只有一个直接的前驱,除了最后一个元素,每个元素有且只有一个直接后继元素。数据
	元素之间的关系是一对一的关系。
Operator
	InitList(*L):初始化操作,建立一个空的线性表L
	ListEmpty(L):若线性表为空,返回true,否则返回false
	ClearList(*L):将线性表清空
	GetElem(L,I,*e):将线性表L中第i个位置元素值返回给e
	LocateElem(L,e):在线性表L中查找与给定值e相等的元素;查找成功,返回该元素在表中序号表示成功,
					否则返回0表示失败,
	ListInsert(*L,i,e):在线性表中的第i个位置插入新元素e
	ListDelet(*L,i,*e):删除线性表L中第i个位置元素,并用e返回其值
	ListLength(L):返回线性表L的元素个数

.hpp文件

#ifndef TEST_H_
#define TEST_H_

#include"malloc.h"
#define MAXSIZE 20
typedef int ElemType;

typedef struct 
{
	ElemType data[MAXSIZE];
	int length;//顺序存储结构当前长度
}Sqlist;

//InitList(*L):初始化操作,建立一个空的线性表L
Sqlist * initList();
//ListEmpty(L):若线性表为空,返回true,否则返回false
bool listEmpty(Sqlist _myList);
//ListLength(L):返回线性表L的元素个数
int listLength(Sqlist _myList);
//ClearList(*L):将线性表清空
bool clearList(Sqlist * _myList);
//GetElem(L,I,*e):将线性表L中第i个位置元素值返回给e
bool getElem(Sqlist _myList, const int i, ElemType * e);
//LocateElem(L,e):在线性表L中查找与给定值e相等的元素;查找成功,返回该元素在表中序号表示成功,否则返回0表示失败
int locateElem(Sqlist _myList, const ElemType e);
//ListInsert(*L,i,e):在线性表中的第i个位置插入新元素e
bool listInsert(Sqlist * _myList, const int i, const ElemType e);
//ListDelet(*L,i,*e):删除线性表L中第i个位置元素,并用e返回其值
bool listDelete(Sqlist * _myList, const int i);
#endif // !TEST_H_
#pragma once

.cpp文件

#include"test.h"

//InitList(*L):初始化操作,建立一个空的线性表L
Sqlist * initList() {
	
	Sqlist * temp;
	temp = (Sqlist *)malloc(sizeof(Sqlist));//注意微软的编译器不能实现:
	//void*类型指针能自动转为其他类型的指针
	temp->length = 0;
	return temp;
}

//ListEmpty(L):若线性表为空,返回true,否则返回false
bool listEmpty(Sqlist _myList) {

	if (_myList.length == 0)
		return true;
	else
		return false;

}

//ListLength(L):返回线性表L的元素个数
int listLength(Sqlist _myList) {

	return _myList.length;

}

//ClearList(*L):将线性表清空
bool clearList(Sqlist * _myList) {

	for (int i = 0; i < _myList->length; i++)
		_myList->data[i] = 0;
	_myList->length = 0;
	return true;
}

//GetElem(L,I,*e):将线性表L中第i个位置元素值返回给e
bool getElem(Sqlist _myList, const int i, ElemType * e) {

	if (_myList.length == 0 || i < 1 || i > _myList.length)
		return false;
	*e = _myList.data[i - 1];
	return true;
}

//LocateElem(L, e) :在线性表L中查找与给定值e相等的元素;查找成功,返回该元素在表中序号表示成功,否则返回0表示失败
int locateElem(Sqlist _myList, const ElemType e) {

	if (_myList.length == 0)
		return 0;
	int i;
	for (i = 0; i < _myList.length; i++)
	{
		if (e == _myList.data[i])
			return i;
	}

	if (i > _myList.length)
		return 0;

}

//ListInsert(*L,i,e):在线性表中的第i个位置插入新元素e
//(1)如果插入位置不合理,抛出异常
//(2)如果线性表的长度大于等于数组的长度,则抛出异常或动态增加容量
//(3)从最后一个元素开始向前遍历到第I个位置,分别将他们都向后移一个位置
//(4)将要插入元素填入位置i处
bool listInsert(Sqlist * _myList, const int i, const ElemType e) {

	if (i < 1)
		return false;
	if (_myList->length >= MAXSIZE)
		return false;
	if(i < _myList->length)
		for (int k = _myList->length; k >= i-1 ; k--)//从后往前遍历不用加中间变量
			_myList->data[k + 1] = _myList->data[k];
	_myList->data[i - 1] = e;
	++_myList->length;
	return true;
}

//ListDelet(*L,i,*e):删除线性表L中第i个位置元素,并用e返回其值
//(1)如果删除位置不合理,抛出异常
//(2)取出删除元素
//(3)从删除元素位置开始遍历到最后一个元素位置,分别将他们都向前移动一个位置
//(4)表长减一
bool listDelete(Sqlist * _myList, const int i) {

	if (i < 1 || i > _myList->length)
		return false;
	if (_myList->length == 0)
		return false;
	//*e = _myList->data[i - 1];
	if(i < _myList->length)
		for (int k = i; k < _myList->length; k++)
			_myList->data[k - 1] = _myList->data[k];
	--_myList->length;
	return true;
}

main函数

#include"test.h"
#include<iostream>

void showList(Sqlist * _list);
int main()
{
	Sqlist * root = initList();
	std::cout << "空线性表的当前长度为: " << root->length << std::endl;
	std::cout << listEmpty(*root) << std::endl;
	listInsert(root, 0, 1);
	listInsert(root, 1, 2);
	listInsert(root, 2, 3);
	listInsert(root, 3, 4);
	listInsert(root, 4, 5);
	listInsert(root, 5, 6);
	std::cout << "表的当前长度为: " << root->length << std::endl;
	std::cout << listEmpty(*root) << std::endl;
	showList(root);
	listDelete(root, 2);
	std::cout << "表的当前长度为: " << root->length << std::endl;
	std::cout << listEmpty(*root) << std::endl;
	showList(root);
	return 0;
}

void showList(Sqlist * _list) {

	if (_list->length < 1)
		std::cerr << "线性表为空表!\n";
	else
	{
		for (int i = 0; i < _list->length; i++)
		{
			std::cout << _list->data[i] << " ";
		}
		std::cout << std::endl;
	}
	
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值