带头结点的单链表,数据元素是整数(3)

一、删除链表LL中第一个结点,返回值:0-位置不合法;1-成功。
int PopFront(LinkList LL);
 二、删除链表LL中最后一个结点,返回值:0-位置不合法;1-成功。
int PopBack(LinkList LL);
三、 求链表的长度,返回值:>=0-表LL结点的个数。
int  LengthList(LinkList LL);

四、判断链表是否为空,返回值:0-非空或失败,1-空。
int IsEmpty(LinkList LL);

 五、获取链表中第ii个结点,成功返回结点的地址,失败返回空。
注意,ii可以取值为0,表示头结点。
LNode* LocateNode(LinkList LL, unsigned int ii);
 六、查找元素ee在链表LL中的结点地址,如果没找到返回NULL,否则返回结点的地址。
LNode* LocateElem(LinkList LL, ElemType* ee);
七、 在指定结点pp之后插入元素ee,返回值:0-失败;1-成功。
int InsertNextNode(LNode* pp, ElemType* ee);
八、在指定结点pp之前插入元素ee,返回值:0-失败;1-成功。
int InsertPriorNode(LNode* pp, ElemType* ee);

删除链表LL中第一个结点,返回值:0-位置不合法;1-成功。 

//删除链表中的第一个结点,返回值:0-位置不合法,1-成功
int PopFront(LinkList LL)
{
	return DeleteNode(LL, 1);
}

  删除链表LL中最后一个结点,返回值:0-位置不合法;1-成功。

//删除链表中的最后一个结点,返回值:0-位置不合法,1-成功
int PopBack(LinkList LL)
{
	if (LL == NULL)
	{
		printf("链表LL不存在。\n");
		return 0;
	}
	//必须要加入这个判断,否则下面的循环pp->next->next不成立
	if (LL->next == NULL)
	{
		printf("链表LL为空,没有尾结点。\n");
		return 0;
	}
	//要删除最后一个结点,必须找到最后一个结点的前一个结点
	LNode* pp = LL;//从第0个结点开始
	//找到倒数第二个结点(包括头结点)
	while (pp->next->next != NULL)
		pp = pp->next;
	//释放最后一个结点
	free(pp->next);
	pp->next = NULL;
	return 1;

}

  求链表的长度,返回值:>=0-表LL结点的个数。

// 求链表的长度,返回值:>=0-表LL结点的个数。
int LengthList(LinkList LL)
{
	if (LL == NULL) { printf("链表LL不存在。\n"); return 0; } // 判断链表是否存在。
	LNode* pp = LL->next;  // 头结点不算,从第1个结点开始。
	int Length = 0;
	while (pp != NULL)
	{
		pp = pp->next;
		Length++;
	}

	// 不使用临时变量,如何计算链表(包括头结点)的长度?
	// if (LL==NULL) return 0;
	// return LengthList(LL->next)+1;
}

 判断链表是否为空,返回值:0-非空或失败,1-空。

int IsEmpty(LinkList LL)
{
	if (LL == NULL)
		return 0;
	if (LL->next == NULL)
		return 1;
	return 0;
}

获取链表中第ii个结点,成功返回结点的地址,失败返回空
ii可以取值为0,表示头结点 

LNode* LocateNode(LinkList LL, unsigned int ii)
{
	if (LL == NULL) { printf("链表LL不存在。\n"); return NULL; } // 判断表和元素是否存在。
	LNode* pp = LL;//指针pp指向头结点,逐步往后移动,如果为空,就表示后面没节点了
	int kk = 0;//kk指向的是第几个结点,从头结点0开始,pp每向后移动一次,kk就加1
	while ((pp != NULL) && (kk < ii))
	{
		pp = pp->next;
		kk++;
	}
	if (pp = NULL)
	{
		printf("位置(%d)不合法,超过了表长。\n", ii);
		return NULL;
	}
	return pp;
}

查找元素ee在链表中的结点地址,如果没找到返回NULL,否则返回既然点的地址 

LNode* LocateElem(LinkList LL, ElemType* ee)
{
	LNode* pp = LL->next;//从第1个数据结点开始
	while (pp != NULL)
	{
		if (pp->data == *ee)
			return pp;
		pp = pp->next;
	}
	return NULL;
}

在指定结点pp之后插入元素ee,返回值:0-失败;1-成功。 

int InserNext(LNode* pp, ElemType* ee)
{
	if (pp == NULL)
	{
		printf("结点pp不存在。\n");
		return 0;
	}
	LNode* tmp = (LNode*)malloc(sizeof(LNode));
	if (tmp == NULL)
		return 0;
	memcpy(&tmp->data, ee, sizeof(ElemType));
	tmp->next = pp->next;
	pp->next = tmp;
	return 1;
}

在指定结点pp之前插入元素ee,返回值:0-失败,1-成功 

int InserPriorNode(LNode* pp, ElemType* ee)
{
	if (pp == NULL) { printf("结点pp不存在。\n"); return 0; }

	// 在指定结点pp之前插入采用偷梁换柱的方法:
	// 1、分配一个新的结点;
	// 2、把pp结点的数据和指针复制到新结点中。
	// 3、把待插入元素的数据存入pp结点中。
	LNode* tmp = (LNode*)malloc(sizeof(LNode));
	tmp->next = pp->next;
	//把pp结点的数据和指针复制到tmp中
	memcpy(&tmp->data, &pp->data, sizeof(ElemType));
	tmp->next = pp->next;
	//把待插入的元素存入pp中
	memcpy(&tmp->data, &pp->data, sizeof(ElemType));
	return 1;
}

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值