C语言实现数据结构和双向链表操作

数据结构  双向链表的实现

双向链表中的每一个结点都含有两个指针域,一个指针域存放其后继结点的存储地址,另一个指针域则存放其前驱结点的存储地址。

双向链表结点的类型描述:

//双向链表的类型描述
typedef int ElemType;
typedef struct node{
 ElemType data;
 struct node *prior,*next;
}DuLNode,*DuLinkList;

其中,prior域存放的是其前驱结点的存储地址,next域存放的是其后继结点的存储地址。

双向链表有两个特点:

一是可以从两个方向搜索某个结点,这使得链表的某些操作(如插入和删除)变得比较简单; 二是无论利用前链还是后链都可以遍历整个双向链表。

双向链表的操作基本和单链表的操作相同;

1. 头插法创建带头结点的双向链表Create_DLinkListF(int n)

//头插法创建带头结点的双向链表
DuLinkList Create_DLinkListF(int n){
 DuLinkList L,p;
 int i = n - 1;
 ElemType x;
 //新建头结点
 L = (DuLinkList)malloc(sizeof(DuLNode));
 L->prior = NULL;
 L->next = NULL; 

 //添加第一个结点
 scanf("%d",&x);
 p = (DuLinkList)malloc(sizeof(DuLNode));
 p->data = x;
 L->next = p;
 p->prior = L;
 p->next = NULL; 

 //加入其他结点
 while(i > 0){
 scanf("%d",&x);
 p = (DuLinkList)malloc(sizeof(DuLNode));
 p->data = x; 

 p->next = L->next;
 L->next->prior = p;
 p->prior = L;
 L->next = p; 

 i--;
 }
 return L;
}

2. 尾插法创建带头结点的双向链表Create_DLinkListR(int n)

//尾插法创建带头结点的双向链表
DuLinkList Create_DLinkListR(int n){
 DuLinkList L,p,lastNode;
 int i = n - 1;
 ElemType x;
 //新建头结点
 L = (DuLinkList)malloc(sizeof(DuLNode));
 L->prior = NULL;
 L->next = NULL; 

 //添加第一个结点
 scanf("%d",&x);
 p = (DuLinkList)malloc(sizeof(DuLNode));
 p->data = x;
 L->next = p;
 p->prior = L;
 p->next = NULL; 

 lastNode = p;
 //加入其他结点
 while(i > 0){
 scanf("%d",&x);
 p = (DuLinkList)malloc(sizeof(DuLNode));
 p->data = x; 

 lastNode->next = p;
 p->prior = lastNode;
 p->next = NULL; 

 lastNode = p;
 i--; 

 }
 return L; 

}

3. 在指定结点之前插入新结点Insert_DLinkListBefore(DuLinkList p,ElemType x)

//在指定结点之前插入新结点
void Insert_DLinkListBefore(DuLinkList p,ElemType x){
 DuLinkList newNode;
 //判断结点p之前的结点的合法性:
 if(p->prior == NULL)
 printf("结点不合法,不能在该结点之前插入结点\n");
 else{
 newNode = (DuLinkList)malloc(sizeof(DuLNode));
 newNode->data = x; 

 newNode->next = p;
 p->prior->next = newNode;
 newNode->prior = p->prior;
 p->prior = newNode;
 }
}

4. 在指定结点之后插入新结点Insert_DLinkListAfter(DuLinkList p,ElemType x)

//在指定结点之后插入新结点
void Insert_DLinkListAfter(DuLinkList p,ElemType x){ 

 DuLinkList newNode;
 newNode = (DuLinkList)malloc(sizeof(DuLNode));
 newNode->data = x; 

 //当插入位置是最后一个结点之后时
 if(p->next == NULL){
 p->next = newNode;
 newNode->prior = p;
 newNode->next = NULL;
 }
 else{
 newNode->next = p->next;
 p->next->prior = newNode;
 p->next = newNode;
 newNode->prior = p;
 }
}

5. 删除指定结点Delete_DLinkList(DuLinkList p)

//删除指定结点
void Delete_DLinkList(DuLinkList p){
 //如果删除的是最后一个元素
 if(p->next == NULL)
 p->prior->next = NULL; 

 else{
 p->prior->next = p->next;
 p->next->prior = p->prior; 

 }
 free(p);
}

6. 后链输出双向链表Print_DLinkListN(DuLinkList L)

//后链输出双向链表
void Print_DLinkListN(DuLinkList p){ 

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

}

7.前链输出双向链表Print_DLinkListP(DuLinkList p)

