【顺序表与链表】

【顺序表与链表】

顺序表

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;
	}
}

【注意】定义一个结构体不会分配空间,定义结构体变量才会分配空间。如果定义一个结构体指针,只会给指针分配空间,需要通过指针来为结构体手动分配空间。因此如果只定义了结构体指针,需要手动分配空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百栗.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值