您的位置:首页 > 编程语言 > C语言/C++

双向链表(C语言实现)学习记录

2017-11-12 22:21 197 查看
双向链表(C语言实现)学习记录

(1)具体内容与实现结果

1.初始化双链表:

void DoubleLink_InitList(pDoubleLinkList L)   //初始化

{

    L=(struct DoubleLinkList*)malloc(sizeof(DoubleLinkList));  //创建头结点

    L->prior = L->next=NULL;

}

2.依次采用尾插法插入1,2,3,4,5元素

status DoubleLink_ListInsert(pDoubleLinkList L, int i, ElemType e) //插入数据元素

{

    int j=0;

    pDoubleLinkList p = L, s;

    while (j< i-1 && p!=NULL)

    {

       j++;

       p=p->next;

    }

    if (p == NULL)

       return false;

    else

    {

       s=(struct DoubleLinkList *)malloc(sizeof(DoubleLinkList));

       s->data = e;

       s->next = p->next;

       s->next = NULL;

       if (p->next != NULL)

       //p->next->prior = s;

       s->prior = p;

       p->next = s;

       return true;

    }

}

3.输出双链表:

void DoubleLink_DispList(pDoubleLinkList L)   //输出线性表

{

    pDoubleLinkList p = L->next;

    while (p != NULL)

    {

       printf("%d",p->data);

       p=p->next;

    }

    printf("\n");

}

4.输出双链表长度

int DoubleLink_ListLength(pDoubleLinkList L)  //求线性表的长度

{

    pDoubleLinkList p = L;

    int i = 0;

    while (p->next != NULL)

    {

       i++;

       p=p->next;

    }

    return(i);

}

5.双链表是否为空

status DoubleLink_ListEmpty(pDoubleLinkList L)   //判线性表是否为空表

{

    return (L->next==NULL);

4000
}

 

 

 

6.双链表的指定位置的元素。

status DoubleLink_GetElem(pDoubleLinkList L, int i, ElemType* e)   //求线性表中某个数据元素值

{

    int j = 0;

    pDoubleLinkList p = L;

    while (j<i && p!=NULL)

    {

       j++;

       p = p->next;

    }

    if (p == NULL)

       return 0;

    else

    {

       *e = p->data;

       return 1;

    }

}

7.双链表的指定元素的位置

int DoubleLink_LocateElem(pDoubleLinkList L, ElemType e)//按元素值查找

{

    int n=1;

    pDoubleLinkList p = L->next;

    while (p != NULL && p->data != e)

    {

       n++;

       p = p->next;

    }

    if (p == NULL)

       return(0);

    else

       return(n);

}

8.指定位置插入元素

status DoubleLink_ListInsert(pDoubleLinkList L, int i, ElemType e) //插入数据元素

{

    int j=0;

    pDoubleLinkList p = L, s;

    while (j< i-1 && p!=NULL)

    {

       j++;

       p=p->next;

    }

    if (p == NULL)

       return false;

    else

    {

       s=(struct DoubleLinkList *)malloc(sizeof(DoubleLinkList));

       s->data = e;

       s->next = p->next;

       s->next = NULL;

       if (p->next != NULL)

        p->prior = s;

       s->prior = p;

       p->next = s;

       return true;

    }

}

 

9.双链表删除元素

status DoubleLink_ListDelete(pDoubleLinkList L, int i, ElemType *e)    //删除数据元素

{

    int j = 0;

    pDoubleLinkList p = L, q;

    while (j < i-1 && p != NULL)

    {

       j++;

       p = p->next;

    }

    if (p == NULL)              //未找到第i-1个结点

       return 0;

    else                     //找到第i-1个结点*p

    {

       q = p->next;             //q指向要删除的结点

       if (q == NULL)

        return 0; //不存在第i个结点

       e = q->data;

       p->next = q->next;       //从单链表中删除*q结点

       if (p->next != NULL)

        q->prior = p;

       free(q);             //释放*q结点

       return 1;

    }

}

 

10释放双链表

void DoubleLink_DestroyList(pDoubleLinkList L)   //销毁线性表

{

    pDoubleLinkList p = L;

    pDoubleLinkList q = p;

    while (q != NULL)

    {

       free(p);

       p = q;

       q = p->next;

    }

    free(p);

}

实现结果如下:



 

(2)完整源代码

#include <stdio.h>

#include <stdlib.h>

#define true 1

#define false 0

typedef int status;

 

//定义数据类型,定义链表结点的存储结构与数据类型

typedef int ElemType;

typedef struct DoubleLinkList//定义双链表结点类型

{

    ElemType data;

    struct DNode * prior;    //指向前驱结点

    struct DNode * next;    //指向后继结点

} DoubleLinkList, * pDoubleLinkList;

 

void DoubleLink_InitList(pDoubleLinkList L);  //初始化

void DoubleLink_DestroyList(pDoubleLinkList L);  //销毁线性表

status DoubleLink_ListEmpty(pDoubleLinkList L);  //判线性表是否为空表

int  DoubleLink_ListLength(pDoubleLinkList L);   //求线性表的长度

void DoubleLink_DispList(pDoubleLinkList L);  //输出线性表

status DoubleLink_GetElem(pDoubleLinkList L, int i, ElemType *e);  //求线性表中某个数据元素值

