1. 完成尾删函数:int list_delete_tail(Linklist *L);
通过while循环遍历到最后一个节点的前驱节点,通过free()函数释放该节点,并指向NULL,最后要将头节点中的len减1;
//尾删
int list_delete_tail(linkList* L)
{
//逻辑判断
if(NULL==L||list_empty(L))
{
printf("尾删失败!\n");
return -1;
}
//遍历到最后一个节点的前驱结点
linkList* p = L;
while(p->next->next != NULL)
{
p=p->next;
}
//删除逻辑
free(p->next);
p->next=NULL;
//表的变化
L->len--;
printf("尾删除成功!\n");
return 0;
}
2. 完成按位置修改函数 : int list_update_pos(Linklist *L, int pos, datatype e);
先判断链表是否合法、位置是否合法;通过调用node_find(linkList* L,int pos)函数返回该位置的节点,直接修改该节点的数据域即可;
//按位置修改
int list_update_pos(linkList* L,int pos,datatype e)
{
//判断逻辑
if(NULL==L || pos<1 || pos>L->len)
{
printf("按位置修改失败!\n");
return -1;
}
//直接修改
linkList* p = node_find(L,pos);
p->data=e;
printf("按位置修改成功!\n");
return 0;
}
3. 完成按值修改函数: int list__update_value(Linklist *L, datatype old_e, datatype new_e);
调用list_search_value(linkList* L,datatype e)函数通过按值查找返回该值所在的位置,再调用node_find(linkList* L,int pos)函数按位置查找返回节点,最后直接修改该节点的数据域即可;
//按值修改
int list_update_value(linkList* L,datatype old_e,datatype new_e)
{
//判断逻辑
if(NULL == L||list_empty(L))
{
printf("按值修改失败!\n");
return -1;
}
//修改
int index = list_search_value(L,old_e);
if(index<=0)
{
printf("该值不存在!\n");
return -2;
}
linkList* p = node_find(L,index);
p->data = new_e;
printf("按值修改成功!\n");
return 0;
}
4. 完成链表反转函数:void list_reverse(Linklist *L);
链表的反转即链表中各个数据域的数据的反转,通过for循环,调用node_find(linkList* L,int pos)函数返回需要交换数据的两个节点,一个从最后一个位置往前同时另一个从第一个位置往后返回各自的节点,再通过三杯水原则进行交换数据即可完成反转;
//链表反转函数
void list_reverse(linkList* L)
{
//逻辑判断
if(NULL == L||list_empty(L))
{
printf("反转失败!\n");
}
//三杯水交换原则
for(int i=L->len;i>L->len/2;i--)
{
datatype temp;
linkList* p = node_find(L,i);
linkList* q = node_find(L,L->len+1-i);
temp = p->data;p->data=q->data;q->data=temp;
}
printf("反转成功!\n");
}
5. 主函数
#include <stdio.h>
#include <stdlib.h>
#include "linklist.h"
int main(int argc, const char *argv[])
{
//创建头节点
linkList* L=list_create();
if(NULL == L)
{
return -1;
}
//调用头插函数
list_insert_head(L,'H');list_insert_head(L,'E');list_insert_head(L,'L');
list_insert_head(L,'L');list_insert_head(L,'C');list_insert_head(L,'Q');
printf("L->len=%d\n",L->len);list_show(L);
//调用尾插函数
list_insert_tail(L,'M');list_show(L);
printf("L->len=%d\n",L->len);
//调用任意插函数
list_insert_pos(L,7,'K');list_show(L);
//头删
list_delete_head(L);list_show(L);
//调用任意删
list_delete_pos(L,3);list_show(L);
//调用尾删函数
list_delete_tail(L);list_show(L);
//调用按值查找函数
int res = list_search_value(L,'K');
if(res<0)
{
printf("按值查找失败!\n");
}else if(res==0)
{
printf("没找到!\n");
}else
printf("按值查找成功!在第%d个\n",res);
//调用按位置修改函数
list_update_pos(L,2,'X');list_show(L);
//调用按值修改函数
list_update_value(L,'X','O');list_show(L);
//调用函数反转
list_reverse(L);list_show(L);
//调用释放函数
list_free(L);
L = NULL;
return 0;
}