双向循环链表增、删、改、查

cycle.c

#include<stdio.h>
#include<stdlib.h>
#include"cycle.h"//先创建一个空的双向循环链表
biList *create(void)
{biList *l = malloc(sizeof(*l));l->first = NULL;return l;
}/*功能:增加一个数据,链表保持升序参数:@l:头结点;@p:要插入的结点注意:要考虑进行过一次遍历后的退出情况
*/
void insert(biList *l,biNode *p)
{if(l == NULL){return;}if(l->first == NULL){l->first = p;p->next = p;p->prev = p;return l;}//遍历链表,找第一个比p大的数据biNode *pk = l->first;while(1){if(pk->data > p->data){break;}pk = pk->next;if(pk == l->first)       //已经经历过一次遍历,退出循环{break;}}//分情况插入/*if(pk == l->first){p->next = pk;p->prev = pk->prev;pk->prev->next = p;pk->prev = p;if(p->data < pk->data)          //因为p最大和p最小的标志相同,所以需要分情况讨论{l->first == p;}else{l->first->prev = p;}}else{p->next = pk;p->prev = pk->prev;pk->prev->next = p;pk->prev = p;                  //我们发现插入方法都一样的厚,所以合并一下}*/p->next = pk;p->prev = pk->prev;pk->prev->next = p;pk->prev = p;if(pk == l->first){if(p->data < pk->data){l->first = p;}else{l->first->prev = p;}}
}/*功能:删除指定结点,保持升序参数:@l:头结点;@x:要删除的数据注意:要考虑只有一个结点且为要删除的结点的极端情况
*/
void delete(biList *l,element x)
{if(l == NULL || l->first == NULL){return;}biNode *px = l->first;        //每次循环的起点biNode *ps = NULL;            //指向删除的结点element flag = 0;             //是否有指定数据的标志,0为没有,1为有while(1){ps = pxif(ps->data == x){flag = 1;break;}ps = ps->next;if(ps == l->first){break;}if(flag == 0){break;}//定义下一次循环起点if(ps == ps->next)      //如果只有一个结点{px = NULL;}else{px = ps->next;}//有极端情况,就是列表中只有一个结点if(ps == l->first){if(ps == ps->next){l->first = NULL;}else{l->first = ps->next;}ps->prev->next = ps->next;ps->next->prev = ps->prev;ps->next = NULL;ps->prev = NULL;free(ps);}else{ps->prev->next = ps->next;ps->next->prev = ps->prev;ps->next = NULL;ps->prev = NULL;free(ps);}}     return;
}/*功能:打印链表参数:@l:头结点
*/
void print(biList *l)
{if(l == NULL || l->first == NULL){printf("----------------------------\n");return;printf("\n----------------------------\n");}printf("----------------------------\n");biNode *p = l->first;while(p){printf("%d ",p->data);p = p->next;if(p == l->first){break;}}printf("\n");p = l->first;if(p){p = p->prev;}while(p){printf("%d",p->data);if(p == l->first){break;}p = p->prev;if(p == l->first){printf("%d",p->data);break;}}printf("\n");printf("----------------------------\n");
}void delete_all(biList *l)
{if(l == NULL){return;}biNode *px = l->first;while(px){if(px == px->next){l->first = NULL;px->next = NULL;px->prev = NULL;free(px);}else{l->first = px->next;px->next->prev = px->prev;px->prev->next = px->next;px->next = NULL;px->prev = NULL;free(px);            //删除了第一个}px = l->first;         //删除新的一个}}//2. 删除头结点printf("%s  L_%d  l->first = %p -------\n", __FUNCTION__, __LINE__, l->first);free(l);printf("%s  L_%d  l->first = %p -------\n", __FUNCTION__, __LINE__, l->first);return;
}

cycle.h

#ifndef __CYCLE_H__
#define __CYCLE_H__
#define element xtypedef struct biNode
{element data;struct biNode *next;struct biNode *prev;
}biNode;typedef struct biList
{biNode *first;
}biList;biList *create(void);void insert(biList *l,biNode *p);void print(biList *l);void delete_all(biList *l);#endif

main.c

#include<stdio.h>
#include<stdlib.h>
#include"cycle.h"int main()
{biList *l = create();element x;while(1){scanf("%d",&x);if(x == 0){break;}biNode *p = malloc(sizeof(*p));p->data = x;p->prev = p;p->next = p;insert(l,p);}print(l);element y;printf("delete num :\n");scanf("%d",&y);delete(l,y);print(l);delete_all(l);
}

双向循环链表增、删、改、查相关推荐

  1. 表单的增 删 改 查

    django单表操作 增 删 改 查 一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取 ...

  2. properties(map)增.删.改.查.遍历

    import java.util.Map; import java.util.Properties; import java.util.Set;/*** properties(map)增.删.改.查. ...

  3. python学生姓名添加删除_python-函数-实现学生管理系统,完成对学员的增,删,改,查和退出学生管理系统。...

    实现学生管理系统,完成对学员的增,删,改,查和退出学生管理系统. 要求1:使用一个list用于保存学生的姓名. 要求2:输入0显示所有学员信息,1代表增加,2代表删除,3代表修改,4代表查询,exit ...

  4. PySpark︱DataFrame操作指南:增/删/改/查/合并/统计与数据处理

    笔者最近需要使用pyspark进行数据整理,于是乎给自己整理一份使用指南.pyspark.dataframe跟pandas的差别还是挺大的. 文章目录 1.-------- 查 -------- -- ...

  5. list 增 删 改 查 及 公共方法

    1 # 热身题目:增加名字,并且按q(不论大小写)退出程序 2 li = ['taibai','alex','wusir','egon','女神'] 3 while 1: 4 username = i ...

  6. 简单的php数据库操作类代码(增,删,改,查)

    数据库操纵基本流程为: 1.连接数据库服务器 2.选择数据库 3.执行SQL语句 4.处理结果集 5.打印操作信息 其中用到的相关函数有 •resource mysql_connect ( [stri ...

  7. pyRedis - 操作指南:增/删/改/查、管道与发布订阅功能

    文章目录 1 redis docker 部署与安装 2 py - redis的使用 2.1 redis的连接 2.2 常规属性查看 2.2.2 关于删除 2.3 STRING 字符串的操作 2.4 H ...

  8. Linux技术--mysql数据库增-删-改-查

    # mysql 数据库 ## 数据库的操作 ### 五个单位 * 数据库服务器   Linux或者 windows  * 数据库  * 数据表 * 数据字段 * 数据行 ### 连接数据库 ``` 1 ...

  9. Python 操作 Elasticsearch 实现 增 删 改 查

    Github 地址:https://github.com/elastic/elasticsearch-py/blob/master/docs/index.rst 官网地址:https://elasti ...

  10. Go 学习笔记(50)— Go 标准库之 net/url(查询转义、查询参数增/删/改/查、解析URL)

    1. URL 概述 import "net/url" url 包解析 URL 并实现了查询的转码.URL 提供了一种定位因特网上任意资源的手段,但这些资源是可以通过各种不同的方案( ...

最新文章

  1. windows备份与还原和两个主机的相互通信
  2. python装饰器实例-python装饰器案例
  3. HDU3338 Kakuro Extension(最大流+思维构图)
  4. 盘点 10 个代码重构的小技巧
  5. set和multiset容器简介
  6. 3算法全称_全网最通俗的KMP算法图解
  7. 鸿蒙系统cpu,鸿蒙系统,再加上自研电脑CPU,华为在下一盘很大的棋? - 区块网...
  8. Android 虚拟机学习总结Dalvik虚拟机介绍
  9. 日期加减加1天_2小时整理了13个时间日期函数,动图演示简单易学,收藏备用吧...
  10. oracle 不等函数,Oracle 不常用函数
  11. python钉钉机器人发送消息_python调用钉钉机器人发送消息
  12. 那些年 iOS 升级踩过的坑!
  13. 【Oracle】利用trace文件重建控制文件
  14. 《软件质量保证与测试》学习笔记【第一章 软件测试基本概念】
  15. PhotoshopPS软件快捷键教程
  16. C语言获取数组和字符串长度
  17. 中国网络游戏行业研究报告-2010
  18. python中input()函数的返回是什么类型_inputbox函数返回值的类型是什么?
  19. android otg 挂载流程,android USB OTG功能如何打开及实现
  20. 万达商管再闯IPO大门

热门文章

  1. 科技创新让互联更简单:荣耀多款新品助力智慧生活全面进阶
  2. 和平精英今日最全更新:出生岛、“加油特种兵”回归?网友:真香
  3. 二进制、八进制和十六进制
  4. Hadoop 开发流程
  5. PHP获取东方头条接口的新闻,新闻API接口_免费数据接口 - 极速数据
  6. 射频RFID 高频标签 NXP Mifare卡介绍
  7. 远程下载/上传 服务器文件到本地
  8. android微商助手功能,微商免费助手下载
  9. 一文掌握Bellman-Ford算法
  10. 图像识别-花的分类(tensorflow实现)