#include <stdio.h>
#include <stdlib.h>
#include <assert.h> typedef struct DoubleLinkNode
{
int data;
struct DoubleLinkNode *prev;
struct DoubleLinkNode *next;
}Node; /* 创建一个带头节点的双向链表 */
Node* Create_Double_link()
{
Node* phead;
Node* pnew;
Node* plast;
int i,n;
phead = (Node*)malloc(sizeof(Node));
assert(NULL != phead);
phead->prev = NULL;
phead->next = NULL; printf("please input the length of the double linked list:");
scanf("%d",&n);
if(n!=)
{
plast = phead;
for(i = ; i < n;i++)
{
pnew=(Node*)malloc(sizeof(Node));
printf("向第%d个节点输入数据:",i+);
scanf("%d",&pnew->data); plast->next = pnew;
pnew->prev = plast; plast = plast->next;
}
pnew->next=NULL;
}
return phead;
}
/* 输出每一个节点的数据 */
void print(Node* head)
{
Node* temp;
int j=;
temp = head;
while(temp->next != NULL)
{
j++;
printf("输出第%d个节点的数据:%d\n",j,temp->next->data);
temp=temp->next;
}
}
/* 插入节点 */
int InsertNode(Node* head)
{
Node* new;
Node* p=head;
int i=;
int n;
Node* pnext;
printf("please input the location which is inserted:");
scanf("%d",&n); while((i<n-) && (p!=NULL))
{
i++;
p = p->next; }
if(p==NULL)
{
return ;
}
else
{
new=(Node*)malloc(sizeof(Node));
printf("请在新插入的节点中输入数据:");
scanf("%d",&new->data);
/*
第一步:首先找到插入位置,节点 s 将插入到节点 p 之前
第二步:将节点 s 的前驱指向节点 p 的前驱,即 s->prior = p->prior;
第三步:将节点 p 的前驱的后继指向节点 s 即 p->prior->next = s;
第四步:将节点 s 的后继指向节点 p 即 s->next = p;
第五步:将节点 p 的前驱指向节点 s 即 p->prior = s;*/
if(p->next == NULL) //p是最后一个节点,新的节点在最后
{
p->next = new;
new->prev = p;
}
else
{
pnext = p->next; //p为前驱节点,新节点将插入在p和pnext之间
new->prev = pnext->prev;
pnext->prev->next = new;
new->next = pnext;
pnext->prev = new;
}
}
return ;
}
/*删除节点 */
int DeleteNode(Node*head)
{
Node*p=head;
Node*ptr;
int n;
int i=;
printf("please input the node that you will delete:");
scanf("%d",&n);
while((i<n-) && (p!=NULL))
{
i++;
p=p->next;
}
if(p==NULL)
{
return ;
}
if(p->next->next!=NULL) //删除的不是最后一个节点
{
ptr=p->next;
ptr->next->prev=p;
p->next = ptr->next;
free(ptr);
ptr = NULL;
}
else //删除的是最后一个节点
{
ptr=p->next;
p->next = ptr->next;
free(ptr);
ptr = NULL;
}
return ;
}
/* 主函数 */
int main(int argc,char**argv)
{
Node* head;
head=Create_Double_link();
InsertNode(head);
DeleteNode(head);
print(head);
return ;
}

