线性表
@[.DataStructure]
文章目录
抽象
操作集
操作集合 | 解释 |
---|---|
List MakeEmpty() | 初始化一个空线性表 |
FindKth(List L, int i) | 根据指定的位序i,返回L中对应元素 a i a_i ai |
Position Find(List L, ElementType X) | 已知X,返回线性表L中与X相同的第一个元素位置;若不存在则返回 f a l s e false false |
bool Insert(List L, ElementType X, int i) | 在L的指定位序i前插入一个新元素X;成功则返回 t r u e true true,否则返回 f a l s e false false |
bool Delete(List L, int i) | 从L中删除指定位序i的元素;成功则返回 t r u e true true,否则返回 f a l s e false false |
bool Length(List L) | 返回线性表L的长度 |
1. 线性表的顺序存储实现
1.1 初始化
List MakeEmpty()
{
List L;
L = (List)malloc(sizeof(struct LNode));
L->Last = -1;
return L;
}
1.2 Find
#define ERROR -1
Position Find(List L, ElementType X)
{
Position i = 0;
while (i <= L->Last && L->Data[i] != X)
i++;
if (i > L->Last) return ERROR;
else return i;
}
1.3 Insert
bool Insert(List L, ElementType X, int i)
{
Position j;
if (L->Last == MAXSIZE - 1) {
// 表空间已满,不能插入
//printf("表满");
return false;
}
if (i<1 || i>L->Last + 2)
{
//printf("The Location is illegal");
return false;
}
for ( j = L->Last; j >= i-1; j--)
{
L->Data[j + 1] = L->Data[j];
}
L->Data[i - 1] = X;
L->Last++;
return true;
}
1.4 Delete
bool Delete(List L, int i)
{
Position j;
if (i<i || i>L->Last + 1)//检测空表及删除位序的合法性
{
//printf("位序%d不存在元素", j);
return false;
}
for ( j = i; j <= L->Last; j++)
{
L->Data[j - 1] = L->Data[j];
}
L->Last--;
return true;
}
1.5 调试结果
int main()
{
List L;
L = MakeEmpty();
for (size_t i = 1; i < 10; i++)
{
Insert(L, i, i);
}
int x = Find(L, 7);
Delete(L, x+1);
return 0;
}
过程一,初始化L,且向L中插入1-9,并且找到7所在的位置返回到x
删除刚查找到的7
2. 线性表的链式存储实现
#define ElementType int
#define MAXSIZE 100
#include<iostream>
#include<cstdio>
using namespace std;
typedef struct LNode * PtrToLNode;
struct LNode
{
ElementType Data;
PtrToLNode Next;
};
typedef PtrToLNode List;
typedef PtrToLNode Position;//这里的位置是节点的地址
int Length(List L)
{
Position p;
int cnt = 0;//初始化计数器 init the counters
p = L; // p指向表的第一个节点
while (p)
{
p = p->Next;
cnt++;
}
return cnt;
}
List MakeEmpty()
{
List L;
L = (List)malloc(sizeof(struct LNode));
L->Next = NULL;
return L;
}
#define ERROR -1
ElementType FindKth(List L, int K)
{
Position p;
int cnt = 1;
p = L;// Point the head of the List
while (p && cnt < K)
{
p = p->Next;
cnt++;
}
if (cnt == K && p) {
return p->Data;
}
else
return ERROR;
}
#define ERROR1 NULL
Position Find(List L, ElementType X)
{
Position p;// p指向L的第一个节点
p = L;
while (p && p->Data!=X)
{
p = p->Next;
}
if (p)
return p;
else
return ERROR1;
}
bool Insert(List L, ElementType X, int i)
{
//这里默认L有空头结点
Position tmp, pre;
//查找位序为i-1的节点是否存在
int cnt = 0;
pre = L;
while (pre && cnt < i - 1)
{
pre = pre->Next;
cnt++;
}
if (pre == NULL || cnt != i-1)//是否只需要pre == NULL这个条件就足够了
{
cout << "the location is illegal" << endl;
return false;
}
else
{
tmp = (Position)malloc(sizeof(struct LNode));
tmp->Data = X;
//插入新节点,并且返回表头L
tmp->Next = pre->Next;
pre->Next = tmp;
return true;
}
}
bool Delete(List L, int i)
{
// 这里默认L有空头结点
Position tmp, pre;
int cnt = 0;
//查找位序为i-1的节点
pre = L;
while (pre&&cnt<i-1)
{
pre = pre->Next;
cnt++;
}
if (pre == NULL || cnt!=i-1 || pre->Next==NULL)//cnt!=i-1的作用在于如果 i<1时,输出位置非法
{
cout << "The position is illeagal" << endl;
return false;
}
else {
tmp = pre->Next;
pre->Next = tmp->Next;
free(tmp);
return true;
}
}
int main()
{
List L = MakeEmpty();
for (size_t i = 1; i < 5; i++)
{
Insert(L, i, i);
}
Position x = Find(L, 3);
Delete(L,5);
return 0;
}
调试结果
3.广义表与多重链表
4. 堆栈
5.队列
数据结构动图资源
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html