• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言实现数据结构和双向链表操作

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

作者:jesson20121020 字体:[增加 减小] 来源:互联网 时间:2017-05-28

jesson20121020 通过本文主要向大家介绍了c语言实现双向链表,c语言创建双向链表,c语言双向链表,c语言双向循环链表,c语言双向链表实例等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

数据结构  双向链表的实现

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

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

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

 其中,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; 
} 
</div>

         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; 
 
} 
    </div>

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; 
 } 
} 
</div>

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; 
 } 
} 
</div>

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); 
} 
</div>

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

//后链输出双向链表 
void Print_DLinkListN(DuLinkList p){ 
 
 while(p != NULL){ 
 printf("%d\t",p->data); 
 p = p->next; 
 } 
 printf("\n"); 
 
} 
</div>

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

//前链输出双向链表 
void Print_DLinkListP(DuLinkList p){ 
 
 while(p != NULL){ 
 printf("%d\t",p->data); 
 p = p-prior; 
 } 
 printf("\n"); 
} 
 
</div>

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

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C语言双向链表实现根据使用频率安排元素位置的功能实例代码
  • C语言数据结构 双向链表的建立与基本操作
  • C语言实现数据结构和双向链表操作
  • C语言 数据结构双向链表简单实例
  • C语言之双向链表详解及实例代码
  • C语言单链表的实现
  • C语言实现输出链表中倒数第k个节点
  • C语言双向链表的表示与实现实例详解
  • 用C语言实现单链表的各种操作(二)
  • 用C语言实现单链表的各种操作(一)

相关文章

  • 2017-05-28C++编写DLL动态链接库的步骤与实现方法
  • 2017-05-28C++ 成员变量的初始化顺序问题详解
  • 2017-05-28C++可变参数的函数与模板实例分析
  • 2017-05-28C语言基础之malloc和free函数详解
  • 2017-05-28c++统计文件中字符个数代码汇总
  • 2017-05-28C++ 模拟实现list(迭代器)实现代码
  • 2017-05-28Cocos2d-x中使用CCScrollView来实现关卡选择实例
  • 2017-05-28浅谈C++ Explicit Constructors(显式构造函数)
  • 2017-05-28使用dc画笔画矩形、直线与椭圆示例
  • 2017-05-28详解Linux的SOCKET编程

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++之Boost::array用法简介
    • C语言实现对bmp格式图片打码
    • 数据结构之伸展树详解
    • C++实现迷宫算法实例解析
    • 浅谈C语言共用体和与结构体的区别
    • 数组中求第K大数的实现方法
    • 举例讲解C语言对归并排序算法的基础使用
    • C语言中的内联函数(inline)与宏定义(#define)详细解析
    • C++ read函数读入int整形数据
    • C++如何通过ostringstream实现任意类型转string

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有