双向环形链表

#ifndef DULIST_H
#define DULIST_H
/* 线性表的双向链表存储结构 */
typedef void * elemtype;
typedef struct dulnode
{ elemtype data;struct dulnode *prior,*next;
}dulnode,*dulinklist;
/*带头结点的双向循环链表的基本操作(14个) */
void    list_init(dulinklist *l);
void    list_destory(dulinklist *l);
void    list_clear(dulinklist l); 
int     list_empty(dulinklist l); 
int     list_length(dulinklist l); 
int     list_getelem(dulinklist l,int i,elemtype *e);
int     list_locateelem(dulinklist l,elemtype e,int(*compare)(elemtype,elemtype));
int     list_priorelem(dulinklist l,elemtype cur_e,elemtype *pre_e);
int     list_nextelem(dulinklist l,elemtype cur_e,elemtype *next_e);
dulinklist list_get_elemp(dulinklist l,int i); /* 另加 */
int     list_insert(dulinklist l,int i,elemtype e); 
int     list_delete(dulinklist l,int i,elemtype * e); 
void    list_traverse(dulinklist l,void(*visit)(elemtype));
void    list_traverse_back(dulinklist l,void(*visit)(elemtype));#endif 
#include "includes.h"                                                                                                                                                                  
#define OVERFLOW -1
#define ERROR    -2
#define OK       1
#define true     1
#define false    0void list_init(dulinklist *l)
{ /* 产生空的双向循环链表l */*l=(dulinklist)malloc(sizeof(dulnode));if(*l)(*l)->next=(*l)->prior=*l;elseexit(OVERFLOW);
}
void list_destory(dulinklist *l)
{/* 操作结果:销毁双向循环链表l */dulinklist q,p=(*l)->next; /* p指向第一个结点 */while(p!=*l) /* p没到表头 */{q=p->next;free(p);p=q;}free(*l);*l=NULL;
}
void list_clear(dulinklist l) /* 不改变l */
{ /* 初始条件:l已存在。操作结果:将l重置为空表 */dulinklist q,p=l->next; /* p指向第一个结点 */while(p!=l) /* p没到表头 */{q=p->next;free(p);p=q;}l->next=l->prior=l; /* 头结点的两个指针域均指向自身 */
}
int list_empty(dulinklist l)
{ /* 初始条件:线性表l已存在。操作结果:若l为空表,则返回true,否则返回false */if(l->next==l&&l->prior==l)return true;elsereturn false;
}
int list_length(dulinklist l)
{ /* 初始条件:l已存在。操作结果:返回l中数据元素个数 */int i=0;dulinklist p=l->next; /* p指向第一个结点 */while(p!=l) /* p没到表头 */{i++;p=p->next;}return i;
}
int list_getelem(dulinklist l,int i,elemtype *e)
{ /* 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */int j=1; /* j为计数器 */dulinklist p=l->next; /* p指向第一个结点 */while(p!=l&&(p=p->next)){j++;}if(p==l||j>i) /* 第i个元素不存在 */return ERROR;*e=p->data; /* 取第i个元素 */return OK;
}int list_locate_elem(dulinklist l,elemtype e,int(*compare)(elemtype,elemtype))
{ /* 初始条件:l已存在,compare()是数据元素判定函数 *//* 操作结果:返回l中第1个与e满足关系compare()的数据元素的位序。 *//*           若这样的数据元素不存在,则返回值为0 */int i=0;dulinklist p=l->next; /* p指向第1个元素 */while(p!=l){i++;if(compare(p->data,e)) /* 找到这样的数据元素 */return i;p=p->next;}return 0;
}int list_priorelem(dulinklist l,elemtype cur_e,elemtype *pre_e)
{ /* 操作结果:若cur_e是l的数据元素,且不是第一个,则用pre_e返回它的前驱, *//*           否则操作失败,pre_e无定义 */dulinklist p=l->next->next; /* p指向第2个元素 */while(p!=l) /* p没到表头 */{if(p->data==cur_e){*pre_e=p->prior->data;return true;}p=p->next;}return false;
}int list_next_elem(dulinklist l,elemtype cur_e,elemtype *next_e)
{ /* 操作结果:若cur_e是l的数据元素,且不是最后一个,则用next_e返回它的后继, *//*           否则操作失败,next_e无定义 */dulinklist p=l->next->next; /* p指向第2个元素 */while(p!=l) /* p没到表头 */                                                                                                                                                          {if(p->prior->data==cur_e){*next_e=p->data;return true;}p=p->next;}return false;
}dulinklist list_get_elemp(dulinklist l,int i) /* 另加 */
{ /* 在双向链表l中返回第i个元素的地址。i为0,返回头结点的地址。若第i个元素不存在,*//* 返回NULL */int j;dulinklist p=l; /* p指向头结点 */if(i<0||i>list_length(l)) /* i值不合法 */return NULL;for(j=1;j<=i;j++)p=p->next;return p;
}
int list_insert(dulinklist l,int i,elemtype e)
{ /* 在带头结点的双链循环线性表l中第i个位置之前插入元素e,i的合法值为1≤i≤表长+1 *//* 改进算法2.18,否则无法在第表长+1个结点之前插入元素 */dulinklist p,s;if(i<1||i>list_length(l)+1) /* i值不合法 */return ERROR;p=list_get_elemp(l,i-1); /* 在l中确定第i个元素前驱的位置指针p */if(!p) /* p=NULL,即第i个元素的前驱不存在(设头结点为第1个元素的前驱) */return ERROR;s=(dulinklist)malloc(sizeof(dulnode));if(!s)return OVERFLOW;s->data=e;s->prior=p; /* 在第i-1个元素之后插入 */s->next=p->next;p->next->prior=s;p->next=s;return OK;
}int list_delete(dulinklist l,int i,elemtype *e)
{ /* 删除带头结点的双链循环线性表l的第i个元素,i的合法值为1≤i≤表长 */dulinklist p;if(i<1) /* i值不合法 */return ERROR;p=list_get_elemp(l,i);  /* 在l中确定第i个元素的位置指针p */if(!p) /* p=NULL,即第i个元素不存在 */return ERROR;*e=p->data;p->prior->next=p->next;//???没有考虑链表头?链表尾?p->next->prior=p->prior;free(p);return OK;                                                                                                                                                                           
}
void list_traverse(dulinklist l,void(*visit)(elemtype))
{ /* 由双链循环线性表l的头结点出发,正序对每个数据元素调用函数visit() */dulinklist p=l->next; /* p指向头结点 */while(p!=l){visit(p->data);p=p->next;}printf("\n");
}void list_traverse_back(dulinklist l,void(*visit)(elemtype))
{ /* 由双链循环线性表l的头结点出发,逆序对每个数据元素调用函数visit()。另加 */dulinklist p=l->prior; /* p指向尾结点 */while(p!=l){visit(p->data);p=p->prior;}printf("\n");
}                                 

 