int  DoubleLink_LocateElem(pDoubleLinkList L, ElemType e);  //按元素值查找

status DoubleLink_ListInsert(pDoubleLinkList L, int i, ElemType e);    //插入数据元素

status DoubleLink_ListDelete(pDoubleLinkList L, int i, ElemType *e);    //删除数据元素

 

//主调函数

int main()

{

    DoubleLinkList H;

    ElemType e;

    printf("双链表的基本运算如下:\n");

    printf("(1)初始化双链表\n");

    DoubleLink_InitList(&H);

    printf("(2)依次采用尾插法插入1,2,3,4,5元素\n");

    DoubleLink_ListInsert(&H, 1, 1);

    DoubleLink_ListInsert(&H, 2, 2);

    DoubleLink_ListInsert(&H, 3, 3);

    DoubleLink_ListInsert(&H, 4, 4);

    DoubleLink_ListInsert(&H, 5, 5);

    printf("(3)输出双链表:");

    DoubleLink_DispList(&H);

    printf("(4)双链表长度=%d\n", DoubleLink_ListLength(&H));

    printf("(5)双链表为%s\n", (DoubleLink_ListEmpty(&H)?"空":"非空"));

    DoubleLink_GetElem(&H, 3, &e);

    printf("(6)双链表的第3个元素=%d\n", e);

    printf("(7)元素2的位置=%d\n",DoubleLink_LocateElem(&H, 2));

    printf("(8)在第4个元素位置上插入元素8\n");

    DoubleLink_ListInsert(&H, 4, 8);

    printf("(9)输出双链表:");

    DoubleLink_DispList(&H);

    printf("(10)删除h的第3个元素\n");

    DoubleLink_ListDelete(&H, 3, &e);

    printf("(11)输出双链表H:");

    DoubleLink_DispList(&H);

    printf("(12)释放双链表\n");

    DoubleLink_DestroyList(&H);

    printf("(13)释放双链表...OK!\n");

    return 0;

}

 

void DoubleLink_InitList(pDoubleLinkList L)   //初始化

{

    L=(struct DoubleLinkList*)malloc(sizeof(DoubleLinkList));      L->prior=L->next=NULL;

}

 

void DoubleLink_DestroyList(pDoubleLinkList L)   //销毁线性表

{

    pDoubleLinkList p = L;

    pDoubleLinkList q = p;

    while (q != NULL)

    {

       free(p);

       p = q;

       q = p->next;

    }

    free(p);

}

 

status DoubleLink_ListEmpty(pDoubleLinkList L)   //判线性表是否为空表

{

    return (L->next==NULL);

}

 

int DoubleLink_ListLength(pDoubleLinkList L)  //求线性表的长度

{

    pDoubleLinkList p = L;

    int i = 0;

    while (p->next != NULL)

    {

       i++;

       p=p->next;

    }

    return(i);

}

 

void DoubleLink_DispList(pDoubleLinkList L)   //输出线性表

{

    pDoubleLinkList p = L->next;

    while (p != NULL)

    {

       printf("%d",p->data);

       p=p->next;

    }

    printf("\n");

}

 

status DoubleLink_GetElem(pDoubleLinkList L, int i, ElemType* e)   //求线性表中某个数据元素值

{

    int j = 0;

    pDoubleLinkList p = L;

    while (j<i && p!=NULL)

    {

       j++;

       p = p->next;

    }

    if (p == NULL)

       return 0;

    else

    {

       *e = p->data;

       return 1;

    }

}

 

int DoubleLink_LocateElem(pDoubleLinkList L, ElemType e)//按元素值查找

{

    int n=1;

    pDoubleLinkList p = L->next;

    while (p != NULL && p->data != e)

    {

       n++;

       p = p->next;

    }

    if (p == NULL)

       return(0);

    else

       return(n);

}

 

status DoubleLink_ListInsert(pDoubleLinkList L, int i, ElemType e) //插入数据元素

{

    int j=0;

    pDoubleLinkList p = L, s;

    while (j< i-1 && p!=NULL)

    {

       j++;

       p=p->next;

    }

    if (p == NULL)

       return false;

    else

    {

       s=(struct DoubleLinkList *)malloc(sizeof(DoubleLinkList));

       s->data = e;

       s->next = p->next;

       s->next = NULL;

       if (p->next != NULL)

        p->prior = s;

       s->prior = p;

       p->next = s;

       return true;

    }

}

 

status DoubleLink_ListDelete(pDoubleLinkList L, int i, ElemType *e)    //删除数据元素

{

    int j = 0;

    pDoubleLinkList p = L, q;

    while (j < i-1 && p != NULL)

    {

       j++;

       p = p->next;

    }

    if (p == NULL)              //未找到第i-1个结点

       return 0;

    else                     //找到第i-1个结点*p

    {

       q = p->next;             //q指向要删除的结点

       if (q == NULL)

        return 0; //不存在第i个结点

       e = q->data;

       p->next = q->next;       //从单链表中删除*q结点

       if (p->next != NULL)

        q->prior = p;

       free(q);             //释放*q结点

       return 1;

    }

}

 

 

分享(share )是快乐的,也是见证个人的成长历程,文章主要为平时学习积累,基于自身认知不足之处在所难免,也恳请大家指正,共同进步
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: