c语言实现双链表的基本操作—增删改查
//初始化
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;
//初始化
NodeInitList()
{
Nodehead=(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++)
{
Nodeq=(Node)malloc(sizeof(Node));
scanf("%d",&q->data);
q->next=NULL;
p->next=q;
q->prior=p;
p=q;
}
}
void Display(Nodes)
{
Nodev=s->next;
while(v)
{
printf("%d->",v->data);
v=v->next;
}
}
//释放节点
void Empty(Nodes)
{
Nodep=s;
while§
{
s=s->next;
free§;
p=s;
}
printf("\n");
printf(“该内存已经释放!”);
}
//插入数据包括(尾插,前插,尾插)
void Insert(Nodes)
{
Nodep=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);
Nodeq=(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语言实现双链表的基本操作—增删改查的更多相关文章
- C语言,单链表操作(增删改查)(version 0.1)
这天要面试,提前把链表操作重新写了一遍.备份一下,以备不时之需. 希望有人能看到这篇代码,并指正. // File Name : list.h #include "stdafx.h" ...
- MongoDB的ObjectId和基本操作增删改查(3)
ObjectId 基本操作增删改查 增: insert 介绍: mongodb存储的是文档,. 文档是json格式的对象. 语法: db.collectionName.insert(document) ...
- MongoDB --- 02. 基本操作,增删改查,数据类型,比较符,高级用法,pymongo
一.基本操作 . mongod 启动服务端 2. mongo 启动客户端 3. show databses 查看本地磁盘的数据库 4. use 库名 切换到要使用的数据库 5. db 查看当前使用的数 ...
- web sql 基本操作 - 增删改查
不喜欢看md原文的 可以访问这个链接:http://note.youdao.com/noteshare?id=6a91e3dea7cdf5195bb0e851d9fcb5a5 # web sql 增删 ...
- Javascript模仿C语言的链表实现(增删改查),并且使用控制台输入输出
Js新手最近在研究Js数据结构,刚好看到链表实现这一块儿,觉得有些资料和自己理解的有冲突,于是借着自己以前一点点C语言的基础,用Javascript模仿了C的链表实现,并且用了process.stdi ...
- MongoDB基本操作(增删改查)
基本操作 基本的“增删查改“,在DOS环境下输入mongo命令打开shell,其实这个shell就是mongodb的客户端,同时也是一个js的编译器,默认连接的是“test”数据库.
- django数据库基本操作-增删改查(tip)-基本
补充:django外键保存 #外键保存 form_data = Form_Data() project, is_created = Project_Name.objects.get_or_create ...
- 使用C语言封装数组,动态实现增删改查
myArray.h : #pragma once //包含的时候只包含一次 #include <stdio.h> #include <stdlib.h> #include &l ...
- MySQL语句基本操作增删改查
select * from 表名; --------->效率低
随机推荐
- 云原生技术赋能ISV实现应用现代化
日前,由BP商业伙伴主办,中国开源云联盟和云原生应用现代化联盟协办的2021-2022云计算生态峰会成功举办.头部ISV代表.最终用户和云原生技术专家等与会各方围绕"云原生技术赋能ISV&q ...
- CF578D题解
LCS 为给定串的长度减一,考虑枚举一个区间 \([L,R]\),表示 \(S\) 和 \(T\) 的长度为 \(L-1\) 的前缀完全相同以及长度为 \(n-R\) 的后缀完全相同,且没有比这个前缀 ...
- Mysql下载路径和安装
下载路径 https://dev.mysql.com/downloads/mysql/ C:\Windows\system32>net start mysql 发生系统错误 2. 系统找不到指定 ...
- 报错————Type interface com.ssm.mapper.NewProductMapper is not known to the MapperRegistry.
报错: Exception in thread "main" org.apache.ibatis.binding.BindingException: Type interface ...
- kubernetes集群节点多网卡,calico指定网卡
kubernetes集群节点多网卡,calico指定网卡 1.calico如果有节点是多网卡,所以需要在配置文件中指定内网网卡 spec: containers: - env: - name: DAT ...
- PCIe Tandem PROM 方法
PCIe Tandem PROM 方法 什么是Tandem PROM? 简单总结:市面多数的FPGA都是SRAM型,需要在上电时从外部存储器件完成代码的加载,对于具有PCIe功能的SRAM FPGA而 ...
- 『现学现忘』Docker基础 — 34、DockerFile文件详解
目录 1.DockerFile文件说明 2.Dockerfile构建过程解析 (1)Docker容器构建三步骤 (2)Dockerfile文件的基本结构 (3)Dockerfile注意事项 (4)Do ...
- async-validator 源码学习笔记(六):validate 方法
系列文章: 1.async-validator 源码学习(一):文档翻译 2.async-validator 源码学习笔记(二):目录结构 3.async-validator 源码学习笔记(三):ru ...
- Java 中 ConcurrentHashMap 的并发度是什么?
ConcurrentHashMap 把实际 map 划分成若干部分来实现它的可扩展性和线程安 全.这种划分是使用并发度获得的,它是 ConcurrentHashMap 类构造函数的一 个可选参数,默认 ...
- 用 Java 写一个折半查找?
折半查找,也称二分查找.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法. 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束:如果某一特定元素大于或者小于中间元素,则 ...