简单介绍线性表以及如何实现双链表

  1. 线性表的简介:

线性表是一类数据结构,其特点是数据元素之间存在一种线性关系。换句话说,线性表可以看作是一组有顺序的数据元素的集合,其中每个元素最多只有一个前驱和一个后继。(注:链表也是线性表的一种)

线性表的常见实现方式有数组和链表两种。

  1. 双向链表的实现:

双向链表是一种常见的链式存储结构,每个节点除了存储数据之外,还包括指向前驱和后继节点的指针。在操作链表时,我们可以通过这些指针实现对链表中任意节点的访问、插入和删除等操作。

下面是一个如何实现双向链表的代码示例:

typedef struct Node{
    int data;  
    struct Node *prev;  //指向前驱节点的指针
    struct Node *next;  //指向后继节点的指针
}Node;

Node* CreateDblList(int arr[], int n){  //创建双向链表
    Node *head, *tail, *p;
    head = (Node*)malloc(sizeof(Node));
    tail = head;
    for(int i=0; i<n; i++){
       p = (Node*)malloc(sizeof(Node));
       p->data=arr[i];
       p->prev=tail;
       p->next=NULL;
       tail->next=p;
       tail=p;
    }
    head->prev=NULL;
    return head;
}

void ShowDblList(Node *p){  //打印双向链表
    while(p->next!=NULL){
        p=p->next;
        printf("%d ", p->data);
    }
    printf("\n");
}

void InsertDblList(Node *p, int i, int x){  //在双向链表中插入节点
    Node *q=p;
    for(int j=0; j<i-1; j++) q=q->next;
    Node *t=(Node*)malloc(sizeof(Node));
    t->data=x;
    t->prev=q;
    t->next=q->next;
    if(q->next) q->next->prev=t;
    q->next=t;
}

void DeleteDblList(Node *p, int i){  //删除双向链表中的指定节点
    Node *q=p;
    for(int j=0; j<i-1; j++) q=q->next;
    q->prev->next=q->next;
    if(q->next) q->next->prev=q->prev;
    free(q);
}

接下来对上述代码做简单说明:

  • 结构体 Node 表示双向链表的每个节点,包含数据域 data,以及指向前驱节点和后继节点的指针 prevnext
  • 函数 CreateDblList 表示创建一个双向链表,传入参数为数组 arr 和数组长度 n,返回值为双向链表的头结点指针。
  • 函数 ShowDblList 表示打印双向链表,传入参数为头结点指针。
  • 函数 InsertDblList 表示在双向链表中插入指定节点,传入参数为头结点指针、插入位置 i 和插入值 x
  • 函数 DeleteDblList 表示删除双向链表中的指定节点,传入参数为头结点指针和待删除节点位置 i

下面是一个基于上述代码的示例:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node{
    int data;
    struct Node *prev;
    struct Node *next;
}Node;

Node* CreateDblList(int arr[], int n){
    Node *head, *tail, *p;
    head = (Node*)malloc(sizeof(Node));
    tail = head;
    for(int i=0; i<n; i++){
       p = (Node*)malloc(sizeof(Node));
       p->data=arr[i];
       p->prev=tail;
       p->next=NULL;
       tail->next=p;
       tail=p;
    }
    head->prev=NULL;
    return head;
}

void ShowDblList(Node *p){
    while(p->next!=NULL){
        p=p->next;
        printf("%d ", p->data);
    }
    printf("\n");
}

void InsertDblList(Node *p, int i, int x){
    Node *q=p;
    for(int j=0; j<i-1; j++) q=q->next;
    Node *t=(Node*)malloc(sizeof(Node));
    t->data=x;
    t->prev=q;
    t->next=q->next;
    if(q->next) q->next->prev=t;
    q->next=t;
}

void DeleteDblList(Node *p, int i){
    Node *q=p;
    for(int j=0; j<i-1; j++) q=q->next;
    q->prev->next=q->next;
    if(q->next) q->next->prev=q->prev;
    free(q);
}

int main(){
    int a[5] = {1, 2, 3, 4, 5};
    Node *L = CreateDblList(a, 5);

    printf("Original doubly linked list:\n");
    ShowDblList(L);

    printf("Insert value '6' into index '2':\n");
    InsertDblList(L, 2, 6);
    ShowDblList(L);

    printf("Delete value in index '4':\n");
    DeleteDblList(L, 4);
    ShowDblList(L);

    return 0;
}

