一、删除链表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;
}