转载于:https://www.cnblogs.com/likeyiyy/p/3652030.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux服务器加入windows域时报错Ticket expired

[rootrusky]# net ads join -U administrator Enter administrators password: kinit succeeded but ads_sasl_spnego_krb5_bind failed: Ticket expired Failed to join domain: failed to connect to AD: Ticket expired使用data命令查看时间&#xff0c;发现linux机器与wind…

机器学习问题解答

1、如何从字面正确理解weight decay的含义&#xff1f;它为何相当于L2范式正则化&#xff1f; 2、L2范数正则化对应贝叶斯统计里的哪个概念&#xff1f; 解答&#xff1a;http://blog.csdn.net/zouxy09/article/details/24971995/&#xff1b;http://t.hengwei.me/post/%E6%B5%…

搜索和数据分析引擎

https://www.elastic.co/cn/products/elasticsearch

mysql查询区分大小写

Mysql默认查询是不分大小写的&#xff0c;可以在SQL语句中加入binary来区分大小写。 binary不是函数&#xff0c;是类型转换运算符&#xff0c;它用来强制它后面的字符串为一个二进制字符串&#xff0c;可以理解为在字符串比较的时候区分大小写。 SELECT * FROM t_resource_inf…

(二)单元测试利器 JUnit 4

JUnit 深入 当然&#xff0c;JUnit 提供的功能决不仅仅如此简单&#xff0c;在接下来的内容中&#xff0c;我们会看到 JUnit 中很多有用的特性&#xff0c;掌握它们对您灵活的编写单元测试代码非常有帮助。Fixture 何谓 Fixture&#xff1f;它是指在执行一个或者…

.net平台的MongoDB使用

网址&#xff1a;http://www.cnblogs.com/skychen1218/p/6595759.html 前言 最近花了点时间玩了下MongoDB.Driver&#xff0c;进行封装了工具库&#xff0c;平常也会经常用到MongoDB&#xff0c;因此写一篇文章梳理知识同时把自己的成果分享给大家。 本篇会设计到Lambda表达式的…

2018程序员最佳ssh免费登陆工具

https://www.jianshu.com/p/b29b894aa60f Linux 终端 Screenshot from 2018-09-15 00-12-41.png PAC Screenshot from 2018-09-15 00-12-00.png 参考资料 讨论qq群144081101 591302926 567351477本文涉及的python测试开发库 谢谢点赞&#xff01;本文相关海量书籍下载 Wind…

