实现双向链表:创建、插入、删除

#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实现双向链表的更多相关文章

  1. 学习Redis你必须了解的数据结构——双向链表(JavaScript实现)

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/ 下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧.对链表 ...

  2. 双向链表、双向循环链表的JS实现

    关于链表简介.单链表.单向循环链表.JS中的使用以及扩充方法:  单链表.循环链表的JS实现 关于四种链表的完整封装: https://github.com/zhuwq585/Data-Structu ...

  3. 剑指Offer面试题:25.二叉搜索树与双向链表

    一.题目:二叉搜索树与双向链表 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.比如输入下图中左边的二叉搜索树,则输出转换之后的 ...

  4. Linux 内核数据结构:Linux 双向链表

    Linux 内核提供一套双向链表的实现,你可以在 include/linux/list.h 中找到.我们以双向链表着手开始介绍 Linux 内核中的数据结构 ,因为这个是在 Linux 内核中使用最为 ...

  5. Linux 内核数据结构:双向链表

    Linux 内核提供一套双向链表的实现,你可以在 include/linux/list.h 中找到.我们以双向链表着手开始介绍 Linux 内核中的数据结构 ,因为这个是在 Linux 内核中使用最为 ...

  6. 线性表-双向链表(LinkedList)

    双向链表:如图1-3 所示,会把当前header拆分开,重新插入一个Entry<E>. LinkedList源码 0.首先这个类中的两个变量 private transient Entry ...

  7. Shuffling Machine和双向链表

    1. 双向链表 https://github.com/BodhiXing/Data_Structure 2. Shuffling Machine https://pta.patest.cn/pta/t ...

  8. MS - 1 - 把二元查找树转变成排序的双向链表

    ## 1. 把二元查找树转变成排序的双向链表 ## ### 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. ### 要求不能创建任何新的结点,只调整指针的指向. 10       ...

  9. javascript中的链表结构—双向链表

    1.概念 上一个文章里我们已经了解到链表结构,链表的特点是长度不固定,不用担心插入新元素的时候新增位置的问题.插入一个元素的时候,只要找到插入点就可以了,不需要整体移动整个结构. 这里我们了解一下双向 ...

  10. Java自己实现双向链表LinkList

    /** * <p> * Node 双向链表实体类 * <p> * * @author <a href="mailto:yangkj@corp.21cn.com& ...

随机推荐

  1. Redis键的序列化和反序列化

    序列化 命令名称:DUMP 语法:DUMP key 功能:序列化给定key,并返回被序列化的值.序列化的值不包括任何生存时间信息. 返回值:如果key不存在,那么返回nil.否则返回序列化之后的值 反 ...

  2. 音视频入门-03-RGB转成BMP图片

    * 音视频入门文章目录 * BMP 文件格式解析 BMP 文件由文件头.位图信息头.颜色信息和图形数据四部分组成. 位图文件头(14个字节) 位图信息头(40个字节) 颜色信息 图形数据 文件头与信息 ...

  3. Docker使用整理

    Docker技术的基础: namespace,容器隔离的基础,保证A容器看不到B容器. 6个名空间:User,Mnt,Network,UTS,IPC,Pid cgroups,容器资源统计和隔离.主要用 ...

  4. 【原创】大叔经验分享(93)centos安装oracle客户端

    1 下载客户端 官方下载地址:https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.ht ...

  5. log4j2.xml配置,导致启动报错

    项目中遇到问题,当使用tomcat启动时,没问题:当使用内置tomcat启动时却报错,找不到日志路径. 变量位置: <properties> <property name=" ...

  6. linux串口命令

    proc # cat /proc/tty/driver/serial serinfo:1.0 driver revision: 0: uart:16550A port:000003F8 irq:4 t ...

  7. bootstrap下拉框保持打开

    $(".dropdown-menu li").on("click", function (e) { e.stopPropagation(); }); 停止传播事 ...

  8. nginx简单反向代理实例

    一.要做什么? 实例最后实现的效果图: 我们在浏览器地址栏上输入 wangtong,代理服务器获取请求,将请求转发至指定的 tomcat 上 二.怎样做? 1.准备环境 虚拟中中需要安装 JDK+To ...

  9. java8大基本类型

    文章转载自:Java的8种基本数据类型 请阅读原文. 关于Java的8种基本数据类型,其名称.位数.默认值.取值范围及示例如下表所示: 序号 数据类型 位数 默认值 取值范围 举例说明 1 byte( ...

  10. Python命令行创建虚拟环境

    Python命令行创建虚拟环境 安装virtualenv 启动命令行,执行命令pip install -U virtualenv 创建一个新的虚拟环境 执行命令python -m virtualenv ...