首页 > 其他分享 >C语言数据结构实现-双向链表

C语言数据结构实现-双向链表

时间:2024-06-15 22:46:04浏览次数:22  
标签:head temp int C语言 链表 next line 数据结构

前面学习了如何创建一个双向链表,本节学习有关双向链表的一些基本操作,即如何在双向链表中添加、删除、查找或更改数据元素。

本节知识基于已熟练掌握双向链表创建过程的基础上,我们继续上节所创建的双向链表来学习本节内容,创建好的双向链表如图 1 所示:
image

双向链表添加节点

根据数据添加到双向链表中的位置不同,可细分为以下 3 种情况:
添加至表头
将新数据元素添加到表头,只需要将该元素与表头元素建立双层逻辑关系即可。

换句话说,假设新元素节点为 temp,表头节点为 head,则需要做以下 2 步操作即可:
temp->next=head; head->prior=temp;
将 head 移至 temp,重新指向新的表头;

例如,将新元素 7 添加至双链表的表头,则实现过程如图 2 所示:image
添加至表的中间位置
同单链表添加数据类似,双向链表中间位置添加数据需要经过以下 2 个步骤,如图 3 所示:
1、新节点先与其直接后继节点建立双层逻辑关系;
2、新节点的直接前驱节点与之建立双层逻辑关系;
image
添加至表尾
与添加到表头是一个道理,实现过程如下(如图 4 所示):
找到双链表中最后一个节点;
让新节点与最后一个节点进行双层逻辑关系;

双向链表删除节点

双链表删除结点时,只需遍历链表找到要删除的结点,然后将该节点从表中摘除即可。

例如,从图 1 基础上删除元素 2 的操作过程如图 5 所示:

image

双向链表查找节点

通常,双向链表同单链表一样,都仅有一个头指针。因此,双链表查找指定元素的实现同单链表类似,都是从表头依次遍历表中元素。

双向链表更改节点

更改双链表中指定结点数据域的操作是在查找的基础上完成的。实现过程是:通过遍历找到存储有该数据元素的结点,直接更改其数据域即可。

全部代码为

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

typedef struct line{
    struct  line * prior;
    int data;
    struct line * next;
} line;
line * initLine();
void displayLine(line *);
void insertNode(line *,int , int );
void deleteNode(line *,int );
void updateNode(line * , int , int);
int main(){
    line * head = initLine();
    insertNode(head,3, 100);
    insertNode(head,5, 90);
    deleteNode(head,2);
    insertNode(head,3, 77);
    displayLine(head);
}
//修改内容
void updateNode(line * head, int pos , int num){
    line * temp = head;
    for(int i=1;i<pos;i++){
        temp = temp->next;
    }
    temp->data  = num;
}


//删除节点
void deleteNode(line * head, int pos){
    line * temp = head;
    for( int i=1;i<pos-1;i++){
        temp = temp->next;
    }
    temp->next = temp->next->next;
    temp->next->next->prior = temp;
}

//添加节点
void  insertNode(line * Head, int add, int num){
    line * temp = Head;

    line * newNode = (line *)malloc(sizeof(line));
    newNode->data = num;
    newNode->next=NULL;
    newNode->prior=NULL;
    for(int i=1;i<add-1;i++){
        temp = temp->next;
    }
    newNode->next = temp->next;
    temp->next->prior = newNode;

    temp->next = newNode;
    newNode->prior = temp;

}
//初始化
line * initLine(){
    line * head = (line *) malloc(sizeof(line));
    head->data=1;
    head->prior=NULL;
    head->next=NULL;
    line * list = head;
    for(int i=2;i<=4;i++){
        line * node = (line *)malloc(sizeof(line));
        node->prior=NULL;
        node->data = i;
        node->next=NULL;

        list->next = node;
        node->prior=list;

        list = list->next;
    }
    return head;
}
//打印内容
void displayLine(line * head){
    line * temp = head;

    while(temp) {
        printf("%d\n",temp->data);
        temp = temp->next;
    }
}



标签:head,temp,int,C语言,链表,next,line,数据结构
From: https://www.cnblogs.com/zh718594493/p/18249885

相关文章

  • 学习C语言两个月后的收获(篇目二) #超详细的scanf() 讲解-->基本用法、scanf() 的返回值
    一.scanf1.基本用法:scanf()读取用户的键盘输入 ---->程序在运行到这个语句的时候,会停下来,等待用户从键盘输入。当用户输入数据之后按下回车,scanf()就会处理用户的输入,将其存入变量。 scanf()是库函数,其头文件是<stdio.h>    (注:标准输入一般是键盘;标准输出......
  • C语言面试题
    1.static的作用1.修饰全局变量:不可以被外部文件访问,只可以在本文件中使用,限定它的作用域2.修饰函数:不可以被外部文件访问,只可以在本文件中使用,限定函数的作用域如果想要其他文件可以引用本地的函数,则要在函数定义时使用关键字,extern,表示该函数是外部函数可以被其他文件调......
  • 自学c语言的第一天
    高考完,终于有时间去学自己喜欢的编程,就先从c语言开始学起。首先,先配置好操作环境,下载好工具,决定从MSVC2022开始启动创建项目写自己的第一个c语言代码(祖宗之法不可变,“halloworld”)试运行(一次成功!!)稍微汇总一下自己学到的知识点:1、main是主函数,相当于代码运行的大门,一......
  • 大话考研数据结构:第3篇 数据结构的基本概念(下)
    1数据结构        数据结构(datastructure)是指相互之间存在一种或多种特定关系的数据元素的集合。现实世界中,任何的数据元素并非孤立存在的,它们之间存在千丝万缕的某种关系,它们的这种称之为“结构”。简而言之,数据结构是相互之间存在一种或多种特定关系的数据元素的......
  • C语言:头歌课程设计(未完结,慎入)
    第1关:【课程设计】Init任务描述你需要将一系列的学生期末考试信息进行存储(学生人数不会超过100)。每个学生的信息包括:姓名(由firstname和lastname两部分组成,例如JingyuLI,first_name="Jingyu"last_name="LI");学号(12位数字组成,开头4位为2022、2021、2020);C......
  • C语言简单学习(obsidian打开)
    ##变量与类型###整数C给我们提供了下列定义整数的类型:-`char`-`int`-`short`-`long`通常,你很可能会使用 `int` 保存整数。但是在某些情况下,你或许想在其它三个选项中选取合适的类型。`char` 类型通常被用来保存ASCII表中的字母,但是它也可以用来保存 `-128......
  • 【数据结构】遍历二叉树(递归思想)-->赋源码
    欢迎来到我的Blog,点击关注哦......
  • Day03 链表概念与单向不循环链表的实现
    目录1、顺序表的优缺点2、链式存储的线性表3、单向不循环链表实现1、顺序表的优缺点顺序表的优点是:        由于顺序表数据元素的内存地址都是连续的,所以可以实现随机访问,而且不需要多余的信息来描述相关的数据,所以存储密度高。顺序表的缺点是:       ......
  • 初识C语言难点~~指针变量
    目录前言 一、什么是指针变量二、定义指针变量1、代码12、代码2(通过指针变量取得数据) 三、通过指针变量来交换主函数两个变量1、【正确示例】2、【错误示例】四、总结 前言大家好又见面了!!今天要说的是指针变量。 一、什么是指针变量指针变量是一种特殊的变......
  • 初识C语言~~查找票数最高候选人
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、题目描述二、解题思路三、编写代码总结前言提示:这里可以添加本文要记录的大概内容:大家好又见面喽!!今天是刷题,二话不说开干。提示:以下是本篇文章正文内容,下面案例可供参考一、题目......