//前链输出双向链表
void Print_DLinkListP(DuLinkList p){ 

 while(p != NULL){
 printf("%d\t",p->data);
 p = p-prior;
 }
 printf("\n");
}

至于双向链表的其他操作,如定位,和单链表的操作类同,不再赘述。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • C语言数据结构 双向链表的建立与基本操作

    C语言数据结构 双向链表的建立与基本操作 双向链表比单链表有更好的灵活性,其大部分操作与线性表相同.下面总结双向链表与单链表之间的不同之处及我在实现过程中所遇到的问题. 1.双向链表的建立 双向链表在初始化时,要给首尾两个节点分配内存空间.成功分配后,要将首节点的prior指针和尾节点的next指针指向NULL,这是十分关键的一步,因为这是之后用来判断空表的条件.同时,当链表为空时,要将首节点的next指向尾节点,尾节点的prior指向首节点. 2.双向链表的插入操作 由于定义双向链表时指针域中

  • C语言 数据结构双向链表简单实例

    双向链表的基本操作 1.利用尾插法建立一个双向链表. 2.遍历双向链表. 3.实现双向链表中删除一个指定元素. 4.在非递减有序双向链表中实现插入元素e仍有序算法. 5.判断双向链表中元素是否对称若对称返回1否则返回0. 6.设元素为正整型,实现算法把所有奇数排列在偶数之前. 7.在主函数中设计一个简单的菜单调试上述算法. 实例代码: //排序的时候因为没有说明奇数和偶数需不需要各自再排序,我就没有排序,只是将奇数放在偶数后面. //创建链表的时候,因为这个实验没有要求输出链表的长度,所以我就输

  • C语言中双向链表和双向循环链表详解

    双向链表和双向循环链表 和单向链表相比,多了一个前驱结点.如果他为空,那么next和prior都指向自己.而对于双循环链表,只需要最后一个元素的next指向head->next,head->next的prior指向最后一个节点即可. 插入操作 新节点s插入链表,s->next给p结点,s->prior给p->prior,然后,p->prior->next指向s,p->prior再指向s.顺序需要注意 s->next = p; s->prior =

  • C语言双向链表实现根据使用频率安排元素位置的功能实例代码

    C语言双向链表应用 前言: 平时使用音乐播放器时,播放列表中的歌曲可以很方便地进行增添,删除,去重等操作.但其本质都可以抽象成一个双向链表.为了更方便用户的使用,我认为还可以增加一个将最常播放的音乐放在播放列表的头部的功能,那么如何实现呢? 请看代码: #include<stdio.h> #include<stdlib.h> #include<time.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALS

  • java 实现双向链表实例详解

    java 实现双向链表实例详解 双向链表是一个基本的数据结构,在Java中LinkedList已经实现了这种结构,不过作为开发者,也要拥有自己显示这种结构的能力.话不多说,上代码:     首先是链表的节点类: /** * 链表节点 * @author Administrator * * @param <T> */ public class ChainNode<T> { private T data; //对象编号 private int dataNo; public ChainN

  • C语言之双向链表详解及实例代码

    1,双向链表简介. 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 2,例子要求: 完成双向链表的插入.删除以及查找,将学生管理系统使用的数组,以双向链表的方式实现,能够支持无限制的学生人数的增删改查以及保存. 3,代码实现. #include <stdio.h> #include <string.h> #include <

  • C语言实现数据结构和双向链表操作

    数据结构  双向链表的实现 双向链表中的每一个结点都含有两个指针域,一个指针域存放其后继结点的存储地址,另一个指针域则存放其前驱结点的存储地址. 双向链表结点的类型描述: //双向链表的类型描述 typedef int ElemType; typedef struct node{ ElemType data; struct node *prior,*next; }DuLNode,*DuLinkList; 其中,prior域存放的是其前驱结点的存储地址,next域存放的是其后继结点的存储地址. 双

  • C语言编程数据结构线性表之顺序表和链表原理分析

    目录 线性表的定义和特点 线性结构的特点 线性表 顺序存储 顺序表的元素类型定义 顺序表的增删查改 初始化顺序表 扩容顺序表 尾插法增加元素 头插法 任意位置删除 任意位置添加 线性表的链式存储 数据域与指针域 初始化链表 尾插法增加链表结点 头插法添加链表结点 打印链表 任意位置的删除 双向链表 测试双向链表(主函数) 初始化双向链表 头插法插入元素 尾插法插入元素 尾删法删除结点 头删法删除结点 doubly-Linked list.c文件 doubly-Linkedlist.h 线性表的定

  • C语言编程数据结构的栈和队列

    目录 栈 数组实现 标题全部代码 Stack_array.c Stack_array.h 初始化数组栈 满栈后扩容 是否为空栈 压栈和退栈 链表实现 stack_chain.h stack_chain.c 整个压栈流程 整个弹栈流程 出栈情况 队列 队列的实现 queue_chain.h queue_chain.c 一个结构体类型用于维护这个队列 概念流程图 入队列的实现 出队列的实现 是否空队 栈 栈是一种以后进先出为顺序对对象进行添加或删除的数据结构 对栈进行形象记忆就像是桌子上的一堆书或一

  • C#数据结构之双向链表(DbLinkList)实例详解

    本文实例讲述了C#数据结构之双向链表(DbLinkList).分享给大家供大家参考,具体如下: 这是继上一篇<C#数据结构之单链表(LinkList)实例详解>的继续,对于双向链接,节点上除了Next属性外,还要有Prev属性用来指向前一个节点,DbNode定义如下: namespace 线性表 { public class DbNode<T> { private T data; private DbNode<T> prev; private DbNode<T&g

  • 数据结构串的操作实例详解

    数据结构串的操作实例详解 串是一种特殊的线性表,它的每个结点是一个字符,所以串也称作字符串. 关于串的操作主要有求串长,串复制,串连接,求子串,串插入,串删除,子串定位等.串的操作也是C语言笔试中常考的一部分. 下面的代码实现了串的主要操作. #include <stdio.h> #include <stdlib.h> #define MAXSIZE 20 char *String_Create(); //创建串 int String_Length(char *s); //求串长

  • Python数据结构之双向链表的定义与使用方法示例

    本文实例讲述了Python数据结构之双向链表的定义与使用方法.分享给大家供大家参考,具体如下: 和单链表类似,只不过是增加了一个指向前面一个元素的指针而已. 示意图: python 实现代码: #!/usr/bin/python # -*- coding: utf-8 -*- class Node(object): def __init__(self,val,p=0): self.data = val self.next = p self.prev = p class LinkList(obje

  • Java语言实现数据结构栈代码详解

    近来复习数据结构,自己动手实现了栈.栈是一种限制插入和删除只能在一个位置上的表.最基本的操作是进栈和出栈,因此,又被叫作"先进后出"表. 首先了解下栈的概念: 栈是限定仅在表头进行插入和删除操作的线性表.有时又叫LIFO(后进先出表).要搞清楚这个概念,首先要明白"栈"原来的意思,如此才能把握本质. "栈"者,存储货物或供旅客住宿的地方,可引申为仓库.中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈.出栈的说法. 实现方式是

  • JavaScript 双向链表操作实例分析【创建、增加、查找、删除等】

    本文实例讲述了JavaScript 双向链表操作.分享给大家供大家参考,具体如下: 一个 双向链表(doubly linked list) 是由一组称为节点的顺序链接记录组成的链接数据结构.每个节点包含两个字段,称为链接,它们是对节点序列中上一个节点和下一个节点的引用 开始节点和结束节点的上一个链接和下一个链接分别指向某种终止节点,通常是前哨节点或null,以方便遍历列表.如果只有一个前哨节点,则列表通过前哨节点循环链接.它可以被概念化为两个由相同数据项组成的单链表,但顺序相反. class D

  • C利用语言实现数据结构之队列

    目录 一.链队列 二.链队的表示 三.链队的基本操作 1. 链队的初始化 2. 链队的销毁 3. 入队 4. 出队 四.顺序队列 五.循环队列 1. 初始化 2. 求队列长度 3. 入队 4. 出队 前言: 队列在生活中也比较常见,例如购物排队--新来的成员总是加入队尾,每次离开的成员总是队列头上的. 队列按存储方式可以分为两种:顺序队列和链队列. 一.链队列 链式队列中每个元素定义成一个结点,含数据域与指针域(指向下一结点),并设头尾指针.用图表示就是. 二.链队的表示 前面的链式结构,总是使

  • Python数据结构之双向链表详解

    目录 0. 学习目标 1. 双向链表简介 1.1 双向链表介绍 1.2 双向链表结点类 1.3 双向链表优缺点 2. 双向链表实现 2.1 双向链表的初始化 2.2 获取双向链表长度 2.3 读取指定位置元素 2.4 查找指定元素 2.5 在指定位置插入新元素 2.6 删除指定位置元素 2.7 其它一些有用的操作 3. 双向链表应用 3.1 双向链表应用示例 3.2 利用双向链表基本操作实现复杂操作 0. 学习目标 单链表只有一个指向直接后继的指针来表示结点间的逻辑关系,因此可以方便的从任一结点

随机推荐