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

被折叠的 条评论
为什么被折叠?



