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、输出结果