1. 顺序表
#include <cstdio>
typedef struct LNode *List;
struct LNode
{
ElementType Data[MAXSIZE];
int Last;
};
struct LNode L;
List PtrL;
// 1. 初始化(建立空的顺序表)
List MakeEmpty()
{
List PtrL;
PtrL = (List )malloc(sizoef(struct LNode) );
PtrL->Last = -1;
return PtrL;
}
// 2. 查找
int Find(ElementType X, List PtrL)
{
int i = 0;
while( i <= PtrL->Last && PtrL->Data[i] != X)
i ++;
if(i > PtrL->Last) return -1; // 如果没有找到, 返回-1
else return i; // 找到后返回的是存储位置
}
// 3. 插入(第i(1<=i<=n+1)个位置上插入一个值为X的新元素)
void Insert(ElementType X, int i, List PtrL)
{
int j;
if(PtrL->Last == MAXSIZE - 1) // 表空间已满, 不能插入
{
printf(" 表满 \n");
return ;
}
if(i < 1 || i > PtrL->Last + 2) // 检查插入位置的合法性
{
printf(" 位置不合法 \n");
return ;
}
for(j = PtrL->Last; j >= i - 1; -- j)
{
PtrL->Data[j + 1] = PtrL->Data[j]; // 将ai到an倒序向后移动
}
PtrL->Data[i - 1] = X; // 新元素插入
PtrL->Last ++; // last仍指向最后元素
return ;
}
// 4. 删除 (删除表第i(1<=i<=n)个位置上的元素)
void Delete(int i, List PtrL)
{
int j;
if(i < 1 || i > PtrL->Last + 1) // 检查空表及删除位置的合法性
{
printf("不存在第%d个元素\n", i);
return ;
}
for(j = i; j <= PtrL->Last; ++ j)
{
PtrL->Data[j - 1] = PtrL->Data[j]; // 将ai+1~an顺序向前移动
}
PtrL->Last --; // Last仍指向最后元素
return ;
}
2. 链表
#include <cstdio>
typedef struct LNode *List;
struct LNode
{
ElementType Data;
List Next;
};
struct Lnode L;
List PtrL;
// 1. 求表长
int Length(List PtrL)
{
List p = PtrL; // p指向表的第一个结点
int j = 0;
while( p )
{
p = p->Next;
j ++; // 当前p指向的是第j个结点
}
return j;
}
// 2. 查找
// (1) 按序号查找: FindKth;
List FindKth(int K, List PtrL)
{
List p = PtrL;
int i = 1;
while(p != NULL && i < K)
{
p = p->Next;
i ++;
}
if(i == K) return p; // 找到第K个, 返回指针
else return NULL; // 否则返回空
}
// (2) 按值查找: Find
List Find(ElementType X, List PtrL)
{
List p = PtrL;
while(p != NULL && p->Data != X)
{
p = p->Next;
}
return p;
}
// 3. 插入( 在第i-1(1<=i<=n+1)个结点后插入一个值为X的新结点)
List Insert(ElementType X, int i, List PtrL)
{
List p, s;
if(i == 1) // 新结点插入在表头
{
s = (List )malloc(sizeof(struct LNode)); // 申请 填装结点
s->Data = X;
s->Next = PtrL;
return s; // 返回新表头指针
}
p = Find(i - 1, PtrL); // 查找第i-1个结点
if(p == NULL) // 第i-1个不存在, 不能插入
{
printf(" 参数i错 \n");
return NULL;
}
else
{
s = (List )malloc(sizeof(struct LNode)); // 申请 填装结点
s->Data = X;
s->Next = p->Next; // 新结点插入在第i-1个结点的后面
p->Next = s;
return PtrL;
}
}
// 4. 删除
List Delete(int i, List PtrL)
{
List p, s;
if(i == 1) // 若要是删除的是表的第一个结点
{
s = PtrL; // s指向第一个结点
if(PtrL != NULL) PtrL = PtrL->Next; // 从链表中删除
else return NULL;
free(s); // 释放被删除结点
return PtrL;
}
p = FindKth(i - 1, PtrL); // 查找第i-1个结点
if(p == NULL)
{
printf("第%d个结点不存在", i - 1);
return NULL;
}
else if(p->Next == NULL)
{
printf("第%d个结点不存在", i);
return NULL;
}
else
{
s = p->Next; // s指向第i个结点
p->Next = s->Next; // 从链表中删除
free(s); // 释放被删除结点
return PtrL;
}
}