c语言代码实现
C语言实现 线性表(顺序表)的相关操作,实现了如下方法:
- 初始化线性表
InitList(SqList &L); - 销毁线性表
DestroyList(SqList &L); - 清空线性表
ClearList(SqList &L); - 在线性表指定位置插入元素
ListInsert(SqList &L, int i, ElemType e); - 获取线性表的长度
ListLength(SqList L); - 在线性表中查找指定元素所在的位置
LocateElem(SqList L, ElemType e); - 在线性表中获取指定位置的元素
GetElem(SqList L, int i, ElemType &e); - 判断线性表是否为空
IsEmpty(SqList L); - 删除线性表中指定位置的元素
ListDelete(SqList &L, int i, ElemType &e);
写的匆忙,如有错误,请大家指正一下。
#include <stdio.h>
#include <cstdlib>
//###一些常量
//函数结果状态码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//线性表最大容量
#define MAXSIZE 100
//函数类型
typedef int Status;
//线性表的元素类型
typedef char ElemType;
//定义顺序表结构体
typedef struct{
//数组,用来存储线性表的元素
ElemType *elem;
//线性表的长度
int length;
}SqList;
//------------------------------------------------
//初始化线性表
Status InitList(SqList &L);
//销毁线性表
void DestroyList(SqList &L);
//清空线性表
void ClearList(SqList &L);
//在线性表指定位置插入元素
Status ListInsert(SqList &L, int i, ElemType e);
//获取线性表的长度
int ListLength(SqList L);
//在线性表中查找指定元素所在的位置
int LocateElem(SqList L, ElemType e);
//在线性表中获取指定位置的元素
Status GetElem(SqList L, int i, ElemType &e);
//判断线性表是否为空
Status IsEmpty(SqList L);
//删除线性表中指定位置的元素
Status ListDelete(SqList &L, int i, ElemType &e);
//------------------------------------------------
int main(){
/**
* 对线性表的相关操作进行测试
*/
//定义一个顺序表
SqList list;
//初始化顺序表
InitList(list);
//将元素插入到线性表中
ElemType e1 = 'a';
ElemType e2 = 'b';
ElemType e3 = 'c';
ElemType e4 = 'd';
ElemType e5 = 'e';
ListInsert(list, 1, e1);
ListInsert(list, 2, e2);
ListInsert(list, 3, e3);
ListInsert(list, 4, e4);
ListInsert(list, 5, e5);
//打印线性表的元素,打印结果:a c d e
for(int i = 0; i < ListLength(list); i++){
ElemType e;
GetElem(list, i+1, e);
printf("%c\t", e);
}
//查看线性表是否为空
Status s = IsEmpty(list);
printf("\n是否为空线性表:%d\n", s);//0
//查看线性表的长度
int length = ListLength(list);//返回
printf("线性表的长度:%d\n", length);//5
//删除一个元素
ElemType e6;
ListDelete(list, 2, e6);
printf("被删除的元素:%c\n", e6);//b
//打印线性表的元素,打印结果:a c d e
for(int i = 0; i < ListLength(list); i++){
ElemType e;
GetElem(list, i+1, e);
printf("%c\t", e);
}
//查找元素c所在的序号
ElemType c = 'c';
int index = LocateElem(list, c);
printf("\n元素c所在的序号是:%d\n", index);//2
//清空线性表
ClearList(list);
//查看线性表是否为空
s = IsEmpty(list);
printf("是否为空线性表:%d\n", s);//1
//销毁线性表
DestroyList(list);
}
/**
* 初始化操作,建立一个空的线性表L
* @param L
* @return
*/
Status InitList(SqList &L){
//写法一,malloc函数分配不成功则返回NULL
L.elem = (ElemType *)malloc(sizeof(ElemType) * MAXSIZE);
//写法二:c++写法
//L.elem = new ElemType[MAXSIZE];
//判断是否分配内存空间成功
if(!L.elem){
printf("线性表初始化失败!");
//结束程序
exit(OVERFLOW);
}
//初始化线性表的长度length属性
L.length = 0;
return OK;
}
/**
* 销毁已经存在的线性表L
* @param L
*/
void DestroyList(SqList &L){
if(!L.elem){
//线性表不为NULL,释放存储空间
delete L.elem;
}
}
/**
* 将线性表L的元素清空
* @param L
* @return
*/
void ClearList(SqList &L){
//将线性表的长度设置为0
L.length = 0;
}
/**
* 在线性表L的第i个位置插入新元素e
* @param L 线性表
* @param i 要插入的位置
* @param e 要插入的新元素
* @return Status
*/
Status ListInsert(SqList &L, int i, ElemType e){
//判断线性表是否已经存在,和满了
if(!L.elem || ListLength(L) == MAXSIZE){
printf("线性表没有初始化或已经满了!");
return ERROR;
}
//判断要插入的位置是否正确
if(i < 1 || i > ListLength(L)+1){
printf("只能插入在第1个位置到第%d个位置之间!", ListLength(L)+1);
return ERROR;
}
//从最后一个元素开始,每个元素依次往后移一个位置,直到第i个位置的元素移动后终止,此时空出了第i个位置
for(int k = ListLength(L); k >= i; k--){
//元素后移
L.elem[k] = L.elem[k-1];
}
//插入元素
L.elem[i-1] = e;
//更新线性表长度
L.length++;
return OK;
}
/**
* 删除线性表L中的第i个元素,并将该元素用e返回
* @param L 线性表
* @param i 第几个位置的元素
* @param e 用来接收被删除元素
* @return
*/
Status ListDelete(SqList &L, int i, ElemType &e){
//判断线性表是否已经存在
if(!L.elem){
printf("线性表没有初始化!");
return ERROR;
}
//判断要删除的位置是否有元素,找到元素e就会指向这个要被删除的元素
if(GetElem(L, i, e) == ERROR){
return ERROR;
}
//删除,从第i-1个下标开始,用后面一个元素来覆盖前面一个位置的元素
for(int k = i; k < ListLength(L); k++){
//前移覆盖
L.elem[k-1] = L.elem[k];
}
//更新线性表长度
L.length--;
return OK;
}
/**
* 若线性表L为空,返回TRUE,否则返回FALSE
* @param L 线性表
* @return
*/
Status IsEmpty(SqList L){
//根据length属性来返回是否为空
return ListLength(L)==0? TRUE: FALSE;
}
/**
* 返回线性表L的元素个数
* @param L 线性表
* @return length
*/
int ListLength(SqList L){
//返回length属性的值
return L.length;
}
/**
* 在线性表L中查找与给定元素e相同的元素,找到则返回该元素在表中的序号,找不到返回0
* @param L 线性表
* @param e 要查找的元素
* @return 序号 or 0
*/
int LocateElem(SqList L, ElemType e){
//顺序查找法
//对线性表的元素进行逐个遍历判断是否与e相等
for(int i = 0; i < ListLength(L); i++){
if(L.elem[i] == e){
//元素与e相等,返回元素在线性表中的序号(下标+1)
return i + 1;
}
}
//遍历结束都没有找到,返回0
return 0;
}
/**
* 在线性表L中获取第i个位置元素返回给e
* @param L 线性表
* @param i 第几个位置
* @param e 用来接收找到元素的变量
* @return 找到返回OK,找不到返回ERROR
*/
Status GetElem(SqList L, int i, ElemType &e){
//i不能小于1或者i不能大于线性表的长度
if(i < 1 || i > ListLength(L)){
printf("要获取的位置i值小于1或大于线性表的长度!");
return ERROR;
}
//读取元素并赋值给e,传入的i是位置值,转为下标需要-1
e = L.elem[i-1];
return OK;
}