[数据结构]顺序表

在顺序表中,每一个元素的内存空间是连续的,可以通过下标与首地址直接计算出对应元素的地址。类似于数组,因此在线性表中,顺序表的效率是极高的。

定义

typedef struct{
	ContentType *content;
	int length;
	
}SList;

顺序表由数组和其长度组成

初始化

SList list;
list.content =(ContentType*)malloc(sizeof(ContentType)*MAX_SIZE);
list.length = 0;

初始化时需要给数组分配内存空间,并且将长度置为0

Status insert(SList *list, int index,ContentType content){ // 插入 
	if(list->length<index || index < 0 || index >= MAX_SIZE){ // 如果下标有问题 
		return ERROR;
	}
	
	int i = 0;
	for(i=list->length;i>index;i--){
		list->content[i] = list->content[i-1]; // 在插入位置前的各个元素往后挪一位 
	} 
	list->content[index] = content;
	list->length = list->length + 1; // 长度加一 
	return SUCCESS;
}

将插入位置后面的元素依次往后挪一位

再将对应位置改成待插入的元素

Status removeOne(SList *list,int index){ // 删除 
	if(list->length <= index || index < 0){
		return ERROR;
	} 
	int i = 0;
	for (i=index;i<=list->length-2;i++){
		list->content[i] = list->content[i+1]; //用下一位覆盖此位 
	}
	list->length = list->length - 1; // 长度减一 
	return SUCCESS; 
}

将后面的元素向前移动,覆盖待删除元素

Status set(SList *list,int index,ContentType content){ // 修改某一位 
	if(list->length <= index || index < 0){
		return ERROR;
	} 
	list->content[index] = content;
	return SUCCESS; 
}

直接修改对应下标位置的数据

Status getItem(SList *list,int index,ContentType *content){ // 通过下标查找元素
	 if(list->length <= index || index < 0){
		return ERROR;
	} 
	*content = list->content[index];
	return SUCCESS;
	
}
Status getIndex(SList *list, ContentType content, int *index){ // 通过元素查找下标 找到第一个 
	int i = 0;
	for(i=0;i<list->length;i++){
		if(list->content[i]==content){
			*index = i;
			return SUCCESS; 
		}
	} 
	return ERROR;
}

通过下标找元素就直接按照数组的操作方法来即可

通过元素找下标则需要遍历数组,这里是找出第一个,那找到后直接return即可