双向链表c语言实现 doublelinklist.h 和 doublelinklist.c

来源:互联网 发布:tensorflow 路径规划 编辑:程序博客网 时间:2024/06/06 15:47

doublelinklist.h 文件

#ifndef _DOUBLE_LINK_LIST_H_#define _DOUBLE_LINK_LIST_H_#include <stdio.h>#include <stdlib.h>#include <string.h>//链表就是一个一个的表通过关系节点连接的//双向链表//链表操作精髓在于操作关系节点,引入辅助指针pcurrent,pnext.从表头开始遍历各关系节点。typedef void List;typedef void ListNode;#ifndef bool#define bool int#define true 1#define false 0#endif//定义双向链表的关系小节点typedef struct _tag_DoubleLinkListConnectedNode{    struct _tag_DoubleLinkListConnectedNode* next;    struct _tag_DoubleLinkListConnectedNode* pre;}DoubleLinkListConnectedNode;typedef struct _tag_DoubleLinkList{    DoubleLinkListConnectedNode head;    DoubleLinkListConnectedNode* slider;    int length;}DoubleLinkList;List* DoubleLinkList_Create();bool DoubleLinkList_Destory(List* list );bool DoubleLinkList_Clear(List* list);int DoubleLinkList_GetLength(List* list);bool DoubleLinkList_InsertOneNode(List* list,ListNode* listnode,int pos);ListNode* DoubleLinkList_GetOneNode(List* list, int pos);ListNode* DoubleLinkList_DeleteOneNode(List* list ,int pos);bool DoubleLinkList_DeleteAllNode(List* list);ListNode* DoubleLinkList_DeleteOneNodeByNodePointer(List* list,ListNode* listnode);ListNode* DoubleLinkList_ResetSlider(List* list);ListNode* DoubleLinkList_GetCurrentSlider(List* list);ListNode* DoubleLinkList_SliderMoveToNext(List* list);#endif

doublelinklist.c 文件

