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 线性表篇 - 顺序表的主要内容,如果未能解决你的问题,请参考以下文章

C Language 线性表篇 - 单链表

数据结构——线性表之顺序表篇

数据结构学习笔记二线性表---顺序表篇(画图详解+代码实现)

数据结构学习笔记二线性表---顺序表篇(画图详解+代码实现)

C Language 单链表篇 -

C Language 单链表篇 -