C语言双向链表

来源:互联网 发布:linux开启登录超时锁定 编辑:程序博客网 时间:2024/05/16 08:18

C语言双向链表

1.定义头文件 DoubleLinkList.h

    > #ifndef DOUBLELINKLIST_H      #define DOUBLELINKLIST_H    //定义节点类型    typedef struct Node    {        int data;        Node* previous;        Node* next;    }Node,*PNode;    typedef struct LinkList    {        Node* head;        Node* tail;        int len;    }LinkList;    /*分配值为i的节点,并返回节点地址*/    PNode MakeNode(LinkList * p, int i);    /*释放p所指的节点*/    void FreeNode(PNode p);    /*构造一个空的双向链表*/    LinkList* InitList();    /*摧毁一个双向链表*/    void DestroyList(LinkList *plist);    /*将一个链表置为空表,释放原链表节点空间*/    void ClearList(LinkList *plist);    /*返回头节点地址*/    PNode GetHead(LinkList *plist);    /*返回尾节点地址*/    PNode GetTail(LinkList *plist);    /*返回链表大小*/    int GetSize(LinkList *plist);    /*返回p的直接后继位置*/    PNode GetNext(PNode p);    /*返回p的直接前驱位置*/    PNode GetPrevious(PNode p);    /*将pnode所指节点插入第一个节点之前*/    PNode InsFirst(LinkList *plist, PNode pnode);    /*将链表第一个节点删除并返回其地址*/    PNode DelFirst(LinkList *plist);    /*获得节点的数据项*/    int Getint(PNode p);    /*设置节点的数据项*/    void Setint(PNode p, int i);    /*删除链表中的尾节点并返回其地址,改变链表的尾指针指向新的尾节点*/    PNode Remove(LinkList *plist);    /*在链表中p位置之前插入新节点S*/    PNode InsBefore(LinkList *plist, PNode p, PNode s);    /*在链表中p位置之后插入新节点s*/    PNode InsAfter(LinkList *plist, PNode p, PNode s);    /*返回在链表中第i个节点的位置*/    PNode LocatePos(LinkList *plist, int i);    /*依次对链表中每个元素输出*/    void ListTraverse(LinkList *plist);    #endif  

2.实现文件 DoubleLinkList.cpp

    >#include"DoubleLinkList.h"  #include<malloc.h>  #include<stdlib.h> #include<stdio.h> /*构造一个空的双向链表*/LinkList* InitList(){    LinkList* list = (LinkList*)malloc(sizeof(LinkList));    if (list == NULL)    {        printf("动态内存分配失败");        return NULL;    }    list->len = 0;    list->head = NULL;    list->tail = NULL;    return list;}/*分配值为i的节点,并返回节点地址*/PNode MakeNode(LinkList * p, int i){    PNode pNode = (PNode)malloc(sizeof(Node));    pNode->data = i;    return pNode;}/*释放p所指的节点的内存空间*/void FreeNode(PNode p){    if (p!=NULL)    {        free(p);    }    return;}/*将一个链表置为空表(回到初始状态),释放原链表节点空间*/void ClearList(LinkList *plist){    PNode current = plist->head;    if (current != NULL){        PNode p = current;        current = current->next;        free(p);    }    plist->len = 0;    return;}/*返回头节点地址*/PNode GetHead(LinkList *plist){     return plist->head; }/*返回尾节点地址*/PNode GetTail(LinkList *plist){     return plist->tail;}/*返回链表大小*/int GetSize(LinkList *plist){     return plist->len; }/*返回p的直接后继位置*/PNode GetNext(PNode p){     return p->next; }/*返回p的直接前驱位置*/PNode GetPrevious(PNode p){     return p->previous;}/*将pnode所指节点插入第一个节点之前*/PNode InsFirst(LinkList *plist, PNode pnode){     PNode first = plist->head;    plist->head = pnode;    pnode->next = first;    plist->len++;    if (plist->len == 1){        plist->tail = pnode;    }    return pnode;}/*将链表第一个节点删除并返回其地址*/PNode DelFirst(LinkList *plist){     PNode first = plist->head;    plist->head = first->next;    plist->head->previous = NULL;    plist->len--;    return first;}/*获得节点的数据项*/int Getint(PNode p){     return p->data;}/*设置节点的数据项*/void Setint(PNode p, int i){    p->data=i;}/*删除链表中的尾节点并返回其地址,改变链表的尾指针指向新的尾节点*/PNode Remove(LinkList *plist){     if (plist==NULL)    {        return NULL;    }    PNode last = plist->tail;    if (plist->len==1)    {        plist->head = NULL;        plist->tail = NULL;        plist->len = 0;        return last;    }    last->previous->next = last->next;    plist->tail = last->previous;    plist->len--;    return last;}/*在链表中p位置之前插入新节点S*/PNode InsBefore(LinkList *plist, PNode p, PNode s){    if (p==plist->head)    {        InsFirst(plist, s);    }    s->next = p;    s->previous = p->previous;    p->previous->next = s;    p->previous = s;    plist->len++;    return s;}/*在链表中p位置之后插入新节点s*/PNode InsAfter(LinkList *plist, PNode p, PNode s){     if (p==plist->tail)    {        p->next = s;        s->previous = p;        plist->tail = s;        plist->len++;        return s;    }    s->next = p->next;    s->previous = p;    p->next->previous = s;    p->next = s;    plist->len++;    return s; }/*返回在链表中第i个节点的位置*/PNode LocatePos(LinkList *plist, int i){     if (i>plist->len)    {        return NULL;    }    PNode node = plist->head;    for (int j = 1; j < i; j++)    {        node = node->next;    }    return node;}/*依次对链表中每个元素输出*/void ListTraverse(LinkList *plist){     PNode p = GetHead(plist);    if (plist->len == 0)        return;    int i = 1;    printf("The 1th data:%d\n", p->data);    for (; i < plist->len; i++){        p = p->next;        printf("The %dth data:%d\n",i+1, p->data);    }}

3.测试文件 DoubleLinkListTest.cpp

#include <stdlib.h>#include <string.h>#include <stdio.h>#include "DoubleLinkList.h"int main(){    LinkList* pList= InitList();    PNode p1 = MakeNode(pList,1);    //插入到头部    InsFirst(pList, p1);    PNode p2 = MakeNode(pList, 2);    PNode p3 = MakeNode(pList, 3);    InsFirst(pList, p2); InsFirst(pList, p3);    PNode p4 = MakeNode(pList, 4);    PNode p5 = MakeNode(pList, 5);    InsAfter(pList, p2, p4);    InsBefore(pList,p4,p5);    ListTraverse(pList);    printf("===================\n");    PNode p6 = MakeNode(pList, 6);    InsAfter(pList, p1, p6);    Remove(pList);       //删除尾部节点    ListTraverse(pList);    DelFirst(pList);     //删除头部节点    ListTraverse(pList);    printf("\n ");    system("pause");}
0 0
原创粉丝点击