#include <stdio.h>#include <stdlib.h>#include <string.h>#include "doublelinklist.h"//链表就是一个一个的表通过关系节点连接的//链表操作精髓在于操作关系节点,引入辅助指针pcurrent,pnext.从表头开始遍历各关系节点。List* DoubleLinkList_Create(){    List* ret = NULL;    DoubleLinkList* temp_doublelinklist = NULL;    temp_doublelinklist = (DoubleLinkList*)malloc(sizeof(DoubleLinkList));    if (temp_doublelinklist == NULL)    {        return NULL;    }    temp_doublelinklist->head.next = NULL;    temp_doublelinklist->head.pre = NULL;    temp_doublelinklist->slider = NULL;    temp_doublelinklist->length = 0;    ret = (List*)temp_doublelinklist;    return ret;}bool DoubleLinkList_Destory(List* list ){    DoubleLinkList* temp_doublelinklist = NULL;    if (list == NULL)    {        return false;    }    temp_doublelinklist = (DoubleLinkList*)list;    free(temp_doublelinklist);    temp_doublelinklist = NULL;    return true;}bool DoubleLinkList_Clear(List* list){    DoubleLinkList* temp_doublelinklist = NULL;    if (list == NULL)    {        return false;    }    temp_doublelinklist = (DoubleLinkList*)list;    temp_doublelinklist->head.next = NULL;    temp_doublelinklist->head.pre = NULL;    temp_doublelinklist->slider = NULL;    temp_doublelinklist->length = 0;    return true;}int DoubleLinkList_GetLength(List* list){    int ret = 0;    DoubleLinkList* temp_doublelinklist = NULL;    if (list == NULL)    {        return -1;    }    temp_doublelinklist = (DoubleLinkList*)list;    ret = temp_doublelinklist->length;    return ret;}bool DoubleLinkList_InsertOneNode(List* list,ListNode* listnode,int pos){    DoubleLinkList* temp_doublelinklist = NULL;    DoubleLinkListConnectedNode* temp_doublelinklistconnectednode_insert = NULL;    DoubleLinkListConnectedNode* pcurrent = NULL;   //辅助指针    DoubleLinkListConnectedNode* pnext = NULL;      //辅助指针的下一节点    int i = 0;    if (list == NULL || listnode == NULL || pos < 0)    {        return false;    }    temp_doublelinklist = (DoubleLinkList*)list;    temp_doublelinklistconnectednode_insert = (DoubleLinkListConnectedNode*)listnode;    //辅助指针指向链表头部即首地址    pcurrent = (DoubleLinkListConnectedNode*)temp_doublelinklist;    //辅助指针跳到pos-1处    for (i = 0; (i < pos && pcurrent->next != NULL); i++)    {        pcurrent = pcurrent->next;    }    //pcurrent 为要 插入节点 的前一节点,pnext为要 插入节点 的后一节点    //pcurrent  pnext 三者的顺序关系 listnode插入前    //pcurrent listnode pnext     listnode插入后    //得到pnext    pnext = pcurrent->next;    //开始插入新节点     //正向连    pcurrent->next = temp_doublelinklistconnectednode_insert;    temp_doublelinklistconnectednode_insert->next = pnext;    //反向连时 判断pnext是否为空,就是表头后面插入第一个节点时要处理    if (pnext != NULL)    {        pnext->pre = temp_doublelinklistconnectednode_insert;    }    temp_doublelinklistconnectednode_insert->pre = pcurrent;    //第一次插入时,游标指向第一个插入的节点    if (temp_doublelinklist->length == 0)    {        temp_doublelinklist->slider = temp_doublelinklistconnectednode_insert;    }    //第一次插入的节点即0号位置的节点pre为null,插入的节点指向null    if (pcurrent == (DoubleLinkListConnectedNode*)temp_doublelinklist)    {        temp_doublelinklistconnectednode_insert->pre = NULL;    }    temp_doublelinklist->length++;    return true;}ListNode* DoubleLinkList_GetOneNode(List* list, int pos){    ListNode* ret = NULL;    DoubleLinkList* temp_doublelinklist = NULL;    DoubleLinkListConnectedNode* temp_doublelinklistconnectednode = NULL;    DoubleLinkListConnectedNode* pcurrent = NULL;   //辅助指针    int i = 0;    if (list == NULL || pos < 0)    {        return NULL;    }    temp_doublelinklist = (DoubleLinkList*)list;    if (temp_doublelinklist->length <= 0 || pos >= temp_doublelinklist->length)    {        return NULL;    }    //辅助指针指向链表头部即首地址    pcurrent = (DoubleLinkListConnectedNode*)temp_doublelinklist;    //辅助指针跳到pos-1处    for (i = 0; (i < pos && pcurrent->next != NULL); i++)    {        pcurrent = pcurrent->next;    }    temp_doublelinklistconnectednode = pcurrent->next;    ret = (ListNode*)temp_doublelinklistconnectednode;    return ret;}ListNode* DoubleLinkList_DeleteOneNode(List* list ,int pos){    ListNode* ret = NULL;    DoubleLinkList* temp_doublelinklist = NULL;    DoubleLinkListConnectedNode* temp_doublelinklistconnectednode_delete = NULL;    DoubleLinkListConnectedNode* pcurrent = NULL;   //辅助指针    DoubleLinkListConnectedNode* pnext = NULL;      //辅助指针的下一节点    int i = 0;    if (list == NULL || pos < 0)    {        return false;    }    temp_doublelinklist = (DoubleLinkList*)list;    if (temp_doublelinklist->length <= 0 || pos >= temp_doublelinklist->length)    {        return NULL;    }    //辅助指针指向链表头部即首地址    pcurrent = (DoubleLinkListConnectedNode*)temp_doublelinklist;    //辅助指针跳到pos-1处    for (i = 0; (i < pos && pcurrent->next != NULL); i++)    {        pcurrent = pcurrent->next;    }    //得到pcurrent 和 pnext    temp_doublelinklistconnectednode_delete = pcurrent->next;    pnext = temp_doublelinklistconnectednode_delete->next;    //连线连接    pcurrent->next = pnext;    //判断链表中是否只有一个业务节点    //如果只有一个pcurrent即头部直接指向空就处理完毕,上一句就可以搞定了    //pnext不为空,不止一个业务节点    if (pnext != NULL)    {        pnext->pre = pcurrent;        //0号位置的节点删除后,补上来的节点特殊处理        if (pcurrent == (DoubleLinkListConnectedNode*)temp_doublelinklist)        {            pnext->pre = NULL;        }    }    //删除游标指向的节点,游标指向下一个节点    if (temp_doublelinklist->slider == temp_doublelinklistconnectednode_delete)    {        temp_doublelinklist->slider = pnext;    }    temp_doublelinklist->length--;    ret = (ListNode*)temp_doublelinklistconnectednode_delete;    return ret;}bool DoubleLinkList_DeleteAllNode(List* list){    DoubleLinkList* temp_doublelinklist = NULL;    if (list == NULL)    {        return false;    }    temp_doublelinklist = (DoubleLinkList*)list;    while(temp_doublelinklist->length > 0)    {        DoubleLinkList_DeleteOneNode((List*)temp_doublelinklist,0);    }    return true;}ListNode* DoubleLinkList_DeleteOneNodeByNodePointer(List* list,ListNode* listnode){    DoubleLinkList* temp_doublelinklist = NULL;    DoubleLinkListConnectedNode* temp_doublelinklistconnected_delete = NULL;    DoubleLinkListConnectedNode* pcurrent = NULL;    DoubleLinkListConnectedNode* temp_doublelinklistconnectednode_ret = NULL;    ListNode* ret = NULL;    int i = 0;    if (list == NULL || listnode == NULL)    {        return NULL;    }    temp_doublelinklist = (DoubleLinkList*)list;    temp_doublelinklistconnected_delete = (DoubleLinkListConnectedNode*)listnode;    if (temp_doublelinklist->length <= 0)    {        return NULL;    }    //得到辅助指针pos-1    pcurrent = (DoubleLinkListConnectedNode*)temp_doublelinklist;    //找同地址节点时    for (i = 0; i < temp_doublelinklist->length; i ++ )    {        //链表头不存业务节点,此处就可以先指向0位置的业务节点后再判断        pcurrent = pcurrent->next;        if (pcurrent == temp_doublelinklistconnected_delete)        {            temp_doublelinklistconnectednode_ret = temp_doublelinklistconnected_delete;            break;        }    }    if (temp_doublelinklistconnectednode_ret == NULL)    {        return NULL;    }    DoubleLinkList_DeleteOneNode((List*)temp_doublelinklist,i);    ret = (ListNode*)temp_doublelinklistconnectednode_ret;    return ret;}//重置游标ListNode* DoubleLinkList_ResetSlider(List* list){    DoubleLinkList* temp_doublelinklist = NULL;    DoubleLinkListConnectedNode* temp_doublelinklistconnected_node = NULL;    ListNode* ret = NULL;    if (list == NULL)    {        return NULL;    }    temp_doublelinklist = (DoubleLinkList*)list;    temp_doublelinklist->slider = temp_doublelinklist->head.next;    temp_doublelinklistconnected_node = temp_doublelinklist->slider;    ret = (ListNode* )temp_doublelinklistconnected_node;    return ret;}//返回当前游标,ListNode* DoubleLinkList_GetCurrentSlider(List* list){    DoubleLinkList* temp_doublelinklist = NULL;    DoubleLinkListConnectedNode* temp_doublelinklistconnected_node = NULL;    ListNode* ret = NULL;    if (list == NULL)    {        return NULL;    }    temp_doublelinklist = (DoubleLinkList*)list;    temp_doublelinklistconnected_node = temp_doublelinklist->slider;    ret = (ListNode*)temp_doublelinklistconnected_node;    return ret;}//游标下移,并返回游标下移之前的节点ListNode* DoubleLinkList_SliderMoveToNext(List* list){    DoubleLinkList* temp_doublelinklist = NULL;    DoubleLinkListConnectedNode* temp_doublelinklistconnected_node = NULL;    ListNode* ret = NULL;    if (list == NULL)    {        return NULL;    }    temp_doublelinklist = (DoubleLinkList*)list;    temp_doublelinklistconnected_node = temp_doublelinklist->slider;    temp_doublelinklist->slider = temp_doublelinklistconnected_node->next;    ret = (ListNode*)temp_doublelinklistconnected_node;    return ret;}/**************************以下是测试代码*************************//*typedef struct _tag_Teacher{    DoubleLinkListConnectedNode node;    int age ;    char name[];}Teacher;void main(){    List* list = NULL;    Teacher t1,t2,t3,t4,t5;    int kk = 0;    Teacher* teacher = NULL;    t1.age = 21;t2.age = 22;t3.age = 23;t4.age = 24;t5.age = 25;    list = DoubleLinkList_Create();    if (list == NULL)    {        printf("创建list失败");    }    //尾插法    DoubleLinkList_InsertOneNode(list,(ListNode*)&t1,DoubleLinkList_GetLength(list));    DoubleLinkList_InsertOneNode(list,(ListNode*)&t2,DoubleLinkList_GetLength(list));    DoubleLinkList_InsertOneNode(list,(ListNode*)&t3,DoubleLinkList_GetLength(list));    DoubleLinkList_InsertOneNode(list,(ListNode*)&t4,DoubleLinkList_GetLength(list));    DoubleLinkList_InsertOneNode(list,(ListNode*)&t5,DoubleLinkList_GetLength(list));    //    for (kk = 0; kk < DoubleLinkList_GetLength(list); kk ++)    {         teacher = (Teacher* )DoubleLinkList_GetOneNode(list,kk);         printf("老师%d的年龄是%d",kk,teacher->age);         printf("\n");    }    printf("链表长度%d \n",DoubleLinkList_GetLength(list));    DoubleLinkList_DeleteOneNodeByNodePointer(list,(ListNode*)&t5);    //DoubleLinkList_DeleteOneNode(list,0);    printf("链表长度%d \n",DoubleLinkList_GetLength(list));    for (kk = 0; kk < DoubleLinkList_GetLength(list); kk ++)    {        teacher = (Teacher* )DoubleLinkList_GetOneNode(list,kk);        printf("老师%d的年龄是%d",kk,teacher->age);        printf("\n");    }    printf("链表长度%d \n",DoubleLinkList_GetLength(list));    DoubleLinkList_DeleteAllNode(list);    printf("链表长度%d \n",DoubleLinkList_GetLength(list));    DoubleLinkList_Destory(list);    system("pause");}*/

可能会调用其它头文件或源文件,如果调用,请翻看我的其它博客,对其头文件或源文件的实现。
good luck !

原创粉丝点击