【顺序表与链表】
顺序表
1.实现
/*顺序表的实现*/
typedef struct LNode *List;
struct LNode {
ElementType Data[MaxSize];
int Last; // 指向最后一个元素的位置下标
};
List PtrL;
2.建立空的顺序表
/*建立空顺序表*/
List BuildList()
{
List PtrL;
PtrL = (List)malloc(sizeof(struct LNode));
PtrL -> Last = -1;
return PtrL;
}
3.查找元素
/*查找元素*/
int Find(ElementType e,List PtrL)
{
int i = 0;
while(i <= PtrL -> Last && e != PtrL -> Data[i])
i ++;
if(i > PtrL -> Last)
return -1; // 没找到返回-1
else
return i; // 返回待查找元素的下标
}
4.插入元素
/*插入元素*/
void Insert(ElementType e,int i,List PtrL) // 插入元素到第i个位置
{
int j;
if(PtrL -> Last == MaxSize -1) // 判断表是否已满
return;
if(i < 1 || i > PtrL -> Last + 2) // 判断插入位置是否合法(如果表中有n个元素,插入位置只能是 1 到 n + 1 之间)
return;
for(j = PtrL -> Last;j >= i - 1;j --)
PtrL -> Data[j + 1] = PtrL -> Data[j];
PtrL -> Data[i - 1] = e;
PtrL -> Last ++;
}
5.删除元素
/*删除元素*/
void Delete(int i,List PtrL) // 删除第i个位置的元素
{
int j;
if(i < 1 || i > PtrL -> Last + 1) // 检查插入位置的合法性
return;
for(j = i;j <= PtrL -> Last;j ++)
PtrL -> Data[j - 1] = PtrL -> Data[j];
PtrL -> Last --;
}
链表
1.实现
/*链表的实现*/
typedef struct LNode *List;
struct LNode {
ElementType Data;
List Next;
};
List PtrL;
2.建立空链表
// 建立空链表(只有一个头空结点的链表)
List BuildList()
{
List PtrL;
PtrL = (List)malloc(sizeof(struct SNode));
PtrL -> Next = NULL;
return PtrL;
}
3.表长
/*求表长*/
int Length(List PtrL) // 假设不带头结点
{
int length = 0;
List pL = PtrL;
while(pL) {
pL = pL -> Next;
length ++;
}
return length;
}
4.按序号查找
/*按序号查找*/
List FindK(int k,List PtrL) // 假设不带头结点(查找第k个结点)
{
List pL = PtrL;
int i = 1;
while(pL != NULL && i < k) {
pL = pL -> Next;
i ++;
}
if(i == k) // 找到了
return pL;
else
return NULL;
}
5.按值查找
/*按值查找*/
List FindV(ElementType e,List PtrL) // 假设不带头结点
{
List pL = PtrL;
while(pL != NULL && pL -> Data != e) {
pL = pL -> Next;
}
return pL; // 没找到就是NULL,找到就是对应结点
}
6.插入操作
/*插入操作*/
List Insert(int i,ElementType e,List PtrL) // 假设不带头结点(插入到第i个位置)
{
List pL,s;
if(i == 1) { // 如果要插到第一个位置
s = (List)malloc(sizeof(struct LNode));
s -> Data = e;
s -> Next = PtrL;
return s;
}
pL = FindK(i - 1,PtrL); // 查找i - 1位置的结点
if(pL == NULL)
return; // i - 1位置的结点不存在,不能插入
else {
s = (list)malloc(sizeof(struct LNode));
s -> Data = e;
s -> Next = pL -> Next;
pL -> Next = s;
return PtrL;
}
}
7.删除操作
/*删除操作*/
List Delete(int i,List PtrL) // 假设不带头结点(删除第i个结点)
{
List pL,s;
if(i == 1) { // 如果要删除第一个结点
s = PtrL; // s指向第一个结点
if(s != NULL)
Ptr = Ptr -> next
else
return NULL;
free(s);
return Ptr;
}
pL = FindK(i - 1,PtrL); // 查找 i - 1位置的结点
if(pL == NULL)
return NULL; // i - 1位置的结点不存在
else if(pL -> Next == NULL)
return NULL; // i位置的结点不存在
else {
s = pL -> Next;
pL -> Next = s -> Next;
free(s);
return PtrL;
}
}
【注意】定义一个结构体不会分配空间,定义结构体变量才会分配空间。如果定义一个结构体指针,只会给指针分配空间,需要通过指针来为结构体手动分配空间。因此如果只定义了结构体指针,需要手动分配空间。