微信公众号:程序员周同学 关注可了解更多的教程及编程技巧。问题或建议,请公众号后台留言; 如果你觉得对你有帮助,欢迎点赞
写在前面顺序表如何增添数据?顺序表如何删除数据?顺序表的查改操作总结
本文所有操作均基于以下代码
#include<stdio.h>
typedef int DataType;
const int MAXSIZE = ;
typedef struct{
DataType List[MAXSIZE];
int size;
}SeqList;
int main(){
SeqList seqList;
//文章中增删改查均用函数实现
}
在上篇文章中[数据结构]线性表的顺序表示中我已经介绍了顺序表的特点。在今天这篇文章中我将带大家完成顺序表的增删改查四个基本操作
顺序表的插入方式有两种:
首先我们假设顺序表,最大存储个数MAXSIZE设置为20,且顺序表中已经添加了5个数据。 我们要将一个新的数据data插入到下标index=2处。
图注:假设前提 第一步:将下标index=2,且下标大于2的数据,均向后移动一位,且必须从最后一个数据开始移动。
图注:数据的移动过程移动操作代码如下:
//必须从最后一位开始移动,想想为什么?
for (int j = seqList->size; j > index; --j)
seqList->List[j] = seqList->List[j-1];
第二步:将下标index=2的数据赋值为data,并将顺序表的大小size加一
代码如下:
seqList->List[index] = data;
seqList->size ++;
综合以上代码,我们得到实现顺序表增添操作的函数insertSeqList
/**
* @param seqList 顺序表的地址
* @param index 插入数据的位置
* @param data 需要插入的数据
*/
//此处如果直接传入顺序表,在函数运行结束后,并不会改变原顺序表的值。必须传入顺序表的地址
void insertSeqList(SeqList* seqList,int index,DataType data)
{
//当顺序表大小超过最大储存大小时,无法插入数据
if (seqList->size >= MAXSIZE){
printf("顺序表已满!无法插入数据!");
return;
}
//当下标小于0或者大于顺序表的大小时,下标index不合法,无法正常插入数据
//也可将不合法时,默认为在末尾插入数据.将if中的注释去掉即可
if(index<||index>seqList->size){
printf("插入位置不合法!");
//seqList->List[seqList->size] = data;
//seqList->size++;
}
else{
//循环后移数据
for (int j = seqList->size; j > index; --j)
seqList->List[j] = seqList->List[j-1];
//将数据插入顺序表
seqList->List[index] = data;
//顺序表大小加一
seqList->size ++;
}
}
顺序表删除数据同样也有两种方法:
这里主要考虑第二种情况,根据传入数据的值来删除数据(其中逻辑包含第一种删除方式) 在上一小节顺序表如何插入数据中,我们已经知道了,在插入数据时,我们必须给插入的数据留下一个空位,向后面的数据向后移动一位,使之能够顺利插入顺序表。而删除是插入的反向操作,所以很容易想到,在删除顺序表数据时,我们就要将需要删除的数据之后的数据均向前移动一位,覆盖要删除的数据。同样以顺序表中有五个数据为例,删除数据也分为两步:
图注:删除数据的第一步 代码演示:
int index;//声明一个int型变量index,用于保存下标
for (int i = ; i < seqList->size; ++i) {
if (seqList->List[i] == data){
//若找到了想删除的数据,则把下标赋值给index
index = i;
break;
}else
//index = -1表示未找到想删除的数据
index = -1;
}
图注:移动过程 代码演示:
//循环向前移动
for (int i = index; i < seqList->size; ++i)
seqList->List[i] = seqList->List[i + ];
seqList->size--;//移动结束后,顺序表大小减一
综上,删除顺序表中数据的函数deleteSeqListData实现方式如下:
//如果想删除指定下标的元素,则先判断传入的下标值是否合理,再使用最后一个for循环将数据移动
void deleteSeqListData(SeqList* seqList, int data) {
//当顺序表中没有数据时,直接返回
if (seqList->size <= )
return;
int index;
//查找数据
for (int i = ; i < seqList->size; ++i) {
if (seqList->List[i] == data) {
index = i;
break;
}
else
index = -1;
}
if (index == -1)
return;//如果没有找到数据直接return;
//将数据循环向前移动一位
for (int i = index; i < seqList->size; ++i)
seqList->List[i] = seqList->List[i + ];
//移动之后顺序表的大小减一
seqList->size--;
}
我写的方法与课本上有所不同,我们来看看课本上的删除写法,我加上注释方便大家理解:
/**
*
* @param seqList 顺序表的地址
* @param index 需要删除的下标值
* @param data 用于保存删除的数据,因为传入的是地址,所以无需return,在主函数中直接会被修改
* @return 0 表示未删除成功 ;1 表示删除成功
*/
int ListDelete(SeqList* seqList,int index,DataType* data) {
//判断顺序表中是否还有数据
if (seqList->size <= ){
printf("顺序表为空,无值可删除!");
return ;
}
//判断下标值是否合法
else if(index < || index > seqList->size-1){
printf("下标值不合法!");
return ;
}else{
//将要删除的元素赋值给data,data为地址值,所以在主函数中也会被修改,而非形式参数
*data = seqList->List[index];
//循环赋值
for (int i = index; i < seqList->size; ++i)
seqList->List[i] = seqList->List[i + ];
return ;
}
}
这两个操作应该是最简单的了,这里就不做过多的描述了。看一下书上的查找代码
//查
int getSeqListData(SeqList* seqList,DataType data){
for (int i = ; i < seqList->size; ++i) {
if (seqList->List[i] == data)
return i;//找到了则返回数据的下标
}
//没找到则返回-1
return -1;
}
//改,在查找的基础上直接做修改
int updateSeqListData(SeqList* seqList,DataType oldData,DataType newData){
//首先查找需要修改的数据的下标
int index;
for (int i = ; i < seqList->size; ++i) {
if (seqList->List[i] == oldData){
index = i;
break;
} else
index = -1;
}
//没找到直接return
if (index == -1)
return ;
else{
//找到了就将该数据赋值为newData
seqList->List[index] = newData;
return ;
}
}
顺序表是数据结构中最简单的一种,但它也可以实现很多生活中常见的情形,比如:已知班上的人数固定,需要保存成绩等信息,我们就可以用到顺序表,方便查找数据。 大家可以根据自己的喜好,来写一个小程序,加上文件操作实现相关功能。