专栏首页菜鸟致敬数据结构|实现一个链表[4]

数据结构|实现一个链表[4]

链表的实现

先要构建合适的链表结构。下面是构建双向循环链表,应该是结构最复杂的链表。

typedef struct JD{
        int data;
        struct JD *prior;
        struct JD *next;
    }JD;    //创建JD

如上面的代码,就是构建了链表在内存中的存储结构,int data是需要存储的int数据。struct JD *prior则是定义指向前面一个链表结构体的指针。struct JD *next同理是指向下一个链表结构体的指针。所以这个链表的结构共计三个部分,记录数据,指向下一个链表块,指向上一个链表块。 那么怎么实现链表的创建呢。首先我们定义一个当前选中的链表结构体,作为head。第一个元素的时候,需要我们自己把两个指针各自指向自己,记录数据也需要手动填充。 之后则是开辟新的空间,添加下一个链表块。

    for(;i<10;i++){
        node=(JD *)malloc(sizeof(JD));
        node->data=a[i];
        p->next=node;
        node->prior=p;
        p=p->next;
    }

如上面,一共需要设置10长度的链表。node=(JD *)malloc(sizeof(JD))开辟了一个链表元素长度的空间,并且按照我们定义的JD结构生成。node->data=a[i]设置我们需要记录的值。p->next=node把前一个元素的next指针指向当前的node,node->prior=p把当前node的指向前一个指针的指向前一个元素p。p=p->next把当前的元素设置到下一个。

等到结束之后,有两种处理方式,最后一个节点的指向后一个元素的指针为NULL,则链表结束。另一个则是构成循环链表,把最后一个链表的指向下一个元素的指针指到head。

p->next=head;
head->prior=p;

p是当前的node,最后一个时则表示最后一个node。p->next=head指向的链表的头,head->prior=p指向的结尾node。 关于头部的处理

JD *node,*p,*head;
p=(JD *)malloc(sizeof(JD));
head=p;

为了找到链表的遍历入口,我们可以使用指针记录head的地址。 结尾附上源代码

#include "stdio.h"
#include "malloc.h"

typedef struct JD{
        int data;
        struct JD *prior;
        struct JD *next;
    }JD;    //创建JD

JD *createList(){   //
    int a[10]={1,4,9,16,25,36,49,64,81,100},i=0;
    JD *node,*p,*head;
    p=(JD *)malloc(sizeof(JD));
    head=p;
    for(;i<10;i++){
        node=(JD *)malloc(sizeof(JD));
        node->data=a[i];
        p->next=node;
        node->prior=p;
        p=p->next;
    }
    p->next=head;
    head->prior=p;
    return p;
}
void printList1(JD *p){
    int i=0;
    JD *temp=p;

    printf("顺序打印:");

    while(temp->data!=1){
        temp=temp->next;
    }   //从1开始打印

    for(;i<10;i++){
        printf("%d ",temp->data);
        temp=temp->next;
    }

    printf("\n\n");
}
void printList2(JD *p){
    
    int i=0;
    JD *temp=p;

    printf("逆序打印:");

    for(;i<10;i++){
        printf("%d ",temp->data);
        temp=temp->prior;
    }

    printf("\n\n");
}
void delete25(JD *p){
    int i=0;

    while(p->data!=1){
        p=p->next;
    }   //从1开始打印

    printf("删除25后打印:");

    for(;i<9;i++){
        if(p->data!=25){
        printf("%d ",p->data);
        p=p->next;
        }
        if(p->next->data==25){
            p->next=p->next->next;
            p->next->prior=p;
        }   //删除25
        
    }

    printf("\n\n");
}
void add50(JD *p){
    int i=0;

    JD *node;
    node=(JD *)malloc(sizeof(JD));
    node->data=50;  //创建50的结点

    printf("增加50后打印:");
    
    while(p->data!=49){
        p=p->next;
        if(p->data==49){
            node->prior=p;
            node->next=p->next;
            p->next=node;
            p->next->prior=node;
        }
    }

    while(p->data!=1)
        p=p->next;  //确保从1开始打印

    for(;i<10;i++){
        printf("%d ",p->data);
        p=p->next;
    }

    printf("\n");
}
int main(){

    JD *head;
    head=createList();//创建双向循环链表
    
    printList1(head);//顺序打印链表
    
    printList2(head);   //逆序打印链表

    delete25(head);//删除25并顺序打印
    
    add50(head);//增加50并顺序打印

    return 0;
}

本文分享自微信公众号 - Python与MySQL(Python_Rick),作者:Rare

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL 查询数据

    MySQL 数据库使用SQL SELECT语句来查询数据。 你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过 Python来查询数据。 语法...

    Rare0716
  • 【菜鸟致敬】爬取豆瓣的短评(⊙o⊙)…

    因为需要一点数据,所以就去爬取一点豆瓣短评的数据。因为短评页面是生成的静态html,还是很容易爬虫数据的,其中发现了问题每部电影短评在同一条件下最多只能查阅50...

    Rare0716
  • 数据结构|栈的实现改[5]

    栈满足的特性是先进后出,就像货车装货物,把货物一次放进去,但是卸货的时候,你得先把最外面的卸载了,才能继续卸载里层的货物。 栈的实现有两种形式,一种是数组,一种...

    Rare0716
  • 23张图!万字详解「链表」,从小白到大佬!

    链表和数组是数据类型中两个重要又常用的基础数据类型,数组是连续存储在内存中的数据结构,因此它的优势是可以通过下标迅速的找到元素的位置,而它的缺点则是在插入和删除...

    Java中文社群-磊哥
  • 3分钟速读原著《Java数据结构与算法》(二)

    cwl_java
  • 微分享回放 | 携程是如何把大数据用于实时风控的

    作者简介 郁伟,携程技术中心风险控制部高级开发经理。2010加入携程,参与了携程结算平台、风控系统的开发,对系统架构、流式数据处理等有比较深入的研究。 *视频...

    携程技术
  • Day15:反转链表

    背景知识介绍   在做本题之前首先介绍一下链表的基本知识。在维基百科中,链表 是这样定义的:链表(Linked list)是一种常见的基础数据结构,是一种线...

    stefan666
  • LeetCode 1171. 从链表中删去总和值为零的连续节点(哈希表)

    给你一个链表的头节点 head,请你编写代码,反复删去链表中由 总和 值为 0 的连续节点组成的序列,直到不存在这样的序列为止。

    Michael阿明
  • 5.链表导论-心法篇

    链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以...

    码哥字节
  • 用Tensorflow搭建神经网络14:检查点训练机制

    由于大型神经网络的训练往往耗费很长的时间,可能会因为机器损坏、断电或系统崩溃等各种因素无法一次性完成模型训练而导致前面所有的训练功亏一篑。本次来介绍一种检查点机...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券