数据结构—顺序表的实现(c语言版)

1、线性表的基本操作
一个数据结构的基本操作是指其最核心、最基本的操作。其他较复杂的操作可通过调用其基本操作来实现。
线性标的基本操作如下:

函数说明
InitList(&L);//初始化表,构造一个空的线性表
Length(L);//求表厂,返回线性表L的长度,即L中的数据元素的个数
LocateElem(L,e);//按值查找操作。在表L中查找具有给定关键字值的元素
GetElem(L,i);//按位查找操作,获取表中L中的第i位的元素值
ListInsert(&L,i,e);//插入操作。在表L中的第i个位置插入指定元素e
ListDelete(&L,i,&e);//删除操作。删除表L中的第i个位置的元素,并用e返回元素值
PrintList(L);//输出操作。按前后顺序输出线性表中L的所有值
Empty(L);//判空操作。判断L是否为空表,空返回true,否则返回false
DestroyList(&L);//销毁操作。销毁线性表,并释放内存空间。

2、代码

#include<stdio.h>
#include<stdlib.h>
#define InitSize 50//默认最大长度

typedef struct {
	int *data;
	int MaxSize;
	int length;
}SeqList;

//初始化顺序表
void InitList(SeqList &L) {
	L.data = (int *)malloc(sizeof(int)*InitSize);
	L.length = 0;
	L.MaxSize = InitSize;
}
//增大顺序表的长度
void IncreaseSize(SeqList &L, int len) {
	int *p = L.data;
	L.data = (int *)malloc( (L.MaxSize + len) * sizeof(int) ); //创建一个新的空间并将原来的数据复制过来
	for (int i = 0; i < L.length; i++) {
		L.data[i] = p[i];
	}
	L.MaxSize = L.MaxSize + len;
	free(p);//释放动态申请的空间
}
//返回当前长度;
int Length(SeqList &L) {
	return L.length;
}
//返回当前最大长度
int MaxSize(SeqList &L) {
	return L.MaxSize;
}
//判断是否为空
bool Empty(SeqList &L) {
	if (L.length==0) 
		return true;
	else return false;
}
//销毁顺序表
void DestoryList(SeqList &L) {
	free(L.data);
	L.length = 0;
	L.MaxSize = 0;
}
//按前后顺序输出线性表L的所有元素值
void PrintList(SeqList &L) {
	for (int i = 0; i < L.length; i++) {
		printf("第%d个元素为:%d\n", i+1,L.data[i]);
	}
}
//插入指定位置数据
bool ListInsert(SeqList &L, int index, int e) {
	if (L.length == L.MaxSize || index > L.MaxSize ||index<=0)
		return false;
	for (int i = L.length; i >=index; i--) {
		L.data[i] = L.data[i - 1];
	}
	L.data[index - 1] = e;
	L.length++;
	return true;
}
//删除指定位置数据
bool ListDelete(SeqList &L, int index, int &e) {
	if (index > L.length || index <= 0)
		return false;
	e = L.data[index - 1];
	for (int i = index; i < L.length; i++) {
		L.data[i - 1] = L.data[i];
	}
	L.length--;
	return true;
}
//按位查找元素,返回元素值
int GetElem(SeqList &L, int index) {
	if (index <= 0 || index > L.length) {
		return -1;
	}
	return L.data[index - 1];
}
//按值查找元素,返回坐标
int LocateElem(SeqList &L, int e) {
	for (int i = 0; i < L.length; i++) {
		if (L.data[i] == e) {
			return i + 1;
		}
	}
}
//为顺序表插入一系列数字便于测试
void InitInsert(SeqList &L) {
	for (int i = 0; i < L.MaxSize; i++) {
		L.data[i] = i+1;
	}
	L.length = L.MaxSize;
}
//主函数
int main() {
	SeqList L;
	InitList(L);
	if (Empty(L)) {
		printf("顺序表为空\n");
	}else {
		printf("顺序表不为空\n");
	}
	printf("初始化顺序表成功,顺序表MaxSize=%d,Length=%d\n", L.MaxSize,L.length);
	InitInsert(L);
	printf("插入一组数据成功,顺序表中数据长Length=%d\n", L.length);
	if (Empty(L)) {
		printf("顺序表为空\n");
	}
	else {
		printf("顺序表不为空\n");
	}
	IncreaseSize(L, 5);
	printf("添加新的空间成功,新的顺序表MaxSize=%d\n", L.MaxSize);
	if (ListInsert(L, 30, 5)) {
		printf("插入序号为30的元素成功,插入的元素为:5,顺序表Length为%d\n",L.length);
	}
	int e=-1;
	if (ListDelete(L, 30, e)) {
		printf("删除序号为30的元素成功,删除的元素为:%d,顺序表长度为%d\n", e,L.length);
	}
	int elem = GetElem(L, 35);
	printf("序号为35的元素值为:%d\n", elem);
	int index = LocateElem(L, elem);
	printf("值为%d的元素序号为:%d\n",elem, index);
	printf("输出数据\n");
	PrintList(L);
	DestoryList(L);
	printf("销毁顺序表成功,顺序表MaxSize=%d,Length=%d\n", L.MaxSize, L.length);
	system("pause");
	return 0;
}

3、输出结果
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南方-D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值