• 数据结构-双向链表创建


            我们常见的单链表能很好的表示元素间“一对一”的关系,也能根据指针的走向找到某个元素的后继结点,但是对于一些特殊问题,比如需要大量查找到一个元素的前驱结点,单链表总是通过从头向后遍历的方式无疑使运行速度和效率大大降低,为此,我们将引出一个新的链表数据结构,也就是双链表。

    [单链表结构图]:

             双链表,也称双向链表,顾名思义,它是具有两个方向的链表,不像单链表形式那么单一,相比单链表多了一个指针域。

            生动点描述就是,双链表——“多给自己留后路”,而单链表——“一条路走到天黑”。所以双链表做事更灵活效率更高,单链表显得就有些轴。当然,单链表也有自己的优势,那就是比双链表更加节省空间,因为它只占一个指针域。

    [双链表结构图]:

     从上图可知双向链表的节点结构包括:

    (1)前指针域

    (2)数据域

    (3)后指针域

    [双链表结点结构图]

    双链表结点的代码实现:

    1. typedef struct Line{
    2. struct Line*prior;//前指针域:指向直接前趋结点
    3. int data;//数据域
    4. struct Line*next;//后指针域:指向后继结点
    5. }line;

     双向链表的创建:

    1. line*initLine(line*head){
    2. head=(line*)malloc(sizeof(line));//创建链表第一个结点
    3. head->prior=NULL;
    4. head->next=NULL;
    5. head->data=1;
    6. line*temp=head;
    7. for(int i=2;i<5;i++){
    8. line*body=(line*)malloc(sizeof(line));
    9. body->prior=NULL;
    10. body->next=NULL;
    11. body->data=i;
    12. temp->next=body;//前趋结点指向后继结点
    13. body->prior=temp;//新结点指向前趋结点
    14. temp=temp->next;//指针向后移动
    15. }
    16. }

    完整C语言代码:

    1. #include
    2. #include
    3. typedef struct Line{
    4. struct Line*prior;//前指针域:指向直接前趋结点
    5. int data;//数据域
    6. struct Line*next;//后指针域:指向后继结点
    7. }line;
    8. line*initLine(line*head){
    9. head=(line*)malloc(sizeof(line));//创建链表第一个结点
    10. head->prior=NULL;
    11. head->next=NULL;
    12. head->data=1;
    13. line*temp=head;
    14. for(int i=2;i<5;i++){
    15. line*body=(line*)malloc(sizeof(line));
    16. body->prior=NULL;
    17. body->next=NULL;
    18. body->data=i;
    19. temp->next=body;//前趋结点指向后继结点
    20. body->prior=temp;//新结点指向前趋结点
    21. temp=temp->next;//指针向后移动
    22. }
    23. return head;
    24. }
    25. void display(line*head){
    26. line*t=head;
    27. while(t){
    28. //如果该节点无后继节点,说明此节点是链表的最后一个节点
    29. if(t->next==NULL){
    30. printf("%d\n",t->data);
    31. }else{
    32. printf("%d<->",t->data);
    33. }
    34. t=t->next;
    35. }
    36. }
    37. int main()
    38. {
    39. line*list=NULL;
    40. list=initLine(list);
    41. display(list);
    42. //显示双链表的优点
    43. printf("链表中第 4 个节点的直接前驱是:%d",list->next->next->next->prior->data);
    44. return 0;
    45. }

    输出结果:

  • 相关阅读:
    R语言 ggdendro_谱系图
    多个文件合成一个bin文件(将uboot/kernel/rootfs合成一个bin文件烧录)(UBin工具下载)
    Proteus仿真--量程自动切换数字电压表(仿真+程序)
    《MySQL实战45讲》——学习笔记16 “order by排序原理、varchar(255)“
    哪些企业适合做私域?
    乐队现场如何播放PROGRAM以及VJ视频 ?M-Live“B Beat”取代了我使用10年的PGM机器
    k8s 基础入门
    【Vision Pro应用】分享一个收集Apple Vision Pro 应用的网站
    交换机端口安全
    语文世界杂志语文世界杂志社语文世界编辑部2022年第9期目录
  • 原文地址:https://blog.csdn.net/qq_51701007/article/details/126152231