线性表的线性存储结构及其基本操作(创建、初始化、插入、删除、查找、遍历) c语言 数据结构 简单易懂 超详细~~

/本程序中半酣对线性表的创建、初始化、插入、删除、查找、遍历等基本常用操作/
#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
typedef int ElemType;
typedef struct sqlist
{
ElemType data[maxsize];
int length;
}sqlist;
//创建空的顺序表
sqlist* create()
{
sqlist* L = (sqlist*)malloc(sizeof(sqlist));
if (!L)
{
printf(“分配内存空间失败”);
return 0;
}
L->length = 0;
return L;
}
//初始化顺序表
void initsqlist(sqlist L,int n)
{
int i = 0;
ElemType elem;
for (i = 0; i < n; i++)
{
printf(“请输入第%d个数据”, i + 1);
scanf_s("%d", &elem);
L->data[i] = elem;
L->length++;
}
}
//插入数据
void insert(sqlist
L, ElemType x, int i)
{
//在第i个位置插入数据元素x
//先判断插入的位置合不合理
if (i<0 || i>L->length || L->length >= maxsize)
{
/1.至少是在i等于1的位置进行插入的
2.如果i>L->length,那么插入不成功的原因是:当1=<i<=L->length时,插入的位置都是合理的,因为当i等于L->length时,刚好是在线性表的表尾部分插入,是合理的,但是i不能大于L->length
3.由于该线性表是数组实现的,而数组是实现就分配好内存空间的,一旦超出了数组的可以容纳的下标,内存就会溢出,所以当L->length>=maxsize的时候也是插入失败的
/
printf(“插入位置不合理”);
return;
}
int j = 0;
for (j = L->length - 1; j >= i; j–)
{/for循环内部的意思是::
从数组最后一个元素开始,到数组下标为i为结束条件,将这些元素全部都往后移动一位,目的是为了给那个插入的数据提供位置
/
L->data[j + 1] = L->data[j];
}
L->data[i-1] = x;
/L->data[i-1] = x这一部分的数组的下表为什么是i-1,因为我们想要在i这个位置上插入一个数据元素,但是i这个位置上对应的数组的下标为i-1,意思是在数组i-1的位置上插入一个元素/
/注意如果我们不从后往前移动的话,数据之间就会发生覆盖,直接从i+1这个位置向后移动是一种错误的做法/

L->length++;
/*注意插入元素之后,线性表的长度要加1*/

}

//删除数据
void deletesqlist(sqlist* L, int i)
{
//删除位置为i的数据元素
//先判断删除位置是否合理
if (i < 0 || i >= L->length || L->length == 0)
{/1. 由于线性表的位置是从1开始的,那么我们从0开始删除数据肯定是不对的。
2.当i 等于 L->length ,已经到了线性表的最后一个元素的下一个位置了,删除元素也是不对的
3.当线性表是空表的时候,即线性表内一个元素也没有,也不能删除元素
/
printf(“删除位置不对\n”);
return;
}
int j;
for (j = i; j <= L->length - 1; j++)
{/for循环内部的核心思想就是:
将i这个位置的元素到线性表的最后一个元素都往前移动一个位置
/
L->data[j - 1] = L->data[j];
/注意只能从前往后移动,因为如果从线性表的最后一个元素开始移动的话,必然也会发生元素的覆盖,是错误的/
}
L->length–;
/注意在删除元素之后一一定要将线性表的长度-1/
}
//查找数据
void searchsqlist(sqlist* L, ElemType x)
{
//查找数据元素为x的数据元素
int i;
for (i = 0; i <= L->length - 1 && L->data[i] != x; i++);
/这句for循环的意思是在线性表中如果查找到值为x的,那么就结束循环。
很显然,如果我们在该线性表内找到了与x值相等的数据元素的话,那么(i <= L->length - 1的;
如果一直到线性表的末尾都没有找到,此时 ,i 已经等于L->length ,即 i> L->length - 1,我们可以通过i的值就可以判断出是否在线性表内找到相应元素
/
if (i <= L->length - 1)
{
printf(“找到了,数据元素为%d”, L->data[i]);
}
else
{
printf(“没有找到”);
}
}
//打印顺序表的数据
void print(sqlist* L)
{
/打印线性表的元素,就相当于线性表进行一次遍历/
int i = 0;
for (; i < L->length - 1; i++)
{
printf(“第%d个数据为%d\n”, i + 1, L->data[i]);
}
}
void test01()
{
int n;
sqlist* L = create();
printf(“请输入你想创建的顺序表的个数\n”);
scanf_s("%d", &n);
initsqlist(L,n);
print(L);
deletesqlist(L, 4);
print(L);
insert(L, 8, 3);
print(L);
searchsqlist(L, 3);
printf("\n");
print(L);
}
int main(void)
{
test01();
system(“pause”);//该语句的作用是将程序停留在一个黑色的窗口,不然控制台会一闪而过,看不到执行的效果,但是需要包含头文件#include<stdlib.h> */
return 0;
}

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值