双向循环链表增、删、改、查
双向循环链表增、删、改、查
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);
}
双向循环链表增、删、改、查相关推荐
- 表单的增 删 改 查
django单表操作 增 删 改 查 一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取 ...
- properties(map)增.删.改.查.遍历
import java.util.Map; import java.util.Properties; import java.util.Set;/*** properties(map)增.删.改.查. ...
- python学生姓名添加删除_python-函数-实现学生管理系统,完成对学员的增,删,改,查和退出学生管理系统。...
实现学生管理系统,完成对学员的增,删,改,查和退出学生管理系统. 要求1:使用一个list用于保存学生的姓名. 要求2:输入0显示所有学员信息,1代表增加,2代表删除,3代表修改,4代表查询,exit ...
- PySpark︱DataFrame操作指南:增/删/改/查/合并/统计与数据处理
笔者最近需要使用pyspark进行数据整理,于是乎给自己整理一份使用指南.pyspark.dataframe跟pandas的差别还是挺大的. 文章目录 1.-------- 查 -------- -- ...
- list 增 删 改 查 及 公共方法
1 # 热身题目:增加名字,并且按q(不论大小写)退出程序 2 li = ['taibai','alex','wusir','egon','女神'] 3 while 1: 4 username = i ...
- 简单的php数据库操作类代码(增,删,改,查)
数据库操纵基本流程为: 1.连接数据库服务器 2.选择数据库 3.执行SQL语句 4.处理结果集 5.打印操作信息 其中用到的相关函数有 •resource mysql_connect ( [stri ...
- pyRedis - 操作指南:增/删/改/查、管道与发布订阅功能
文章目录 1 redis docker 部署与安装 2 py - redis的使用 2.1 redis的连接 2.2 常规属性查看 2.2.2 关于删除 2.3 STRING 字符串的操作 2.4 H ...
- Linux技术--mysql数据库增-删-改-查
# mysql 数据库 ## 数据库的操作 ### 五个单位 * 数据库服务器 Linux或者 windows * 数据库 * 数据表 * 数据字段 * 数据行 ### 连接数据库 ``` 1 ...
- Python 操作 Elasticsearch 实现 增 删 改 查
Github 地址:https://github.com/elastic/elasticsearch-py/blob/master/docs/index.rst 官网地址:https://elasti ...
- Go 学习笔记(50)— Go 标准库之 net/url(查询转义、查询参数增/删/改/查、解析URL)
1. URL 概述 import "net/url" url 包解析 URL 并实现了查询的转码.URL 提供了一种定位因特网上任意资源的手段,但这些资源是可以通过各种不同的方案( ...
最新文章
- windows备份与还原和两个主机的相互通信
- python装饰器实例-python装饰器案例
- HDU3338 Kakuro Extension(最大流+思维构图)
- 盘点 10 个代码重构的小技巧
- set和multiset容器简介
- 3算法全称_全网最通俗的KMP算法图解
- 鸿蒙系统cpu,鸿蒙系统,再加上自研电脑CPU,华为在下一盘很大的棋? - 区块网...
- Android 虚拟机学习总结Dalvik虚拟机介绍
- 日期加减加1天_2小时整理了13个时间日期函数,动图演示简单易学,收藏备用吧...
- oracle 不等函数,Oracle 不常用函数
- python钉钉机器人发送消息_python调用钉钉机器人发送消息
- 那些年 iOS 升级踩过的坑!
- 【Oracle】利用trace文件重建控制文件
- 《软件质量保证与测试》学习笔记【第一章 软件测试基本概念】
- PhotoshopPS软件快捷键教程
- C语言获取数组和字符串长度
- 中国网络游戏行业研究报告-2010
- python中input()函数的返回是什么类型_inputbox函数返回值的类型是什么?
- android otg 挂载流程,android USB OTG功能如何打开及实现
- 万达商管再闯IPO大门