1.线性表的定义
存在唯一的一个被称为"第一个"的数据元素;存在唯一的一个被称为"最后一个"的数据元素;除第一个之外,集合中的每一个数据元素都只有一个前驱;除最后一个之外,集合中的每一个数据元素都只有一个后继。
线性表是最简单最常用的一种线性表。线性表分为顺序表和链表。顺序表又分为定长顺序表和不定长顺序表。
2. 线性表的顺序表,顺序表的设计思想
加入length和左端连续
typedef struct SQList
{
int elem[10];
int length;
} SQList, * PSQList;
头文件sqlist.h文件
cs
#pragma once
//防止头文件重复编译
//定长顺序表
//定义与声明
typedef struct SQList
{
int elem[10];
int length;
} SQList, * PSQList;
结构示意图

length表示前length个数据是有效的
int i = ps->length-1;//(存在边界问题)
在某号位置插入某个数据,即将ps->elem[i+1]=ps->elem[i];
cs
实现
#include "sqlist.h"
#include <assert.h>
#include <stdio.h>
//定长顺序表的实现
//初始化(自己定义的结构体,名字叫ps)
//ps是结构体,访问结构体里面的用指向符 ->
void InitSqlist(PSQList ps)
{
assert(ps != NULL);//判断参数,ps是外面传进来的,有可能为空
if (ps == NULL)
return;
ps->length = 0;
}
static bool IsFul(PSQList ps)
{
return ps->length == 10;
}
//插入数据,在ps顺序表的pos位置插入val;
bool Insert(PSQList ps, int pos, int val)
{
assert(ps != NULL);
if (ps == NULL)
return false;
if (pos<0 || pos>ps->length||IsFul(ps))
{
return false;
}
//把数据移动到后面
for (int i=ps->length-1;i>=pos;i--)
{
ps->elem[i + 1] = ps->elem[i];
}
//插入数据
ps->elem[pos] = val;
//有效数据的个数++;
ps->length++;
return true;
}
输出函数
cs
//输出
void Show(PSQList ps)
{
assert(ps != NULL);
if (ps == NULL)
return;
for (int i = 0; i > ps->length; i++)
{
printf("%d", ps->elem[i]);
}
printf("\n");
}
以上就是核心代码
接下来实现对定长顺序表的一些操作
①在ps中查找第一个key值,找到返回下标,没有找到返回-1;
cs
//判空
bool IsEmpty(PSQList ps)
{
return ps->length == 0;
}
//在ps中查找第一个key值,找到返回下标,没有找到返回-1;
int Search(PSQList ps, int key)
{
for (int i = 0; i < ps->length; i++)
{
if (key == ps->elem[i])
{
return i;
}
}
return -1;
}
②删除pos位置的值
cs
//删除pos位置的值
bool DelPos(PSQList ps, int pos)
{
assert(ps != NULL);
if (ps == NULL)
return false;
if (pos < 0 || pos >= ps->length)//如果是空表pos也满足大于0
{
return false;
}
//把数据前移
for (int i = pos; i < ps->length - 1; i++)
{
ps->elem[i] = ps->elem[i + 1];
}
//有效数据个数--
ps->length--;
return true;
}
③删除第一个val的值
cs
//删除第一个val的值
bool DelVal(PSQList ps, int val)
{
assert(ps != NULL);
if (ps == NULL)
return false;
int i = Search(ps, val);//i是下标
//调用参数如果有返回值,将返回值进行判断,这是一个好习惯
if (i < 0)
{
return false;
}
return DelPos(ps, i);
}
④//返回key的前驱下标,如果不存在返回-1
cs
//返回key的前驱下标,如果不存在返回-1;
int GetPrio(PSQList ps, int key)
{
int i = Search(ps, key);
if (i <= 0)//注意:头没有前驱
{
return -1;
}
return i - 1;
}
⑤返回key的后继下标,如果不存在返回-1
cs
int GetNext(PSQList ps, int key)
{
int i = Search(ps, key);
if (i < 0 || i == ps->length - 1)//注意:尾没有后继
{
return -1;
}
return i + 1;
}
⑥清空数据
cs
//清空数据
void Clear(PSQList ps)
{
ps->length = 0;
}
⑦销毁整个内存
cs
//销毁整个内存.动态内存,没有用malloc,直接用clear清空即可
void Destroy(PSQList ps)
{
Clear(ps);
}
整体代码:
cs
实现
#include "sqlist.h"
#include <assert.h>
#include <stdio.h>
//定长顺序表的实现
//初始化(自己定义的结构体,名字叫ps)
//ps是结构体,访问结构体里面的用指向符 ->
void InitSqlist(PSQList ps)
{
assert(ps != NULL);//判断参数,ps是外面传进来的,有可能为空
if (ps == NULL)
return;
ps->length = 0;
}
static bool IsFul(PSQList ps)
{
return ps->length == 10;
}
//插入数据,在ps顺序表的pos位置插入val;
bool Insert(PSQList ps, int pos, int val)
{
assert(ps != NULL);
if (ps == NULL)
return false;
if (pos<0 || pos>ps->length||IsFul(ps))
{
return false;
}
//把数据移动到后面
for (int i=ps->length-1;i>=pos;i--)
{
ps->elem[i + 1] = ps->elem[i];
}
//插入数据
ps->elem[pos] = val;
//有效数据的个数++;
ps->length++;
return true;
}
//判空
bool IsEmpty(PSQList ps)
{
return ps->length == 0;
}
//在ps中查找第一个key值,找到返回下标,没有找到返回-1;
int Search(PSQList ps, int key)
{
for (int i = 0; i < ps->length; i++)
{
if (key == ps->elem[i])
{
return i;
}
}
return -1;
}
//删除pos位置的值
bool DelPos(PSQList ps, int pos)
{
assert(ps != NULL);
if (ps == NULL)
return false;
if (pos < 0 || pos >= ps->length)//如果是空表pos也满足大于0
{
return false;
}
//把数据前移
for (int i = pos; i < ps->length - 1; i++)
{
ps->elem[i] = ps->elem[i + 1];
}
//有效数据个数--
ps->length--;
return true;
}
//删除第一个val的值
bool DelVal(PSQList ps, int val)
{
assert(ps != NULL);
if (ps == NULL)
return false;
int i = Search(ps, val);//i是下标
//调用参数如果有返回值,将返回值进行判断,这是一个好习惯
if (i < 0)
{
return false;
}
return DelPos(ps, i);
}
//返回key的前驱下标,如果不存在返回-1;
int GetPrio(PSQList ps, int key)
{
int i = Search(ps, key);
if (i <= 0)//注意:头没有前驱
{
return -1;
}
return i - 1;
}
//返回key的后继下标,如果不存在返回-1;
int GetNext(PSQList ps, int key)
{
int i = Search(ps, key);
if (i < 0 || i == ps->length - 1)//注意:尾没有后继
{
return -1;
}
return i + 1;
}
//输出
void Show(PSQList ps)
{
assert(ps != NULL);
if (ps == NULL)
return;
for (int i = 0; i > ps->length; i++)
{
printf("%d", ps->elem[i]);
}
printf("\n");
}
//清空数据
void Clear(PSQList ps)
{
ps->length = 0;
}
//销毁整个内存.动态内存,没有用malloc,直接用clear清空即可
void Destroy(PSQList ps)
{
Clear(ps);
}