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

本文详细介绍了线性表的抽象数据类型(ADT),并使用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;
	}
	
}

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

以下是 C 语言实现线性表代码示例: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 // 定义线性表的最大长度 typedef struct { int data[MAX_SIZE]; // 存储数据的数组 int length; // 当前线性表的长度 } List; // 初始化线性表 void initList(List *list) { list->length = 0; // 线性表长度为0 } // 获取线性表长度 int getListLength(List *list) { return list->length; } // 在线性表末尾插入元素 int insertList(List *list, int element) { if (list->length >= MAX_SIZE) { // 线性表已满 return 0; } list->data[list->length++] = element; return 1; } // 删除元素 int deleteList(List *list, int element) { int i, j; for (i = 0; i < list->length; i++) { if (list->data[i] == element) { // 找到要删除的元素 for (j = i; j < list->length - 1; j++) { list->data[j] = list->data[j + 1]; // 将后面的元素向前移动 } list->length--; // 线性表长度减1 return 1; } } return 0; // 没有找到要删除的元素 } // 获取某个位置上的元素 int getElement(List *list, int index) { if (index < 0 || index >= list->length) { return -1; // 越界,返回-1 } return list->data[index]; } // 查找元素 int searchList(List *list, int element) { int i; for (i = 0; i < list->length; i++) { if (list->data[i] == element) { return i; // 找到元素,返回下标 } } return -1; // 没有找到元素,返回-1 } int main() { List list; initList(&list); // 初始化线性表 // 在线性表末尾插入元素 insertList(&list, 1); insertList(&list, 2); insertList(&list, 3); insertList(&list, 4); insertList(&list, 5); // 删除元素 deleteList(&list, 3); // 获取某个位置上的元素 printf("Element at index 2: %d\n", getElement(&list, 2)); // 查找元素 printf("Index of element 4: %d\n", searchList(&list, 4)); return 0; } ``` 以上代码实现线性表的基本操作,包括初始化、获取长度、插入元素、删除元素、获取元素、查找元素。注意:本代码仅为示例代码,实际使用中还需根据具体需求进行修改
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值