以上代码示例中,我们通过 CreateDblList 函数创建了一个原始的双向链表,包含五个节点,值分别为 1,2,3,4,5;然后通过 InsertDblList 函数,我们在索引为 2 的位置插入了一个值为 6 的新节点;最后,我们通过 DeleteDblList 函数,将索引为 4 的节点删除。可以看到,通过双向链表的相关操作,我们可以实现动态的节点插入和删除,从而满足各种实际应用场景的需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:简单介绍线性表以及如何实现双链表 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • React+Electron快速创建并打包成桌面应用的实例代码

    我将在以下内容中详细讲解 “React+Electron快速创建并打包成桌面应用的实例代码”的完整攻略。 简介 React 和 Electron 分别是前端和桌面开发中常用的工具。React 是一个基于 JavaScript 的图形 UI 库,它可以高效地构建 Web 应用程序的用户界面。Electron 是一个基于 Chromium 和 Node.js 实…

    other 2023年6月27日
    00
  • docker mysql5.7如何设置不区分大小写

    当然!下面是关于\”docker mysql5.7如何设置不区分大小写\”的完整攻略: docker mysql5.7如何设置不区分大小写 在 Docker 中运行 MySQL 5.7 容器时,可以通过设置配置参数来实现不区分大小写。以下是两个示例: 示例1:在docker run命令中设置不区分大小写 docker run -d –name mysql …

    other 2023年8月19日
    00
  • C语言实现密码强度检测

    C语言实现密码强度检测攻略 简介 密码强度检测是一种常见的安全性检查,用于评估密码的复杂程度和安全性。在C语言中,我们可以使用一些技术和算法来实现密码强度检测。 步骤 1. 导入必要的头文件 首先,我们需要导入一些必要的头文件,以便使用C语言提供的函数和数据类型。在这个例子中,我们将使用stdio.h和string.h头文件。 #include <st…

    other 2023年8月18日
    00
  • c语言中的移位运算符

    移位运算符是C语言中的一种二进制运算符,主要用于对二进制数进行位移操作。 C语言中有两种移位运算符,分别是左移位运算符“<<”和右移位运算符“>>”。 左移位运算符“<<”,将一个数的二进制形式各位数字向左移动指定的次数,右端补 0,每向左移动一位,相当于这个数乘以 2,因此左移操作相当于进行乘法运算。其基本语法为: x …

    other 2023年6月27日
    00
  • linux查看目录大小及硬盘大小

    要查看 Linux 系统中目录的大小以及硬盘的总大小,可以使用以下的方法: 查看当前目录的大小 要查看当前目录的大小,可以使用 du 命令。du 命令用于计算文件或目录占用的磁盘空间,它可以递归显示指定目录的大小,并可控制显示单位的大小。 命令格式如下: du -h –max-depth=1 其中,-h 表示以可读性较好的方式显示出文件大小。–max-d…

    other 2023年6月27日
    00
  • 如何添加chrome迅雷扩展程序添加chrome迅雷扩展程序的方法

    如何添加Chrome迅雷扩展程序 Chrome迅雷扩展程序可以帮助用户更方便地使用迅雷下载和快传等功能。本攻略将详细讲如何添加Chrome迅雷扩展程序的方法,包括打开Chrome网上用店、搜索迅雷扩展程序、添加至Chrome等步骤。 添加Chrome迅雷扩展程序的方法 以下是添加Chrome迅雷扩展程序的方法: 打开Chrome浏览器,点击右上角的三个点,选…

    other 2023年5月7日
    00
  • C++类的静态成员初始化详细讲解

    下面详细讲解“C++类的静态成员初始化详细讲解”的攻略。 1. 静态成员的定义和初始化 在C++中,静态成员是指属于类的成员,而不是属于某个对象的成员。它们被定义为类的属性,并且在类的所有实例中共享。静态成员包含静态变量和静态函数。 当定义一个静态成员时,需要在类定义内部进行声明,在类外部进行定义和初始化。其语法格式为: class ClassName { …

    other 2023年6月20日
    00
  • Ai怎么制作多圆形嵌套效果的图形?

    制作多圆形嵌套效果的图形攻略 要制作多圆形嵌套效果的图形,可以使用以下步骤: 步骤一:准备工作 在开始之前,确保你已经安装了合适的绘图软件,例如Adobe Illustrator或Inkscape。这些软件提供了丰富的绘图工具和功能,可以帮助你创建复杂的图形。 步骤二:创建基础圆形 首先,创建一个基础圆形,作为嵌套图形的最外层。选择绘图工具,绘制一个圆形,并…

    other 2023年7月28日
    00
合作推广
合作推广
分享本页
返回顶部