写的一个双向链表,测试OK的更多相关文章

  1. 今天写了一个可以测试并发数和运行次数的压力测试代码。(Java)

    今天写了一个可以测试并发数和运行次数的压力测试代码 介绍一下为什么会写这么一个工具. 介绍一个这个工具怎么用的. 背景 最近在开发CoapServer端,以及模拟设备侧发送数据调用开发好的CoapSe ...

  2. 经典笔试题:用C写一个函数测试当前机器大小端模式

    “用C语言写一个函数测试当前机器的大小端模式”是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 #include <stdio.h> union tes ...

  3. 写了一个具有future接口的rust测试代码

    写了一个具有future接口的rust测试代码 但没有实现future功能,内部是直接求值 struct Future<T> { t: T, } impl<T> Future& ...

  4. 利用 Python 写一个颜值测试小工具

    我们知道现在有一些利用照片来测试颜值的网站或软件,其实使用 Python 就可以实现这一功能,本文我们使用 Python 来写一个颜值测试小工具. 很多人学习python,不知道从何学起.很多人学习p ...

  5. C# 写的一个生成随机汉语名字的小程序

    最近因为要做数据库相关的测试,频繁使用到测试数据,手动添加太过于麻烦,而且复用性太差,因此干脆花了点时间写了一个生成随机姓名和相关数据的类,贴在这里,有需用的同志们可以参考一下.代码本身质量不好,也不 ...

  6. 分享:写了一个 java 调用 C语言 开发的动态库的范例

    分享:写了一个 java 调用 C语言 开发的动态库的范例 cfunction.h   代码#pragma once#ifdef __cplusplusextern "C" {#e ...

  7. 需要一个分页,花了一个钟写了一个,刚学js,不是很完美

    <script src="js/jquery.min.js" ></script> <script type="text/javascrip ...

  8. 从一到二:利用mnist训练集生成的caffemodel对mnist测试集与自己手写的数字进行测试

    通过从零到一的教程,我们已经得到了通过mnist训练集生成的caffemodel,主要包含下面四个文件: 接下来就可以利用模型进行测试了.关于测试方法按照上篇教程还是选择bat文件,当然python. ...

  9. 原生js写的一个弧形菜单插件

    弧形菜单是一种半弧式或者全弧形菜单,是一种不同于传统横向或者竖向菜单形式的菜单.最近在网上看到好多人写出了这种效果,于是也尝试自己写了一个. 实现方式:原生态js 主要结构: 1.参数合并 var d ...

随机推荐

  1. [2019杭电多校第二场][hdu6599]I Love Palindrome String(回文自动机&&hash)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6599 题目大意为求字符串S有多少个子串S[l,r]满足回文串的定义,并且S[l,(l+r)/2]也满足 ...

  2. Qt5 对xml文件常用的操作(读写,增删改查)

    转自:https://blog.csdn.net/hpu11/article/details/80227093 项目配置 pro文件里面添加QT+=xml include <QtXml>, ...

  3. Codeforces 396C (DFS序+线段树)

    题面 传送门 题目大意: 给定一棵树,每个点都有权值,边的长度均为1,有两种操作 操作1:将节点u的值增加x,并且对于u的子树中的任意一个点v,将它的值增加x-dist(u,v)*k, dist(u, ...

  4. spark复习笔记(2)

    之前工作的时候经常用,隔了段时间,现在学校要用学的东西也忘了,翻翻书谢谢博客吧. 1.什么是spark? Spark是一种快速.通用.可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校AMPL ...

  5. 20191126PHP连接数据(1)

    引进数据 mysql> create database stu1 character set utf8; mysql> use stu1 mysql> set names utf8; ...

  6. 基于socket实现大文件上传

    import socket 1.客户端: 操作流程: 先拿到文件--->获取文件大小---->创建字典 1.制作表头 header  如何得到 他是一个二进制字符串 序列化得到 字典字符串 ...

  7. zabbix3.4.8中提示host [4gronghe_110] not found

      查看zabbix_agentd.log时出现下列错误 [root@4gronghe_110 ~]# tail /var/log/zabbix/zabbix_agentd.log 1266:2014 ...

  8. git flow工作流

    https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md 说明: 个人在学习Git工作流的过程中,从原有的 SVN 模 ...

  9. SQL SERVER将多行数据合并成一行

    1)比如表中有三列数据: 2)执行如下查询: SELECT [USER_NAME], [USER_ACCOUNT] , [ROLE_NAME] = stuff(( SELECT ',' + [ROLE ...

  10. Linux性能优化从入门到实战:11 内存篇:内存泄漏的发现与定位

      用户空间内存包括多个不同的内存段,比如只读段.数据段.堆.栈以及文件映射段等.但会发生内存泄漏的内存段,只有堆和文件映射段中的共享内存.   内存泄漏的危害非常大,这些忘记释放的内存,不仅应用程序 ...