c实现双向链表
实现双向链表:创建、插入、删除
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h> using namespace std; typedef struct student
{
int data;
struct student *next;
struct student *pre;
}dnode; //创建链表
dnode *create()
{
//1. 定义变量
dnode *head = NULL;
dnode *p = NULL;
dnode *s = NULL;
int x = ;
int cycle = ; //2. 新建head
head = (dnode*)malloc(sizeof(dnode));
p = head; //3. 添加节点
while(cycle)
{
printf("input the data:");
scanf("%d", &x); if (x != )
{
s = (dnode*)malloc(sizeof(dnode));
s->data = x;
p->next = s;
s->pre = p;
p = s;
}
else
{
cycle = ;
}
} //4. 删除 head
p->next = NULL;
p = head;
head = head->next;
free(p);
p = NULL; //5. 返回 head
return head;
} //插入节点
dnode *insert(dnode *head, int num)
{
//1. 定义变量
dnode *p0 = NULL;
dnode *p1 = NULL;
p1 = head; //2. 新建节点
p0 = (dnode*)malloc(sizeof(dnode));
p0->data = num; //3. 定位插入位置(升序)
while(p0->data > p1->data && p1->next != NULL)
{
p1 = p1->next;
} //4. 插入新节点
if (p0->data > p1->data) //尾
{
p1->next = p0;
p0->pre = p1;
p0->next = NULL;
}
else
{ if (head == p1) //头
{
p0->next = p1;
p1->pre = p0;
head = p0;
}
else //中间
{
p1->pre->next = p0;
p0->next = p1;
p0->pre = p1->pre;
p1->pre = p0;
}
} //5. 返回 head
return head;
} //删除节点
dnode *del(dnode *head, int num)
{
//1. 定义变量
dnode *p = NULL;
p = head; //2. 定位节点
while (num != p->data && p->next != NULL)
{
p = p->next;
} //3. 删除节点
if (num != p->data)
{
printf("not found:%d\n", num);
}
else
{
if (p == head) //头
{
head = p->next;
head->pre = NULL;
free(p);
}
else if (p->next == NULL) //尾
{
p->pre->next = NULL;
free(p);
}
else //中间
{
p->next->pre = p->pre;
p->pre->next = p->next;
free (p);
}
} return head;
} //计算链表长度
int length(dnode *head)
{
dnode *p;
int n = ;
p = head; while(p != NULL)
{
p = p->next;
n++;
} printf("len:%d\n", n);
return n;
} //显示
void show(dnode *head)
{
dnode *p;
int n = ;
p = head; while(p != NULL)
{
printf("data:%d ", p->data);
p = p->next;
}
printf("\n");
} int main()
{
dnode *head = create();
show(head);
length(head); head = insert(head, );
show(head); head = del(head, );
show(head); }
c实现双向链表的更多相关文章
- 学习Redis你必须了解的数据结构——双向链表(JavaScript实现)
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/ 下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧.对链表 ...
- 双向链表、双向循环链表的JS实现
关于链表简介.单链表.单向循环链表.JS中的使用以及扩充方法: 单链表.循环链表的JS实现 关于四种链表的完整封装: https://github.com/zhuwq585/Data-Structu ...
- 剑指Offer面试题:25.二叉搜索树与双向链表
一.题目:二叉搜索树与双向链表 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.比如输入下图中左边的二叉搜索树,则输出转换之后的 ...
- Linux 内核数据结构:Linux 双向链表
Linux 内核提供一套双向链表的实现,你可以在 include/linux/list.h 中找到.我们以双向链表着手开始介绍 Linux 内核中的数据结构 ,因为这个是在 Linux 内核中使用最为 ...
- Linux 内核数据结构:双向链表
Linux 内核提供一套双向链表的实现,你可以在 include/linux/list.h 中找到.我们以双向链表着手开始介绍 Linux 内核中的数据结构 ,因为这个是在 Linux 内核中使用最为 ...
- 线性表-双向链表(LinkedList)
双向链表:如图1-3 所示,会把当前header拆分开,重新插入一个Entry<E>. LinkedList源码 0.首先这个类中的两个变量 private transient Entry ...
- Shuffling Machine和双向链表
1. 双向链表 https://github.com/BodhiXing/Data_Structure 2. Shuffling Machine https://pta.patest.cn/pta/t ...
- MS - 1 - 把二元查找树转变成排序的双向链表
## 1. 把二元查找树转变成排序的双向链表 ## ### 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. ### 要求不能创建任何新的结点,只调整指针的指向. 10 ...
- javascript中的链表结构—双向链表
1.概念 上一个文章里我们已经了解到链表结构,链表的特点是长度不固定,不用担心插入新元素的时候新增位置的问题.插入一个元素的时候,只要找到插入点就可以了,不需要整体移动整个结构. 这里我们了解一下双向 ...
- Java自己实现双向链表LinkList
/** * <p> * Node 双向链表实体类 * <p> * * @author <a href="mailto:yangkj@corp.21cn.com& ...
随机推荐
- Nomogram(诺莫图) | Logistic、Cox生存分析结果可视化
本文首发于“生信补给站”公众号,https://mp.weixin.qq.com/s/BWpy3F-nEKXCdVXmY3GYZg 当然还有更多R语言,生物信息学相关知识...
- 简单二次封装的Golang图像处理库:图片裁剪
简单二次封装的Golang图像处理库:图片裁剪 一.功能 Go语言下的官方图像处理库 简单封装后对jpg和png图像进行缩放/裁剪的库 二.使用说明 1.首先下载 go get -v -u githu ...
- 区间dp最长回文子序列问题
状态转移方程如下: 当i > j时,dp[i,j]= 0. 当i = j时,dp[i,j] = 1. 当i < j并且str[i] == str[j]时,dp[i][j] = dp[i+1 ...
- (三)使用Intent在活动中穿梭:显式和隐式Intent
一.显式Intent @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstan ...
- 从零开始学ios开发(二):Hello World!
今天看了书的第二章,主要介绍了一下Xcode的使用方法和一些必要的说明,最后做了一个“Hello World!”的小程序,其实就是在屏幕上用一个Label显示“Hello World!”,一行代码都没 ...
- js入门之数组
数组是一种数据类型,数组可以存储很多项, 有序,集合 Array 定义: var names = ['zs','ls','ww','zl'] 访问: 用索引或/下标 数组可以存储多种类型的数据 但是一 ...
- Python TCP通信之仿文件下载
TCP_文件下载_Client.py import socket def main(): # 创建TCP套接字 tcp_socket = socket.socket(socket.AF_INET, s ...
- SAP WebIDE里UI5应用的隐藏文件project.json
在SAP WebIDE UI5应用编辑器里的菜单View->Show Hidden files点击后,即可发现项目文件夹下有一个隐藏文件project.json: 内容如下: 这也解释了为什么b ...
- 用mybatis将SQL查询语句”select * from user”的封装为配置文件
用mybatis将SQL查询语句”select * from user”的封装为配置文件 定义一个xml映射文件,文件名见名知意.如user-mapper.xml,文件内容如下: <?xml v ...
- Sqlmap对dvwa进行sql注入测试
前提准备条件: 1.下载安装dvwa,下载链接地址:http://www.dvwa.co.uk/.2.需要安装python运行环境.3.下载sqlmap包并将其解压. 一.查看所有的数据库;(其中db ...