Android Studio快捷键(MAC版)

用了AS一段时间了&#xff0c;感觉还是挺好用的&#xff0c;虽然还是有些小问题&#xff0c;但好处还是很明显的。。。 从Eclipse 转用AS最难受的估计就是快捷键了&#xff0c;整了好久才基本把个人在Eclipse上使用的快捷键给找差不多&#xff0c;但还是有些快捷键木有&#xf…

学习flex布局(弹性布局)

Flex是Flexible Box的缩写&#xff0c;意为弹性布局。是W3C早期提出的一个新的布局方案。可以便捷的实现页面布局&#xff0c;目前较高版本的主流浏览器都能兼容&#xff0c;兼容情况如下&#xff1a; Flex在移动端开发上已是主流&#xff0c;比如在h5页面&#xff0c;微信小程…

php创建无限级树型菜单以及三级联动菜单

http://www.php.cn/php-weizijiaocheng-373500.html 这篇文章主要介绍了php创建无限级树型菜单 &#xff0c;主要使用的是递归函数&#xff0c;感兴趣的小伙伴们可以参考一下 写递归函数&#xff0c;可考虑缓存&#xff0c;定义一些静态变量来存上一次运行的结果&#xff0c;多…

oracle数据库用脚本运行SQL语句

1. 在同一个目录下创建 runBatch.bat sqlplus sys/sangfororcl as sysdba sql.txtpausesql.txt 要执行的SQL语句 2. 双击runBatch.bat转载于:https://www.cnblogs.com/ddmiao/p/3654227.html

使用Docker镜像和仓库

为什么80%的码农都做不了架构师&#xff1f;>>> Docker镜像 由文件系统叠加而成最底端第一层是引导文件系统bootfs&#xff0c;类似grub镜像第二层是root文件系统rootfs列出镜像 huangyiHP ~ % sudo docker images REPOSITORY TAG IMAGE …

ip_forward

Linux系统缺省并没有打开IP转发功能&#xff0c;要确认IP转发功能的状态。可以查看/proc文件系统&#xff0c;使用下面命令&#xff1a; cat /proc/sys/net/ipv4/ip_forward如果上述文件中的值为0,说明禁止进行IP转发&#xff0c;如果是1,则说明IP转发功能已经打开。要想打开I…

C++primer plus第六版课后编程题答案8.3(正解)

在百度知道里面得到了正确的答案 http://zhidao.baidu.com/question/198940026560129285.html?quesup2&oldq1 #include<iostream> #include <string>//出问题时&#xff0c;使用的是cstring,但换成string一样出问题 using namespace std; struct stringy{char…

WordPress后台删除不需要的侧边栏菜单

https://www.ludou.org/remove-admin-menu-in-wordpress.html function remove_submenu() {// 删除"设置"下面的子菜单"隐私"remove_submenu_page( options-general.php, options-privacy.php );// 删除"外观"下面的子菜单"编辑"remov…

CSS 实例

CSS 实例 CSS背景 设置页面的背景颜色 设置不同元素的背景颜色 设置一个图像作为页面的背景 错误的的背景图片 如何在水平方向重复背景图像 如何定位背景图像 一个固定的背景图片&#xff08;这个图片不会随页面的其余部分滚动&#xff09; 在一个声明的所有背景属性 高级的背景…

通过ajax提交到url路由

$regBoxform.find(button).on(click, function(){/*通过ajax提交请求*/$.ajax({type:post, /*用post 方式提交*/url:/user/register, /*提交到api的指定路由路径*/dataType: json,data:{username: $regBoxform.find([name"username"]).val(),password: $regBoxform.f…

wordpress发布文章时右侧边栏选择作者的功能代码

因为本网络营销博客现在有了两个作者&#xff0c;在后台发布文章时&#xff0c;希望可以选择作者&#xff08;以前仅是一个管理员&#xff09;。通过在网上查找资料&#xff0c;并进行实践成功。特分享如下。 一 在当前使用主题目录下的functions.php中添加以下php代码&#x…

查找邮件日志

#查找收件人的邮件get-messagetrackinglog -start "10/08/2015 17:00" -end "10/08/2015 21:00" -recipients "l1xin.com" #查找发件人的邮件get-messagetrackinglog -start "10/08/2015 17:00" -end "10/12/2015 17:00" -s…

c# webbrowser  获取用户选中文字

c# webbrowser 获取用户选中文字 原文:c# webbrowser 获取用户选中文字最近一直被一个问题困扰&#xff0c;有一个文本框&#xff0c;一个webbrowser控件&#xff0c;一个上下文菜单&#xff0c; 用户用鼠标左键选中文字&#xff0c;右键点击搜索&#xff0c;就把选中的文字赋…