//初始化
Node*InitList()
{
Node*head=(Node*)malloc(sizeof(Node));
if(NULL==head)
{
printf("内存分配失败!");
}
printf("内存分配成功!\n");
head->data=-1;
head->next=NULL;
head->prior=NULL;
return head;
}
//向链表中添加数据
void Add(Node *s,int n)
{
Node *p=s;
printf("请输入%d个数据:",n);
for(int i=1;i<=n;i++)
{
Node*q=(Node*)malloc(sizeof(Node));
scanf("%d",&q->data);
q->next=NULL;
p->next=q;
q->prior=p;
p=q;
}
}

将q节点插入到p节点之后时,要让q指针先和p->next节点相连接,最后在连接p和q,否者会造成重复;

//插入数据包括(头插,前插,尾插)
void Insert(Node*s)
{
Node*p=s;
int a,b;
printf("请输入你要插入的数据:");
scanf("%d",&a);
Node*q=(Node*)malloc(sizeof(Node));
q->data=a;
q->next=NULL;
q->prior=NULL;
printf("请输入年要插入哪个数据之后:");
scanf("%d",&b);
int flag=0;
while(p)
{
if(p->data==b&&p->next!=NULL)
{
q->next=p->next;
p->next->prior=q;
p->next=q;
q->prior=p;
flag=1;
break;
}
else if(p->data==b&&p->next==NULL)
{
p->next=q;
q->prior=p;
flag=1;
break;
}
p=p->next;
}
if(flag==1)
{
printf("插入成功!\n");
}
else
{
printf("插入失败,没有该数据!");
}
}
//头插法
void Insert(Node*s)
{
int a;
printf("请输入你要插入的数据:");
scanf("%d",&a);
Node*q=(Node*)malloc(sizeof(Node));
q->data=a;
q->next=NULL;
q->prior=NULL;
q->next=s->next;
s->next->prior=q;
s->next=q;
q->prior=s;
}
//删除操作
void Delete(Node*s)
{
int a;
printf("请输入你要删除的数据!");
scanf("%d",&a);
Node*temp=s;
int flag=0;
while(temp)
{ if(temp->data==a&&temp->next!=NULL)
{
printf("已执行!");
temp->next->prior=temp->prior;
temp->prior->next=temp->next;
free(temp);
flag=1;
break;
}
else if(temp->data==a&&temp->next==NULL)//如果删除的是最后一个节点;
{
printf("shabi");
temp->prior->next=NULL;
free(temp);
flag=1;
break;
}
temp=temp->next;
}
if(flag==1)
{
printf("删除成功!");
}
else
{
printf("删除失败!");
}
}
//释放全部节点
void Empty(Node*s)
{
Node*p=s;
while(p)
{
s=s->next;
free(p);
p=s;
}
printf("\n");
printf("该内存已经释放!");
}

以下为原代码:
//双链表
#include<stdio.h>
#include<malloc.h>

typedef struct DNode{
int data;
struct DNode next;
struct DNode prior;
}Node;
//初始化
Node
InitList()
{
Node
head=(Node*)malloc(sizeof(Node));
if(NULLhead)
{
printf(“内存分配失败!”);
}
printf(“内存分配成功!\n”);
head->data=-1;
head->next=NULL;
head->prior=NULL;
return head;
}
//向链表中添加数据
void Add(Node s,int n)
{
Node p=s;
printf(“请输入%d个数据:”,n);
for(int i=1;i<=n;i++)
{
Node
q=(Node
)malloc(sizeof(Node));
scanf("%d",&q->data);
q->next=NULL;
p->next=q;
q->prior=p;
p=q;
}
}
void Display(Nodes)
{
Node
v=s->next;
while(v)
{
printf("%d->",v->data);
v=v->next;
}
}
//释放节点
void Empty(Nodes)
{
Node
p=s;
while§
{
s=s->next;
free§;
p=s;
}
printf("\n");
printf(“该内存已经释放!”);
}
//插入数据包括(尾插,前插,尾插)
void Insert(Nodes)
{
Node
p=s;
int a,b;
printf(“请输入你要插入的数据:”);
scanf("%d",&a);
Nodeq=(Node)malloc(sizeof(Node));
q->data=a;
q->next=NULL;
q->prior=NULL;
printf(“请输入年要插入哪个数据之后:”);
scanf("%d",&b);
int flag=0;
while§
{
if(p->datab&&p->next!=NULL)
{
q->next=p->next;
p->next->prior=q;
p->next=q;
q->prior=p;
flag=1;
break;
}
else if(p->datab&&p->nextNULL)
{
p->next=q;
q->prior=p;
flag=1;
break;
}
p=p->next;
}
if(flag==1)
{
printf(“插入成功!\n”);
}
else
{
printf(“插入失败,没有该数据!”);
}
}
//头插法
void Insert(Nodes)
{
int a;
printf(“请输入你要插入的数据:”);
scanf("%d",&a);
Node
q=(Node*)malloc(sizeof(Node));
q->data=a;
q->next=NULL;
q->prior=NULL;
q->next=s->next;
s->next->prior=q;
s->next=q;
q->prior=s;
}
//删除操作
/void Delete(Nodes)
{
int a;
printf(“请输入你要删除的数据!”);
scanf("%d",&a);
Node*temp=s;
int flag=0;
while(temp)
{

	if(temp->data==a&&temp->next!=NULL)
{
printf("已执行!");
temp->next->prior=temp->prior;
temp->prior->next=temp->next;
free(temp);
flag=1;
break;
}
else if(temp->data==a&&temp->next==NULL)//如果删除的是最后一个节点;
{
printf("shabi");
temp->prior->next=NULL;
free(temp);
flag=1;
break;
}
temp=temp->next;
}
if(flag==1)
{
printf("删除成功!");
}
else
{
printf("删除失败!");
}

}*/

