抽象数据类型

typedef sturct DuLnode
{int data;struct DuLnode* next, *prior;
}DuLnode, *DuLinklist;

带头结点的双向链表:头节点的prior域为空,尾节点的next域为空。
双向循环链表:头节点的前驱指针指向尾节点,尾节点的后继指针指向头节点。

双向链表的头插法创建

(带头节点)
1.插入第一个节点和后续插入节点的方式有所不同,插入第一个节点的时候不需要考虑后继节点,从第二个插入节点需要考虑到前驱指针和后继指针的操作。

//插入第一个节点时
if(L->next == NULL)
{L->next = newNode;//头节点的next域指向新插入的第一个节点newNode->prior = L;//新插入的第一个节点的前驱指针指向头节点newNode->next = NULL;//将新插入的第一个节点的next赋空
}
//从插入第二个节点开始
newNode->next = L->next;//将上一个插入的节点连接到新插入的节点的next域
L->next->prior = newNode;//将上一个插入的节点的prior域指向新插入的节点
newNode->prior = L;//新插入节点的prior域指向头节点
L->next = newNode;//头节点的next域指向新插入的节点
//注意:要注意改变指针指向的顺序,不能先改变指向上一个节点(L->next)的指针指向,否则会找不到上一个节点的地址

双向链表的插入

s->prior = p->prior;//将要插入的节点的前驱指针指向前继节点
p->prior->next = s;//把前继节点的next域指向要插入节点
s->next = p;//要插入节点的后继指针指向后继节点(p指向的节点)
p->prior = s;//已知的p指向的节点的前驱指针指向要插入的节点(s指向的节点)

双向链表的删除

temp->prior->next = temp->next;//该删除节点的前驱节点的next域连接到该删除节点的后继节点
temp->next->prior = temp->prior;//该删除节点的后继节点的prior域连接到该删除节点的前驱节点
free(temp);

整体代码实现

#include <stdio.h>
#include <stdlib.h>typedef struct DuLnode
{int data;struct DuLnode *next, *prior;
}DuLnode, *DuLLinklist;DuLLinklist CreateDuLlist(DuLLinklist L, int n)
{//创建头节点L->next = NULL;L->prior = NULL;//头插法创建双向链表//头插法,插入的第一个节点和后续要插入的节点的方式有所不同//插入第一个节点不需要考虑后继节点//第二个节点开始要考虑后继节点的前驱指针for(int i = 0; i < n; i++){DuLLinklist newNode = (DuLLinklist)malloc(sizeof(DuLnode));printf("请输入要插入的节点值:");scanf("%d", &newNode->data);if(L->next == NULL)//插入第一个节点时{L->next = newNode;//头节点的next域指向新插入的节点newNode->prior = L;//新插入节点的prior域指向头节点newNode->next = NULL;//新插入节点的next赋空}else//插入后续节点{newNode->next = L->next;//将上一个插入的节点连接到新插入的节点的next域L->next->prior = newNode;//将上一个插入的节点的前驱prior域指向新插入的节点newNode->prior = L;//新插入节点的前驱域指向头节点L->next = newNode;//头节点的next域指向新插入的节点}}
}void Printlist(DuLLinklist L, int n)
{DuLLinklist temp = L->next;printf("链表为:");for(int i = 0; i < n; i++){printf("%d ", temp->data);temp = temp->next;}
}DuLLinklist Listdelete(DuLLinklist L, int i)
{//DuLLinklist s = (DuLLinklist)malloc(sizeof(DuLnode));DuLLinklist temp = (DuLLinklist)malloc(sizeof(DuLnode));temp = L->next;int cnt = 1;while(cnt != i)//找到第i个要删除的节点{temp = temp->next;cnt++;}if(temp->next != NULL){int e = temp->data;//保留要删除节点的数据temp->prior->next = temp->next;//该删除节点的前驱节点的next域连接到该删除节点的后继节点temp->next->prior = temp->prior;//该删除节点的后继节点的prior域连接到该删除节点的前驱节点free(temp);}else//如果删除的是最后一个节点{temp->prior->next = NULL;free(temp);}
}
int main()
{DuLLinklist L = (DuLLinklist)malloc(sizeof(DuLnode));int n, i;printf("请输入要创建多少个节点:");scanf("%d", &n);CreateDuLlist(L, n);printf("链表为:");Printlist(L, n);printf("输入要删除的节点:");scanf("%d", &i);Listdelete(L, i);Printlist(L, n);return 0;
}

