单链表中节点类型定义如下:
typedef struct link {
int data;
link* next;
}node,*linklist;
1.试编写在带头节点的单链表L中删除一个最小值节点的高效算法(假设最小值节点时唯一的)
void delete_MinX(linklist& L) {
//试编写在带头节点的单链表L中删除一个最小值节点的高效算法(假设最小值节点时唯一的)
node* min_pre = L;//记录最小节点的前一个节点
node* min_p=L->next;//用于指向最小值节点
node* pre=L;//记录遍历时节点的前一个节点
node* p = L->next;
while (p != NULL){
if (p->data <min_p->data) {
min_pre = pre;
min_p = p;
}
pre = pre->next;
p = p->next;
}
min_pre->next = min_p->next;
cout << min_p->data<<endl;
}
2.设在一个带头节点的单链表中所有元素节点的数据值无序,试编写一个函数,删除表中所有介于给定的两个值(作为函数参数给出)之间的元素的元素
void delete_between(linklist& L, int x, int y) {
//设在一个带头节点的单链表中所有元素节点的数据值无序,试编写一个函数,
//删除表中所有介于给定的两个值(作为函数参数给出)之间的元素的元素
node* pre = L;
node* p = L->next;
while (p != NULL) {
if (p->data <= y && p->data >= x) {
pre->next = p->next;
p = p->next;
//free(p);
}
else {
pre = p;
p = p->next;
}
}
}
3.有一个带头节点的单链表L,设计一个算法使其元素递增有序
void sort(linklist& L) {
//有一个带头节点的单链表L,设计一个算法使其元素递增有序
//方法1:断链,逐个插入法;
if (L->next == NULL) {
return;
}
node* p = L->next;
node* rear = p->next;
p->next = NULL;//断链,让其只剩下一个节点,最后采用插入法;
p = rear;
while (p != NULL) {
rear = p->next;
node* q_pre = L;//指向被插入位置的前一个节点
node* q = L->next;
while (q != NULL&&q->data<p->data) {
q_pre = q;
q = q->next;
}
p->next = q_pre->next;
q_pre->next = p;
p = rear;
}
//方法2:交换元素值
/*int length = 0;
node* p = L->next;
while (p != NULL) {
length++;
p = p->next;
}
if (length <= 1) {
return;
}
node* pre = L->next;;
p = pre->next;
int t = 1;
while (t < length) {
int tt = 0;
pre = L->next;
p = pre->next;
while (tt < length - t) {
if (pre->data > p->data) {
int exchange = pre->data;
pre->data = p->data;
p->data = exchange;
}
pre = p;
p = p->next;
tt++;
}
t++;
}*/
}
4.给定两个单链表,编写算法找出两个链表的公共节点。
linklist Common(linklist A, linklist B) {
//给定两个单链表,编写算法找出两个链表的公共节点。
//算法思路:先走K步,然后一同走;
int length1 = 0;
int length2 = 0;
node* p = A->next;
node* q = B->next;
while (p != NULL) {
p = p->next;
length1++;
}
while (q != NULL) {
q = q->next;
length2++;
}
int k;
if (length1 >= length2) {
k = length1 - length2;
p = A->next;
while (k > 0) {
p = p->next;
k--;
}
q = B->next;
}
else {
k = length2 - length1;
q = B->next;
while (k > 0) {
q = q->next;
k--;
}
p = A->next;
}
while (p!=NULL&&q!=NULL&&p->data != q->data) {
//同时走找公共节点
p = p->next;
q = q->next;
}
cout << p->data;
if (p->data == q->data) {
return p;
}
return NULL;
}
5.给定一个带表头节点的单链表,设head为头指针,试写出算法:按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间
void fun1(linklist& head) {
//给定一个带表头节点的单链表,设head为头指针,试写出算法:
//按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间
//不允许数组作为辅助空间
while (head->next != NULL) {
node* min_pre = head;
node* min_p = head->next;//设刚开始最小值就是第一个结点
node* pre = head;
node* p = head->next;
while (p != NULL) {
if (p->data < min_p->data) {
min_p = p;
min_pre = pre;
}
pre = p;
p = p->next;
}
cout << min_p->data << endl;
min_pre->next = min_p->next;
}
}
6.将一个带头节点的单链表分成两个单链表,A存放奇数结点,B存放偶数结点
void fun2(linklist& L) {
//将一个带头节点的单链表分成两个单链表,A存放奇数结点,B存放偶数结点
node* la = (node*)malloc(sizeof(node*));//创建链表A的头节点
node* lb = (node*)malloc(sizeof(node*));//创建链表B的头节点
la->next = NULL;
lb->next = NULL;
node* p = L->next;
node* rear = la;
int t = 1;
while (p != NULL) {
node* temp = p->next;
if (t % 2 == 1) {
//采用尾插法
p->next = rear->next;
rear->next = p;
rear = p;
}
else {
//采用头插法
p->next = lb->next;
lb->next = p;
}
t++;
p = temp;
}
display(la);
display(lb);
}
7.在一个递增有序的线性表中,有数值相同的元素存在,若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素
void delete_same(linklist& L) {
//在一个递增有序的线性表中,有数值相同的元素存在,若存储方式为单链表,
//设计算法去掉数值相同的元素,使表中不再有重复的元素
node* pre = L->next;//指向大小相等的结点中的第一个结点
if (pre == NULL) {
return;
}
node* p = pre->next;
while (p != NULL) {
if (p->data == pre->data) {
//说明中间有相同的元素
p = p->next;
}
else {
pre->next = p;
pre = p;
p = p->next;
}
}
}
怎样向别人介绍WS的功能呢?一般咱们会写接口文档,亦或口头告诉使用的人。这些方式都存在问题:其中一个我上篇中说过,客户端是无法直接使用服务端接口的;二是程序员在电脑前,想使用WS时,他们的工具(如Eclipse、VS)无法提供任何帮助,因为这些工具根本不了解你的WS。解决方案就是定义一套人和电脑都能阅读的规范或文档,因此WSDL首当其冲,你可以把WSDL理解成既是文档,又是代码。它基于XML语...
redis配置的坑一、保护模式DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connection...
swoole_process提供的kill操作用于向指定pid进程发送信号。bool swoole_process::kill($pid, $signo = SIGTERM);默认的信号为SIGTERM,表示终止进程 $signo=0,可以检测进程是否存在,不会发送信号下面我们看下其流程。static PHP_METHOD(swoole_process, kill){ ...
1.申请一个ipv6地址https://www.tunnelbroker.net/创建通道Create Regular Tunnel1.1 创建一个账号1.2 填写你 ECS 的公网 IP 地址以及选择隧道节点,点击 Create Tunnel 创建。注:填写 IP 时出现 IP is a potential tunnel endpoint. 说明可以添加 ipv6 隧道。1....
设计模式什么是设计模式设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。为什么要学习设计模式看懂源代码:如果你不懂设计模式去看Jdk、Spring、SpringMVC、IO等等等等的源码,你会很迷茫,你会寸步难行看看前辈的代码:你去个公司难道都是新项目让你接手?很有可能是接盘的,前辈的开发难道不用设计模式?编写自己的理想中的好代码:我个人反正是这样的,对于我自己开发的项目我会很认
Spring boot + jpa
中国的肠道微生物群及其与主食类型、民族和城市化的关系Chinese gut microbiota and its associations with staple food type, ethnicity, and urbanization研究介绍肠道微生物群对人类健康和疾病影响重大。目前我国仍然缺乏全国性的中国肠道微生物群基线研究。肠道微生物群的失衡(即生态失调)与许多疾病有关,然而,将微生物群研究转化为临床实践仍然受到多重挑战的限制。我们对来自8 个民族、居住在28 个省的63个县/市的2678
如题所说,计算两个日期之前的天数,排除节假日和周末。这里天数的类型为double,因为该功能实现的是请假天数的计算,有请一上午假的为0.5天。不够很坑的是每个日期都要查询数据库,感觉很浪费时间。原则:1.节假日存放在数据库中实现步骤:1.循环每个日期2.判断每个日期是否为节假日或者为周末3.若不是节假日和周末,天数+1代码:public doublecalLeaveDays(Date startT...
安装minicom:$sudo apt-get install minicom配置minicom:如果您的系统的默认语言不是英文,请执行下面的命令:$LANG=EN 这样在接下来的设置中,minicom将以英文界面呈现在我们面前,操作起来比较方便。 在系统终端输入...
.net处理JSON简明教程Json.Net是.net中的一种流行的高性能的JSON框架。特点灵活的JSON序列化转化.net对象为JSON字符串。和把JSON字符串转换为.net对象。手动读写JSON的Linq to JSON比.net内置的JSON序列化程序更高的性能和速度。便于读写的JSON从XML中读取或写入JSON支持S
//获取坐标位置function getpos(e){ var t=e.offsetTop; var l=e.offsetLeft; var height=e.offsetHeight; while(e=e.offsetParent){ t+=e.offsetTop; l+=e.offsetLeft;
总结:IOC即依赖注入,IOC常见的注入形式有三种:构造函数时注入,set方法注入,调用真正的业务函数时以入参注入(最原始的方法)下文对于IOC的注入原理和方式讲的比较清晰了,这里再补充一种注入框架:包括使用自定义注解标记欲注入的属性,根据注解注入的机制实现。自定义注解标记欲注入的属性:首先需要定义一个注解例如MyIOC,然后在类中需要注意的属性上标记@MyIOC,然后添加se