(二)C语言中阶--线性表

本文介绍了线性表的顺序表示,包括顺序表的定义、特点和优缺点。重点讲解了如何在顺序表中进行插入、删除和查找操作,提供了相应的C语言实现代码。插入和删除操作涉及到元素的移动,查找操作则按值返回元素位置。顺序表在存储密度高和随机存取方面有优势,但插入和删除效率较低。
1. 线性表(逻辑结构)

线性表定义: 由n(n≥0)个相同类型的元素组成的有序集合。
L=(a1,a2,a3,...,ai-1,ai,ai+1,...,an)

  • 元素个数n,当n=0时称为空表
  • a1是唯一的“第一个”,an是唯一的“最后一个”。ai-1是ai的前驱,ai+1是ai的后继。
    特点:
  • 表中元素[个数有限]
  • 表中元素的[数据类型相同] (每一个元素占用相同大小空间)
  • 表中元素具有逻辑上的[顺序性],在序列中个元素排序有其先后顺序
2. 线性表顺序表示(顺序表)

逻辑上相邻的两个元素物理上也相邻。

#define MaxSize 50   // 定义线性长度
typedef int ElemType;
typedef struct {
	ElemType data[MaxSize];  // 顺序表的元素
	int len; // 顺序表当前长度
}

【注】起别名是结构体名可以省略。

优点可以随机存取(根据表头元素地址和元素序号)表中的任意一个元素存储密度高,每个节点只存处数据元素
缺点插入和删除操作需要移动大量元素。线性表变化较大时,难以确定存储空间容量存储分配需要一整段连续的存储空间,不够灵活
插入操作

步骤:
1、判断插入的位置i是否合法 1≤i≤len+1
2、判断存储空间是否已满(即x插入后是否超出数组长度)
3、把第i个元素到最后一个元素依次后移一位
4、在空出位置插入新元素x
5、顺序表长度加1

#include <stdio.h>

typedef int ElemType;
// 静态分配
#define MaxSize 50
typedef struct {
	ElemType data[MaxSize];
	int length;
}SqList;

/**
* L顺序表
* i要插入的位置
* val要插入的值
*/
bool ListInsert(SqList &L, int i, ElemType val){
	// 2.1判断i的位置是否合法
	if(i<1||i>L.length+1){
		return false;
	}
	// 2.2判断存储空间是否已满
	if(L.length==MaxSize){
		return false;
	}
	// 2.3把第i个元素到最后一个元素依次后移一位 从最后一个开始算
	for(int j=L.length; j>=i; j--){
		L.data[j]=L.data[j-1];
	}
	L.data[i-1]=val;
	L.length++;
	return true;
}
void log(SqList L){
    for (int i = 0; i < L.length; i++) {
        printf("%3d", L.data[i]);
    }
    printf("\n");
}
int main(){
	// 1.1.定义顺序表名称
	SqList L;
	// 1.2.放置元素
	L.data[0]=1;
	L.data[1]=2;
	L.data[2]=3;
	L.length=3;
	// 2.执行插入元素
	bool ret = ListInsert(L, 2, 60);
	if(ret){
        printf("insert SqList success\n");
    }else{
        printf("insert SqList failed\n");
    }
	return 0;
}
删除操作

步骤:
1、要删除的元素赋值给e
2.
2.1 判断要删除的元素是否合法
2.2 保存要删除元素的值
2.3 将删除位置后的元素依次前移
3. 线性表长度减1

#include <stdio.h>
typedef int ElemType; // 让顺序表存储其他类型元素时, 可以快速修改代码
// 静态分配
#define MaxSize 50
// SqList结构体
typedef struct {
    ElemType data[MaxSize];
    int length; // 顺序表的长度
}SqList;
// 会改变结构体的内容, i是要删除的位置, 获取被删除的元素的值
bool ListDelete(SqList &L, int i, ElemType &del){
    // 2.1 判断要删除的元素是否合法
    if(i<1||i>L.length){
        return false;
    }
    del=L.data[i-1];
    for(int j=i-1; j<L.length; j++){
        L.data[j-1]=L.data[j];
    }
    L.length--;
    return true;
}
int main(){
    // 定义顺序表名称;
    SqList L; // 这是一个结构体
    // 放置元素
    L.data[0]=1;
    L.data[1]=2;
    L.data[2]=3;
    L.length=3;
    // 1.要删除的元素赋值给del
    ElemType del;
    // 调用删除函数
    bool ret=ListDelete(L, 1, del);
    if(ret){
        printf("delete SqList success\n");
    }else{
        printf("delete SqList failed\n");
    }
    log(L);
    return 0;
}
查找操作

步骤
1、按值查找 返回元素位置
2、没找到返回0, 找到返回顺序表下标
3、循环结束没有找到返回0, 不考虑是否存在多个,如果存在多个只返回第一个

#include <stdio.h>
typedef int ElemType; // 让顺序表存储其他类型元素时, 可以快速修改代码
// 静态分配
#define MaxSize 50
// SqList结构体
typedef struct {
    ElemType data[MaxSize];
    int length; // 顺序表的长度
}SqList;
// 没找到返回0, 找到返回顺序表下标
int LocateElem(SqList L, ElemType element){
    for(int i=0; i<L.length; i++){
        if(i==element){
            return i+1;
        }
    }
    return 0; // 循环结束没有找到, 不考虑是否存在多个,如果存在多个只返回第一个
}
int main(){
    // 定义顺序表名称;
    SqList L; // 这是一个结构体
    // 放置元素
    L.data[0]=1;
    L.data[1]=2;
    L.data[2]=3;
    L.length=3;
    // 按值查找 返回元素位置
    int pos=LocateElem(L, 60);
    if(pos){
        printf("find this element success in %d\n", pos);
    }else{
        printf("don't find this element\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Y_努力_strive

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

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

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

打赏作者

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

抵扣说明:

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

余额充值