C语言实现双向链表:插入和删除相关推荐

  1. c语言链表的插入 查询 删除

    c语言实验十五链表 链表的插入 查询 删除, 不会吧,来看看月腾兄的: #include<stdio.h> #include<stdlib.h> struct node {in ...

  2. 双向链表插入、删除操作

    来源:http://blog.csdn.net/csdanca11/article/details/7173856 双向链表 循环单链表的出现,虽然能够实现从任一结点出发沿着链能找到其前驱结点,但时间 ...

  3. c语言删除文件中的结构体_C语言插入、删除、更改文件内容

    我们平时所见的文件,例如 txt.doc.mp4 等,文件内容是按照从头到尾的顺序依次存储在磁盘上的,就像排起一条长长的队伍,称为顺序文件. 除了顺序文件,还有索引文件.散列文件等,一般用于特殊领域, ...

  4. 第十一章 文件操作_C语言插入、删除、更改文件内容

    我们平时所见的文件,例如 txt.doc.mp4 等,文件内容是按照从头到尾的顺序依次存储在磁盘上的,就像排起一条长长的队伍,称为顺序文件. 除了顺序文件,还有索引文件.散列文件等,一般用于特殊领域, ...

  5. c语言数组指定位置插入和删除_玩转C语言链表,单链表/双向链表的建立/遍历/插入/删除...

    最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...

  6. (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作

    http://blog.csdn.net/fisherwan/article/details/19760681 上午写了下单向循环链表的程序,今天下午我把双向链表的程序写完了.其实双向链表和单向链表也 ...

  7. c语言怎么创建循环链表,纯C语言实现循环双向链表创建,插入和删除

    #include #includetypedefintElemType; typedefstructDLNode{ ElemType data;struct DLNode *next;struct D ...

  8. C语言双向链表的插入与删除

    数据结构复习1.2--双向链表的插入与删除 插入元素 删除元素 代码:和单链表差不多,不会就画一画,就写出来了 //双向链表的插入与删除 #include<stdio.h> #includ ...

  9. c语言二叉排序树的创建与查找,C语言实现二叉查找树的插入和删除操作问题求教...

    使用C语言实现二叉查找树的插入和删除操作,但在 return searchBST( T->rchild, val, f, p);出错.这里应该使用了双指针,求教应该怎么改才正确. /* +--- ...

  10. (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作

    http://blog.csdn.net/fisherwan/article/details/19801993 双向循环链表是基于双向链表的基础上实现的,和双向链表的操作差不多,唯一的区别就是它是个循 ...

最新文章

  1. python把光标定义到指定的位置并删除之前的字符_python 批量修改预定字符串并将修改后的字符串插入文件指定位置...
  2. Huffman 编码压缩算法
  3. idea没有git选项
  4. Shallow Copy Deep Copy in Python list
  5. Linux内存管理--物理内存分配【转】
  6. Eclipse 中 工程 引用 其他 工程的 配置方法。
  7. (转)Managed DirectX +C# 开发(入门篇)(六)
  8. 天猫行业资深店长认证
  9. Python数据分析之智联招聘职位分析完整项目(数据爬取,数据分析,数据可视化)
  10. 几个有效防止服务器攻击的小妙招
  11. 《Java解惑》系列——02字符谜题——谜题11:最后的笑声(字符、字符串连接操作)
  12. 孤军大作战!疯狂DIY 1U硬件防火墙实录(转)
  13. 分门别类刷PAT甲级
  14. LaTex 如何生成参考文献
  15. 第十三届蓝桥杯大赛软件组省赛 Python大学A组 个人题解
  16. 什么是淘宝私域流量?和公域流量流量有何区别?
  17. 计算机网络概念基础——分组交换
  18. 编译x86 release版本libcurl,支持https
  19. 如何打开 plist 文件
  20. 大学生必学练习题 - Java 语言经典50例

热门文章

  1. 单片机综合实验 - 05 | 简易电子钟设计
  2. c++的一些工具库介绍
  3. Java四则运算小游戏(用户图形界面)
  4. 服务器V6型号什么意思,ipv6接口是什么意思
  5. html 滤镜制作线条,PS滤镜简单制作炫酷的线条效果
  6. SUN服务器可能遇到得问题总结(一)
  7. 折磨人,中国人的最爱
  8. html5微信预约挂号源码,微信大转盘html5代码
  9. Java 验证中文内容
  10. android 中的悬浮按钮,Android 中FloatingActionButton(悬浮按钮)实例详解