我是一个农村人,最喜欢来写C站,虽然没多少人会看,但我写的很用心
顺序表:顺序结构表示出来的线性表,线性表是逻辑结构,顺序表是线性表对应的存储结构
实现顺序表的增删查,可以分为以下几步:
第一步:首先要有顺序表,就用结构体存储数据;
/*第一步:定义结构体*/
#define MaxSize 50 //确定表的总空间大小
typedef int ElemType; //数据类型是int,但是重命名了,方便之后更改数据类型,比如说要存储字符类型的数据,就可以直接将这里的int改成char
typedef struct {
ElemType data[MaxSize];
int length; //表中存放的元素个数
}SqList;
第二步:顺序表的创建与初始化:
我随机放入了三个数据。
int main()
{
SqList L; //创建顺序表L
/*确定元素个数和长度*/
L.data[0] = 1;
L.data[1] = 2;
L.data[2] = 3;
L.length = 3;
return 0;
}
第三步:编写插入操作的函数:
插入操作的理解:需要移动的数据元素从第i个开始到最后一个数据,都要向后移动一位;最后一个位置的数据对应的下标是[length-1],移动到length的位置;倒数第二个数据移动到[length-1]的位置......第i个数据对应的下标是[i-1],这个数据移动到后一个位置,即[i];变量j是对应数据的下标,将[j-1]位置赋给[j],就完成了一次移动;一直到[i-1]的值赋给[i],i-1是下标,对应的就是第i个位置,此时第i个位置刚好空出来,然后将我们要插入的值插入进去。不能理解的话可以自己画画图,最后一点要注意的是要避免越界情况的存在。
函数编写的详细过程在以下代码块中,因为是bool类型,在主函数中我们用一个bool类型的变量接收结果,再使用if判断是否插入成功。
bool ListInsert(SqList &L,int i,ElemType e)
{
/*i的插入范围只能在第一个元素的位置和最后一个元素的后面*/
if (i<1 || i>L.length+1) {
return false;
}
/*length的长度刚好是MaxSize的时候则不能再插入数据*/
if (L.length >= MaxSize) {
return false;
}
/*第i个数据的之后的每个数据都要向后移动*/
for (int j = L.length; j >= i; j--) {
L.data[j] = L.data[j - 1];
}
/*插入数据*/
L.data[i - 1] = e;
/*修改length长度*/
L.length++;
return true;
}
第四步:编写打印函数
void Print_List(SqList &L)
{
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
}
第五步:编写删除函数
有了插入函数理解的经验,删除函数比插入函数更容易理解,前面依然是判断删除的数据是否合理,这个数据i只能是删除第一个位置或者是最后一个位置,i的范围就是1~length;
删除了第i个位置(也就是下标是[i-1]的位置)的元素之后,将下标是[i]的元素赋到这个位置:L.data[j - 1] = L.data[j];所以初始值就是i,终值就是最后一个元素的位置length处(下标是[length-1])
bool ListDelete(SqList& L, int i)
{
//判断i是否合法
if (i<1 || i>L.length) {
return false;
}
//移动
for (int j = i; j < L.length; j++) {
L.data[j - 1] = L.data[j];
}
L.length--;
return true;
}
第六步:编写查找函数
这个就是普通的遍历然后判断是否相等,很简单
int ListSearch(SqList& L, ElemType i)
{
for (int j = 0; j < L.length; j++) {
if (L.data[j] == i) {
return j;
}
}
return -1;
}
总代码在下面:
#include<stdio.h>
#include<stdlib.h>
/*第一步:定义结构体*/
#define MaxSize 50
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int length;
}SqList;
/*第四步:编写插入函数*/
bool ListInsert(SqList &L, int i, ElemType e)
{
//不合理数据
if (i<1 || i>L.length+1) {
return false;
}
//插入就会超出空间
if (L.length >= MaxSize) {
return false;
}
//移动
for (int j = L.length; j >= i; j--) {
L.data[j] = L.data[j - 1];
}
//插入
L.data[i - 1] = e;
L.length++;
return true;
}
/*第七步:编写删除函数*/
bool ListDelete(SqList& L, int i)
{
//判断i是否合法
if (i<1 || i>L.length) {
return false;
}
//移动
for (int j = i; j < L.length; j++) {
L.data[j - 1] = L.data[j];
}
L.length--;
return true;
}
/*第九步:编写查找函数*/
int ListSearch(SqList& L, ElemType i)
{
for (int j = 0; j < L.length; j++) {
if (L.data[j] == i) {
return j;
}
}
return -1;
}
/*第五步:编写打印函数*/
void Print_List(SqList &L)
{
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
}
int main()
{
/*第二步:结构体的创建和初始化*/
SqList L;
L.data[0] = 1;
L.data[1] = 2;
L.data[2] = 3;
L.length = 3;
//Print_List(L);
/*第三步:插入操作*/
bool ret = ListInsert(L, 2, 60);
if (ret) {
printf("插入成功\n");
Print_List(L); //1 60 2 3
}
else {
printf("插入失败\n");
}
/*第六步:删除操作*/
bool del = ListDelete(L, 2);
if (del) {
printf("删除成功\n");
Print_List(L);//1 2 3
}
else {
printf("删除失败\n");
}
/*第八步:查找操作*/
int sear = ListSearch(L, 1);
if (sear!=-1) {
printf("找到了,数据下标是%d\n",sear);
}
else {
printf("没找到\n");
}
return 0;
}