【C语言】双链表常用函数

来源:互联网 发布:知乎lolfaker 编辑:程序博客网 时间:2024/06/05 10:14
/* * 链表演示 * 双向  * */#include <stdlib.h>#include "03link.h"//链表的初始化函数void link_init(link *p_link) {    p_link->head.p_next = &(p_link->tail);    p_link->tail.p_next = NULL;    //下面是另一个方向的,从尾指向头    p_link->tail.p_pre = &(p_link->head);    p_link->head.p_pre = NULL;}//链表的清理函数void link_deinit(link *p_link) {    while (p_link->head.p_next != &(p_link->tail)) {        node *p_first = &(p_link->head);        node *p_mid = p_first->p_next;        node *p_last = p_mid->p_next;        p_first->p_next = p_last;//清理正向        p_last->p_pre = p_first;//清理反向,就的指针的方向反了一下        free(p_mid);        p_mid = NULL;    }}//计算有效数字个数的函数,正反一样,要修改可以让p_first,p_mid,p_last,从后面开始来int link_size(const link *p_link) {    int cnt = 0;    const node *p_node = NULL;    for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) {        const node *p_first = p_node;        const node *p_mid = p_first->p_next;        const node *p_last = p_mid->p_next;        if (p_mid != &(p_link->tail)) {            cnt++;        }    }    return cnt;}//判断链表是否空的函数int link_empty(const link *p_link) {    return p_link->head.p_next == &(p_link->tail);}//判断链表是否满的函数int link_full(const link *p_link) {    return 0;}//在链表前边加入新节点的函数void link_add_head(link *p_link, int val) {    node *p_first = NULL, *p_mid = NULL, *p_last = NULL;    node *p_tmp = (node *)malloc(sizeof(node));    if (!p_tmp) {        return ;    }    p_tmp->num = val;    p_tmp->p_next = NULL;//正向指针    p_tmp->p_pre = NULL;//反向指针    p_first = &(p_link->head);    p_mid = p_first->p_next;    p_last = p_mid->p_next;    p_first->p_next = p_tmp;    p_tmp->p_pre = p_first;//反向    p_tmp->p_next = p_mid;    p_mid->p_pre = p_tmp;//反向}//在原有节点最后加入新节点的函数void link_append(link *p_link, int val) {    node *p_first = NULL, *p_mid = NULL, *p_last = NULL;    node *p_tmp = (node *)malloc(sizeof(node));    if (!p_tmp) {        return ;    }    p_tmp->num = val;    p_tmp->p_next = NULL;//正向    p_tmp->p_pre = NULL;//反向    p_first = p_link->tail.p_pre;//反向添加最后一个节点就是这里不同,原来是first指向头,现在是指向尾,相当于反着来了    p_mid = p_first->p_next;    p_last = p_mid->p_next;    //把新节点加入到p_first和p_mid中间    p_first->p_next = p_tmp;//正    p_tmp->p_pre = p_first;//反    p_tmp->p_next = p_mid;//正    p_mid->p_pre = p_tmp;//反}/*void link_append(link *p_link, int val) {    node *p_tmp = (node *)malloc(sizeof(node));    node *p_node = NULL;    if (!p_tmp) {        return ;    }    p_tmp->num = val;    p_tmp->p_next = NULL;    p_tmp->p_pre = NULL;    for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) {        node *p_first = p_node;        node *p_mid = p_first->p_next;        node *p_last = p_mid->p_next;        if (p_mid == &(p_link->tail)) {            p_first->p_next = p_tmp;            p_tmp->p_pre = p_first;            p_tmp->p_next = p_mid;            p_mid->p_pre = p_tmp;            break;        }    }}*///按顺序插入函数void link_insert(link *p_link, int val) {    node *p_tmp = (node *)malloc(sizeof(node));    node *p_node = NULL;    if (!p_tmp) {        return ;    }    p_tmp->num = val;    p_tmp->p_next = NULL;    p_tmp->p_pre = NULL;    for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) {        node *p_first = p_node;        node *p_mid = p_first->p_next;        node *p_last = p_mid->p_next;        if (p_mid == &(p_link->tail) || p_mid->num > val) {            p_first->p_next = p_tmp;            p_tmp->p_pre = p_first;//反向            p_tmp->p_next = p_mid;            p_mid->p_pre = p_tmp;//反向            break;        }    }}//删除最前面有效数字的函数int link_remove_head(link *p_link) {    node *p_first = NULL, *p_mid = NULL, *p_last = NULL;    if (link_empty(p_link)) {        return 0;    }    p_first = &(p_link->head);    p_mid = p_first->p_next;    p_last = p_mid->p_next;    p_first->p_next = p_last;//正    p_last->p_pre = p_first;//反    free(p_mid);    p_mid = NULL;    return 1;}//删除最后一个有效节点的函数int link_remove_tail(link *p_link) {    node *p_first = NULL, *p_mid = NULL, *p_last = NULL;    if (link_empty(p_link)) {        return 0;    }    p_first = p_link->tail.p_pre->p_pre;//尾节点->最后一个有效节点->倒数第二个有效节点    p_mid = p_first->p_next;//最后一个有效节点    p_last = p_mid->p_next;    //把p_mid指针捆绑的节点从链表里    //摘出来    p_first->p_next = p_last;    p_last->p_pre = p_first;    free(p_mid);    p_mid = NULL;    return 1;}/*int link_remove_tail(link *p_link) {    node *p_node = NULL;    if (link_empty(p_link)) {        return 0;    }    for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) {        node *p_first = p_node;        node *p_mid = p_first->p_next;        node *p_last = p_mid->p_next;        if (p_last == &(p_link->tail)) {            p_first->p_next = p_last;            p_last->p_pre = p_first;            free(p_mid);            p_mid = NULL;            break;        }    }    return 1;}*///删除某个数字所在节点的函数int link_remove(link *p_link, int val) {    node *p_node = NULL;    for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) {        node *p_first = p_node;        node *p_mid = p_first->p_next;        node *p_last = p_mid->p_next;        if (p_mid != &(p_link->tail) && p_mid->num == val) {            p_first->p_next = p_last;//正            p_last->p_pre = p_first;//反            free(p_mid);            p_mid = NULL;            return 1;        }    }    return 0;}//获得链表最前面数字的函数int link_get_head(const link *p_link, int *p_num) {    const node *p_first = NULL, *p_mid = NULL, *p_last = NULL;    if (link_empty(p_link)) {        return 0;    }    p_first = &(p_link->head);    p_mid = p_first->p_next;    p_last = p_mid->p_next;    *p_num = p_mid->num;    return 1;}//获得最后有效数字的函数int link_get_tail(const link *p_link, int *p_num) {    if (link_empty(p_link)) {        return 0;    }    *p_num = p_link->tail.p_pre->num;    return 1;}/*int link_get_tail(const link *p_link, int *p_num) {    const node *p_node = NULL;    if (link_empty(p_link)) {        return 0;    }    for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) {        const node *p_first = p_node;        const node *p_mid = p_first->p_next;        const node *p_last = p_mid->p_next;        if (p_last == &(p_link->tail)) {            *p_num = p_mid->num;            break;        }    }    return 1;}*///根据编号获得数字的函数int link_get(const link *p_link, int num, int *p_num) {    int cnt = 0;    const node *p_node = NULL;    for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) {        const node *p_first = p_node;        const node *p_mid = p_first->p_next;        const node *p_last = p_mid->p_next;        if (p_mid != &(p_link->tail) && num == cnt) {            *p_num = p_mid->num;            return 1;        }        cnt++;    }    return 0;}
原创粉丝点击