int main()
{
Node *head;ni
head=InitList();
int a;
printf(“请输入你要增加多少数据:”);
scanf("%d",&a);
Add(head,a);
// Insert(head);
//printf(“该数据情况如下:\n”);
// Display(head);
// printf("\n");
//Delete(head);
// printf("\n");
printf(“该数据情况如下:\n”);
Display(head);
Empty(head);
}

c语言实现双链表的基本操作—增删改查的更多相关文章

  1. C语言,单链表操作(增删改查)(version 0.1)

    这天要面试,提前把链表操作重新写了一遍.备份一下,以备不时之需. 希望有人能看到这篇代码,并指正. // File Name : list.h #include "stdafx.h" ...

  2. MongoDB的ObjectId和基本操作增删改查(3)

    ObjectId 基本操作增删改查 增: insert 介绍: mongodb存储的是文档,. 文档是json格式的对象. 语法: db.collectionName.insert(document) ...

  3. MongoDB --- 02. 基本操作,增删改查,数据类型,比较符,高级用法,pymongo

    一.基本操作 . mongod 启动服务端 2. mongo 启动客户端 3. show databses 查看本地磁盘的数据库 4. use 库名 切换到要使用的数据库 5. db 查看当前使用的数 ...

  4. web sql 基本操作 - 增删改查

    不喜欢看md原文的 可以访问这个链接:http://note.youdao.com/noteshare?id=6a91e3dea7cdf5195bb0e851d9fcb5a5 # web sql 增删 ...

  5. Javascript模仿C语言的链表实现(增删改查),并且使用控制台输入输出

    Js新手最近在研究Js数据结构,刚好看到链表实现这一块儿,觉得有些资料和自己理解的有冲突,于是借着自己以前一点点C语言的基础,用Javascript模仿了C的链表实现,并且用了process.stdi ...

  6. MongoDB基本操作(增删改查)

    基本操作      基本的“增删查改“,在DOS环境下输入mongo命令打开shell,其实这个shell就是mongodb的客户端,同时也是一个js的编译器,默认连接的是“test”数据库.  

  7. django数据库基本操作-增删改查(tip)-基本

    补充:django外键保存 #外键保存 form_data = Form_Data() project, is_created = Project_Name.objects.get_or_create ...

  8. 使用C语言封装数组,动态实现增删改查

    myArray.h : #pragma once //包含的时候只包含一次 #include <stdio.h> #include <stdlib.h> #include &l ...

  9. MySQL语句基本操作增删改查

    select * from 表名; --------->效率低

随机推荐

  1. linux 内核以及mod

    linux设计为单内核,但是使用了 微内核的设计思想 内核相关的两个文件夹 /proc /sys 设定内核运行参数方法 echo VALUE > /proc/sys/To/SOMEFILE sy ...

  2. spring——整合Mybatis

    一.Mybatis整合spring 步骤: 导入相关jar包 junit mybatis mysql数据库 spring-webmvc aop织入 mybatis-spring spring-jdbc ...

  3. Cobalt Strike的使用

    0x00  Cobalt Strike简介       Cobalt Strike 一款以metasploit为基础的GUI的框架式渗透测试工具,集成了端口转发.服务扫描,自动化溢出,多模式端口监听, ...

  4. windows server 2019 域控批量新增不用,只看这一篇就够了,别的不用看

    windows server 2019 域控批量新增不用,只看这一篇就够了,别的不用看 1. 新建excel表格 A B C D E 姓 名 全名 登录名 密码 李 四 李四 李四 test123!@ ...

  5. mock axios vue的数据传递关系

    最近有一个项目要快速出一个前端demo,选择了vue-element框架(虽然其实很想用react,但是为了求快) 本人的基础只有初级的html/css/js知识,和python后端的一些简单工作,和 ...

  6. Java反射详解篇--一篇入魂

    1.反射概述 Java程序在运行时操作类中的属性和方法的机制,称为反射机制. 一个关键点:运行时 一般我们在开发程序时,都知道自己具体用了什么类,直接创建使用即可.但当你写一些通用的功能时没办法在编写 ...

  7. 『现学现忘』Docker基础 — 33、Docker数据卷容器的说明与共享数据原理

    目录 1.数据卷容器的说明 2.数据卷容器共享数据原理 3.总结 4.练习:MySQL实现数据共享 1.数据卷容器的说明 (1)什么是数据卷容器 一个容器中已经创建好的数据卷,其它容器通过这个容器实现 ...

  8. ES6中对象新增的方法

    属性的简洁表示法 ES6 允许在大括号里面直接写入变量和函数,作为对象的属性和方法.这样的书写更加简洁. const foo = 'bar'; const baz = { foo }; console ...

  9. RabbitMQ入门到进阶(Spring整合RabbitMQ&SpringBoot整合RabbitMQ)

    1.MQ简介 MQ 全称为 Message Queue,是在消息的传输过程中保存消息的容器.多用于分布式系统 之间进行通信. 2.为什么要用 MQ 1.流量消峰 没使用MQ 使用了MQ 2.应用解耦 ...

  10. 深入理解Java虚拟机-垃圾收集算法

    一.判断对象是否可进行回收 1.引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象就是不可能再被使用的.但是主流的 ...