c语言数据结构:线性表

1.什么是线性表?

线性表是最基本、最简单、也是最常用的一种数据结构。
线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的

它的逻辑结构:

在这里插入图片描述

它的:存储结构:
线性表的顺序存储结构——————顺序表
把线性表的所有元素按照逻辑顺序依次存储在
存储位置开始的一块连续的存储空间中

2.顺序表的基本运算:

建立线性表
判断线性表是否空表
线性表的长度
查找某个数据元素的值
插入数据元素
删除数据元素
输出数据元素

typedef struct {    //typedef这个就是把struct{} 当作SqList.
//SqList就是结构体
	ElemType data[MaxSize];
	int length;

}SqList;           //这个SqList 代替了struct{}.
//之后可以直接用 SqList定义变量
//,不是主函数和次函数都可以改变结构体的值 
void InitList(SqList*& L) //参数是:定义了结构体变量,初始化结构体
//存储空间和数据的值
{
	L = (SqList*)malloc(sizeof(SqList));  //存储空间,sizeof();  malloc
	L->length = 0;  // 使顺序表的长度为0,给data[MaxSize],添加元素,这个长度就加一
}

插入值:给结构体成员变量数组赋值:data

bool ListInsert(SqList* L, int i, ElemType e) //i是位置,e是数据元素
{
	int j;
	if (i<1 || i>L->length + 1 || L->length == MaxSize)
		return false;
	i--;          // 为啥i-1,i是顺序表位置, 
	//i--时, 就是,data中的数组元素位置
	//这里注意:第一个位置1时,赋值的data数组是data[0], .
	
	for (j = L->length; j > i; j--)  //j=0,j<i, 不会 
	
		L->data[j] = L->data[j - 1];// abcde :  i=3, l->length=5,j=5 ,这一步后移
		       
		  //使插入的i后面的data[i]都向后移一步 ,如果插入的位置后面有元素的话
		
	L->data[i] = e;  //赋值 
	L->length++;  //赋值后使长度加一 
	return true;



}
SqList * L;//主函数的结构体指针变量。,指针就可以指向结构体的值。(但是要指向结构体的地址才能指向结构体数据)

void CreateLise(SqList*& L, ElemType a[], int n)//这个
//SqList*& L这个的写法:这个L是指针,结构体指针需要找到结构体的地址,所以需要地址符&。引用,没有这个,指针指向不了结构体的数据的。
//

代码:

#include<stdio.h>
#include<malloc.h>
#define MaxSize 50    
typedef char ElemType;  //typedef :转换 
typedef struct {
	ElemType data[MaxSize];
	int length;

}SqList;           //全局变量 

void CreateLise(SqList*& L, ElemType a[], int n)
{
	L = (SqList*)malloc(sizeof(SqList));
	for (int i = 0; i < n; i++)
		L->data[i] = a[i];
	L->length = n;
}

void InitList(SqList*& L) //这里的L字母可以改变,T,y不影响数据,
//因为跟传入的指针有关
{
	L = (SqList*)malloc(sizeof(SqList));  //存储空间,sizeof();  malloc
	L->length = 0;
}

void DestroyList(SqList*& L)
{
	free(L);  //销毁
}

bool  ListEmpty(SqList* L)
{
	return(L->length == 0);
}

int ListLength(SqList* L)
{
	return(L->length);
}

void DispList(SqList* L)
{
	for (int i = 0; i < L->length; i++)
		printf("%c", L->data[i]);
	printf("\n");
}




bool GetElem(SqList* L, int i, ElemType& e)

{
	if (i<1 || i>L->length)
		return false;
		
		
	e = L->data[i - 1];
	return true;
}

int LocateElem(SqList* L, ElemType e)


{
	int i = 0;
	while (i < L->length&& L->data[i] != e)
		i++;  //i++
		
		
	if (i >= L->length)
		return 0;
	else
	
		return i + 1;  //i+1是位置 


}

bool ListInsert(SqList* L, int i, ElemType e)
{
	int j;
	if (i<1 || i>L->length + 1 || L->length == MaxSize)
		return false;
	i--;          //i-1
	for (j = L->length; j > i; j--)  //j=0,j<i, 不会 
	
		L->data[j] = L->data[j - 1];// abcde :  i=3, l->length=5,j=5
		         //  
		
	L->data[i] = e;  //赋值 
	L->length++;  //赋值后使长度加一 
	return true;



}


bool ListDelete(SqList*& L, int i, ElemType& e)
{
	int j;
	if (i<1 || i>L->length)
		return false;
	i--;
	e = L->data[i];
	for (j = i; j < L->length - 1; j++)
		L->data[j] = L->data[j + 1];
	L->length--;
	return true;
}

int main(){

SqList * L;
ElemType e;
int i;
char a[5];
for (i = 0; i < 5; i++)

	scanf("%c", &a[i]);              /改变值






printf("顺序表的基本运算如下:\n");
printf("(1)初始化顺序表L\n");

InitList(L);          //



printf("(2)依次插如a,b,c,d,e元素\n");
ListInsert(L, 1, a[0]);                           //qsdte
ListInsert(L, 2, a[1]);
ListInsert(L, 3, a[2]);
ListInsert(L, 4, a[3]);
ListInsert(L, 5, a[4]);
printf("(3)输出顺序表L:"); 

DispList(L);          //输出元素
 
printf("(4)顺序表L长度:%d\n", ListLength(L));



printf("(5)顺序表L为%s\n", (ListEmpty(L) ? "空" : "非空"));


GetElem(L, 3, e);   


printf("(6)顺序表L的第3个元素:%c\n", e);


printf("(7)元素a的位置:%d\n", LocateElem(L, 'a'));

printf("(8)在第4个位置上插入f元素\n");

ListInsert(L, 4, 'f');   //

 
printf("(9)输出顺序表L:"); DispList(L);




printf("(10)删除L的第3个元素\n");

ListDelete(L, 3, e);
printf("(11)输出顺序表L:"); DispList(L);
printf("(12)释放顺序表L\n");
DestroyList(L);
return 1;



 }


效果图:
在这里插入图片描述

总结:

1.分配存储空间:malloc
2.删除一个元素,这个元素的后面往前面移动一步
3.插入一个元素,这个元素后面往后面移动一步
4.所有的次函数都是对全局:结构体的数据修改和引用数据
5.查找元素的位置,就是返回这个元素对应的data[i]元素,
i+1就是元素的位置

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半浮名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值