C Language 线性表篇 - 顺序表
Posted Adorable_Rocy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C Language 线性表篇 - 顺序表相关的知识,希望对你有一定的参考价值。
顺序表和单链表的区别小编使用一个例子来说明吧
- 创建结构体
struct SqList {
char data[MaxSize];
int length;
};
- 初始化结构体算法:
void InitSqList(SqList *&L){
L = (SqList *)malloc(sizeof(SqList));
L->length = 0;
}
- 判断是否是空表算法:
bool EmptyOrSqList(SqList *L){
if(L->length == 0)
return true;
return false;
}
- 创建顺序表算法:
struct SqList *CreateList(SqList *&L , int n) {
char alphabets[MaxSize] = {'a','b','c','d','e','f','g','h',
'i','j','k','l','m','n','o','p','q','r','s','t',
'u','v','w','x','y','z'
};
int i = 0;
if( n < 0 || n > MaxSize) { //合法性校验
printf("长度不合法");
exit(1);
}
for(i; i < n; i++) {
L->data[i] = alphabets[i];
}
L->length = n;
return L; //返回创建的顺序表
}
- 输出顺序表算法:
void DispSqList(SqList *L , int pos) {
// pos参数表示是否查找指定位置元素 ,如果错误传入,则默认查询所有
int index = 0;
if(L->length == 0) {
printf("空表");
exit(1);
}
if(pos != -1 && pos <= L->length){
printf("查找的第%d位元素为:%c",pos,L->data[pos - 1]);
}else{
for(index; index<L->length; index++) {
printf("%3c",L->data[index]);
}
}
printf("\\n");
}
- 根据字符查找索引算法:
int Search(SqList *L , char ch){
int i = 0 , index = -1;
for(i ; i < L->length ; i++){
if(L->data[i] == ch){
index = i + 1;
break;
}
}
return index;
}
- 插入数据的算法:
void InserData(SqList *L ,int i , char e) {
int j;
if( i < 0 || L->length == MaxSize || i>L->length) {
printf("非法插入");
exit(1);
}
i--;//在第几个位置插入
for(j = L->length; j>i; j--)
L->data[j] = L->data[j-1]; //所有元素向后移动一位,从最后一位开始
L->data[i] = e;
L->length++; //数组长度+1
}
补充:这里数组长度只是定义在结构体的用来记录的长度,所以在先移位后添加长度是不会出现异常的,因为数组的长度在一开始就被定义好了MaxSize
- 删除数据的算法:
char DeleteData(SqList *L , int i){
int j;
char e;
if(i < 0 || i > L->length){
printf("非法删除");
exit(1);
}
i--;
e = L->data[i];
for(j=i;j<L->length;j++)
L->data[j] = L->data[j+1]; //所有的元素向前移动一位
L->length--;
return e; //返回删除的元素
}
- main函数演示:
main() {
struct SqList *H ;
int n = 5;
//初始化顺序表L
InitSqList(H);
//创建链表
CreateList(H,n);
//输出顺序表 L
DispSqList(H,-1);
//输出顺序表长度
SqListLen(H);
//判断是否为空
if(EmptyOrSqList(H))
printf("是空表\\n");
else
printf("非空\\n");
//输出顺序表L的第3个元素
DispSqList(H,3);
//查找a的位置
int position = Search(H,'a');
printf("a 的位置为:%d\\n",position);
//第4个位置插入f元素
InserData(H,4,'f');
//输出顺序表
DispSqList(H,-1);
//删除顺序表L的第3个元素
DeleteData(H,3);
//输出顺序表
DispSqList(H,-1);
//释放顺序表
free(H);
return 0;
}
- 结果如下:
总结:顺序表和单链表的区别是,单链表是动态分配,顺序表是直接分配好固定大小的内存,顺序表在精准插入和查询方面的效率是明显高于链表的,但是可扩展性是不如链表的
以上是关于C Language 线性表篇 - 顺序表的主要内容,如果未能解决你的问题,请参考以下文章
数据结构学习笔记二线性表---顺序表篇(画图详解+代码实现)