C语言实现双向链表:插入和删除
抽象数据类型
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语言实现双向链表:插入和删除相关推荐
- c语言链表的插入 查询 删除
c语言实验十五链表 链表的插入 查询 删除, 不会吧,来看看月腾兄的: #include<stdio.h> #include<stdlib.h> struct node {in ...
- 双向链表插入、删除操作
来源:http://blog.csdn.net/csdanca11/article/details/7173856 双向链表 循环单链表的出现,虽然能够实现从任一结点出发沿着链能找到其前驱结点,但时间 ...
- c语言删除文件中的结构体_C语言插入、删除、更改文件内容
我们平时所见的文件,例如 txt.doc.mp4 等,文件内容是按照从头到尾的顺序依次存储在磁盘上的,就像排起一条长长的队伍,称为顺序文件. 除了顺序文件,还有索引文件.散列文件等,一般用于特殊领域, ...
- 第十一章 文件操作_C语言插入、删除、更改文件内容
我们平时所见的文件,例如 txt.doc.mp4 等,文件内容是按照从头到尾的顺序依次存储在磁盘上的,就像排起一条长长的队伍,称为顺序文件. 除了顺序文件,还有索引文件.散列文件等,一般用于特殊领域, ...
- c语言数组指定位置插入和删除_玩转C语言链表,单链表/双向链表的建立/遍历/插入/删除...
最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...
- (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作
http://blog.csdn.net/fisherwan/article/details/19760681 上午写了下单向循环链表的程序,今天下午我把双向链表的程序写完了.其实双向链表和单向链表也 ...
- c语言怎么创建循环链表,纯C语言实现循环双向链表创建,插入和删除
#include #includetypedefintElemType; typedefstructDLNode{ ElemType data;struct DLNode *next;struct D ...
- C语言双向链表的插入与删除
数据结构复习1.2--双向链表的插入与删除 插入元素 删除元素 代码:和单链表差不多,不会就画一画,就写出来了 //双向链表的插入与删除 #include<stdio.h> #includ ...
- c语言二叉排序树的创建与查找,C语言实现二叉查找树的插入和删除操作问题求教...
使用C语言实现二叉查找树的插入和删除操作,但在 return searchBST( T->rchild, val, f, p);出错.这里应该使用了双指针,求教应该怎么改才正确. /* +--- ...
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
http://blog.csdn.net/fisherwan/article/details/19801993 双向循环链表是基于双向链表的基础上实现的,和双向链表的操作差不多,唯一的区别就是它是个循 ...
最新文章
- python把光标定义到指定的位置并删除之前的字符_python 批量修改预定字符串并将修改后的字符串插入文件指定位置...
- Huffman 编码压缩算法
- idea没有git选项
- Shallow Copy Deep Copy in Python list
- Linux内存管理--物理内存分配【转】
- Eclipse 中 工程 引用 其他 工程的 配置方法。
- (转)Managed DirectX +C# 开发(入门篇)(六)
- 天猫行业资深店长认证
- Python数据分析之智联招聘职位分析完整项目(数据爬取,数据分析,数据可视化)
- 几个有效防止服务器攻击的小妙招
- 《Java解惑》系列——02字符谜题——谜题11:最后的笑声(字符、字符串连接操作)
- 孤军大作战!疯狂DIY 1U硬件防火墙实录(转)
- 分门别类刷PAT甲级
- LaTex 如何生成参考文献
- 第十三届蓝桥杯大赛软件组省赛 Python大学A组 个人题解
- 什么是淘宝私域流量?和公域流量流量有何区别?
- 计算机网络概念基础——分组交换
- 编译x86 release版本libcurl,支持https
- 如何打开 plist 文件
- 大学生必学练习题 - Java 语言经典50例