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

#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. mysql5.7主主(双主)复制

    在server1上操作 vi /etc/my.cnf 修改或添加下面这几行: server-id=1 log-bin=mysql-bin # 启用二进制日志 auto-increment-increm ...

  2. sessionId详解

    sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应.服务端在创建了Session的同时,会为该Session生成唯一的se ...

  3. 学习C#自作计算器,菜鸟初学,有大神的指点,希望做的不够好的地方请大家多多指导。同时希望非常无聊的大神能加些其它计算进去

    可以做幂运算,根号运算,十进制与二进制互转,16进制与十进制互转 namespace WindowsFormsApplication15 { public partial class 祥哥计算器 : ...

  4. Asp.net core中间件实现原理及用法解说

    简述asp.net core中间件的实现思路 原文地址:https://www.cnblogs.com/shengyu-kmust/p/11583974.html 一次http请求的过程,就是对一个R ...

  5. SQL将同样标识的查询结果查重并用逗号拼接

    SELECT B.TaskID , LEFT(SamList, LEN(SamList) - 1) AS ResultListFROM ( SELECT TaskID , ( SELECT Sampl ...

  6. 简单实现app使用PC图片

    提一个很人性化的需求: 在自己的app里使用PC里的图片. 关键点:传输.怎么把图片从PC导入自己的APP. 因为iOS的封闭性,一般用户不能很方便把图片导入手机相册.笔者稍微想了下,实现功能其实也有 ...

  7. css垂直居中如何实现

    利用CSS3的transform:translate .center{ width:%; position: absolute; top: %; left: %; -moz-transform: tr ...

  8. 6.显示锁Lock 和 线程通信Condition

    显示锁 Lock 一.用于解决多线程 安全问题的方式: synchronized:   1.同步代码块      2.同步方法 jdk1.5 后:第三种:同步锁Lock  (注意:同步(synchro ...

  9. springboot学习链接

    https://github.com/wuyouzhuguli/SpringAll

  10. Endless looping of packets in TCP/IP networks (Routing Loops)

    How endless looping of packets in a TCP/IP network might occur? Router is a device used to interconn ...