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

#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. CSS3中三种清除浮动(float)影响的方式

    float是HTML中布局的一大关键,很多难题一旦用上float都能很愉快地解决.但是凡是好用的,也容易出错.比如当子元素都为float时,其父元素会受影响,或者偶尔会发现自己某个div的高度变成了0 ...

  2. (十)easyUI之折叠面板+选项卡+树完成系统布局

    一.效果 二 .编码 数据库设计 数据库函数设计,该函数根据父节点id 查询出所有字节点(包括孙子节点) BEGIN #声明两个临时变量 ); ); '; SET tempChd=CAST(rootI ...

  3. java集合的作用

    从架构的方面来理解,可能稍微容易一点.在编程中,需要管理很多对象集.比如某班全部同学,某个公司所有人员资料等.要管理这些资料,java必须提供某种数据结构支持.由于时间,空间,安全的考虑,有各种不同的 ...

  4. Mysql 中删除重复数据(保留一条)

    sql去重 先根据需要去重的字段进行分组,取到主键值最小的记录(id 是主键,删除重复的 record_id 的记录) select min(id) from tb_traffic_wf_record ...

  5. robot framework 如何获取隐藏元素的文本,以及可见元素的文本

    1.下图是获取可见元素的文本内容,运行后得到:${B_name}=公告管理:假设公告管理不可见,那么${B_name}=‘’(为空)

  6. vue的$nextTick使用后的js代码执行顺序问题

    一.问题产生背景: 父组件已经获得子组件实例,并能直接触发子组件的方法,在父组件中调用了子组件的两个方法 // 父组件调用子组件,this.picker是获取的子组件整个实例,先调用update,再调 ...

  7. mysql 创建用户,授权,查询用户等

    MySQL创建用户与授权 一. 创建用户 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: username:你将创建的用 ...

  8. python matplotlib拟合直线

    import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.family'] = ['sans-serif'] plt. ...

  9. Ubuntu系统---中英文问题小记

    Ubuntu系统---中英文问题小记 Ubuntu系统安装的时候,选择English版本,这样进入tty模式,中文提示不会显示乱码,终端下也是提示英文版的信息. Ubuntu 系统中文显示乱码的问题解 ...

  10. Android-File读写+SharedPreferences的存取地址

    写了两个demo,一个是使用SharedPreferences将数据存储在应用文件中并读取,另一个是使用Context的openFileOutput和openFileInput将数据存储在应用文件中并 ...