顺序单链表插入新节点的一种方法

By | 2016年8月18日

在学习链表的时候我们都接触过单链表插入新结点的问题。其中有一类就是在顺序链表中插入新节点,并保持链表的递增或者递减性质。

最近看《C和指针》一书中提到了一种方法,我个人感觉不错,并且思想非常好。

这是最常见的思维:

//sll_node.h  
  
typedef struct Node  
{  
    int value;  
    Node *next;  
} Node;  
#include "sll_node.h"  
#include <stdio.h>  
  
#define TRUE    1  
#define FALSE   0  
  
// insertNode:把newValue的值插入到递增排序的链表中,正确返回TRUE,错误返回FALSE  
// rootp是链表的头指针。  
int insertNode(Node **rootp, int newValue)  
{  
    Node *newNode; // 新节点的指针  
    Node *previous; // 当前指针的前一个指针  
    Node *current; // 当前指针  
  
    current = *rootp; // 初始化  
    previous = NULL;  
  
    // 查找插入的位置  
    while (current != NULL && current->value < newValue)
    {
        previous = current;
        current = current->next;
    }
  
    // 给新节点分配空间  
    newNode = (Node *)malloc(sizeof(Node));  
    if (newNode == NULL)  
        return FALSE;  
    newNode->value = newValue;  
  
    // 更改新节点的前驱和后继节点  
    newNode->next = current;  
    if (previous == NULL) // 此时插入节点的为链表中第一个节点,修改头指针  
        *rootp = newNode;  
    else  
        previous->next = newNode;

    return TRUE;
}

我以前编写的时候也会用这样的方法:一个当前指针和指向当前指针之前的指针,这样需要讨论原链表是否为空。书中提到了一种抽象,每次插入新的节点,都是改变一个指向这个新节点的指针以及指向下一个节点,这样可以省略讨论插入的节点是否为第一个节点的步骤。代码如下:

#include "sll_node.h"
#include <stdio.h>

#define	FALSE	0
#define TRUE	1

// insertNode2:把newValue的值插入到递增排序的链表中,正确返回TRUE,错误返回FALSE
// nextp是指向当前节点的指针,最初是头指针
int insertNode2(Node **nextp, int newValue)
{
	Node *newNode; // 新节点指针
	Node *current; // 当前节点指针

	current = *nextp; // 最初当前节点为nextp指针指向的节点
	// 查找新插入节点的位置
	while (current != NULL && current->value < newValue)
	{
		nextp = &current->next;
		current = current->next;
	}

	// 为新节点分配内存
	newNode = (Node *)malloc(sizeof(Node));
	if (newNode == NULL)
		return FALSE;
	newNode->value = newValue;

	// 统一了插入的步骤。即:每次插入,都是前一个指针指向新节点,新节点指向下一个节点
	*nextp = newNode;
	newNode->next = current;

	return TRUE;
}

main函数

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "sll_node.h"

int insertNode(Node **rootp, int newValue);
int insertNode2(Node **nextp, int newValue);

int main()
{
	srand(time(0));

	Node *head = (Node *)malloc(sizeof(Node));
	head->next = NULL;

	for (int i = 0; i < 5; i++)
	{
		int temp = rand() % 50;
		printf("%d\n", temp);
		//insertNode(&head,temp);
		insertNode2(&head,temp);
	}
	
	Node *p = head->next;
	while (p != NULL)
	{
		printf("%d\n", p->value);
		p = p->next;
	}

	getchar();
	getchar();
	return 0;
}

因为我个人没有经过正经的课堂训练,自己考研才接触编程、数据结构之类的。看了很多对自学编程提的建议都是多编写,并且要有抽象的思想,所以将这个方法写了下来,可能对很对科班出身的人不算什么问题了吧。

我感觉这个抽象很好,希望是给自己编程道路的一个好的开端吧:)

同时,因为我在初学时发现测试代码也会花费很多时间,所以将完成的代码都贴了上来,而不仅仅是函数,希望也能帮助到更多的想我这样的初学者吧。

站点时间轴

By | 2016年8月15日

16.12.01

开通子站点skills.frankge.me,使用Hexo搭建。当时开通的原因是感觉程序代码的编写和渲染在Hexo博客中显示更佳,再加上之前就有把相关内容独立出来的想法,所以就开通了子站点skills.frankge.me有了之前wordpress建站的经验,感觉上手容易多了。

16.11.21

frankge.me/blog站点全部移至blog.frankge.me,以前的文章保留原链接,但不更新,新链接开始使用。

16.08.29

添加如下插件:

1.LaTeX for WordPress。此插件可以在wordpress编辑LaTex公式。这个插件的作者就是我的推荐博客中阅微堂的博主写的。这个页面中有一些关于此插件用法的总结。

16.08.26

对自己博客的手机端进行了一些优化,比如首页只显示三篇文章标题等,不过手机端的显示每次在更新博文之后几个小时之内会显示成为修改之前的样式。

添加如下插件:

1.WordPress Mobile Themes。此插件可以实现wordpress手机端和桌面端使用不同的主题。
2.WP Super Cache。把wordpress页面静态缓存,提高浏览速度。
3.Dynamic To Top。在文章页面中增加跳转回顶部的插件。
4.BackUpWordPress。众所周知,备份是很重要的,如果出现什么问题,之前的备份就会有很大的作用了。这款插件就是实现自动备份wordpress的插件,可以选择时间将备份的wordpress内容发送到你的邮箱。
5.WordPress 导入工具。将以上提到的BackUpWordPress插件备份的内容还原。之前其实就用过这两款插件。因为本来博客的页面是frankge.me的,但是后来出现了一些问题,所以改到了frankge.me/blog页面,就是用的这两款插件。

16.08.17

添加如下插件:

1.Akismet:此插件可用于过滤垃圾留言。
2.Google XML Sitemap:给自己的博客生成sitemap,方便搜索引擎抓取文章。
3.SyntaxHighlighter Evolved:便于插入代码。支持很多种编程语言:cpp, java, python, css等等,使用方法和支持的语言具体参见这个页面

16年05月

GoDaddy买域名frankge.me。主机采用的戈戈主机。采用wordpress搭建。

建站过程

按照知乎用户@waylight 在怎样搭建一个自有域名的 WordPress 博客?的回答进行。建站期间还遇到一些问题,所以将自己的建站过程记录如下。

主要步骤为:

1.建立本地博客文件

建立博客的过程中肯定需要记录一些信息(比如博客的登录名和密码,主机服务器的ip和登录名密码,还有博客头像和一些备份内容等等)和一些待解决的问题(建立博客可能不是一次就完成的)。这个文件夹用于存放这些信息,便于以后的查看、修改和一些重要信息的备份。

2.购买域名

前文说了,我个人是在GoDaddy上面购买的域名,个人感觉还不错,同时看好像是支持支付宝付款,方便不过我个人是用Visa信用卡付款的。

同时正如知乎的回答中所说,如果你提前想好了想要买的域名,在自己的购物车中放几天,然后GoDaddy就会给你邮箱发送优惠券的,优惠券好像只能信用卡支付使用,具体的忘记了。

3.购买主机空间

只有购买了主机空间,将自己博客内容上传到自己的主机之后,才能让别人看到你的博客内容。支付成功之后主机提供商会给你域名的对应IP,同时还有一些其他的信息。

4.域名解析

使用DNSPod进行域名解析。具体步骤为:

1)在DNSPod中添加域名。
2)把DNS地址修改为DNSPod。登录自己的GoDaddy账户,点击DOMAINS左边“+”号,选择Manage DNS。将其中Nameservers改为”f1g1ns1.dnspod.net”,”f1g1ns2.dnspod.net”。
3)将域名指向主机服务器的ip,即在DNSPod中添加“A记录”。填写完成后如下图。

the-timeline-of-my-blog_modify-dns-01

修改DNS-01

the-timeline-of-my-blog_modify-dns-02

修改DNS-02

the-timeline-of-my-blog_modify-dns-03

修改DNS-03:其中黑色笔划去的部分填写你的主机供应商提供的ip地址。

5.安装wordpress

知乎回答的原文说,不同的主机空间有不同的虚拟主机控制系统,安装的过程也不尽相同,但是步骤都是差不多的。这个具体的我也不太清楚,我的主机空间使用的也是cPanel面板。

1)登录cPanel面板,“数据库”->“MySQL数据库”,创建一个数据库,然后创建用户,将用户添加进数据库,勾选“所有权限”。

the-timeline-of-my-blog_install-wordpress-01

安装wordpress-01

the-timeline-of-my-blog_install-wordpress-02

安装wordpress-02

the-timeline-of-my-blog_install-wordpress-03

安装wordpress-03

the-timeline-of-my-blog_install-wordpress-04

安装wordpress-04

the-timeline-of-my-blog_install-wordpress-05

安装wordpress-05

2)上传WordPress。进入cPanel首页,点击“文件”->“文件管理器”,选择public_html文件夹,将wordpress文件夹中的文件上传至此文件夹(忽略我下图中的“wordpress”和”blog”文件夹)。

the-timeline-of-my-blog_install-wordpress-06

安装wordpress-06

3)按照提示设置wordpress的信息。

以上完成之后,就可以在浏览器中输入你的博客地址,进入wordpress的界面了。

6.主题选择

网上有很多免费的wordpress的主题可供选择,当然也有很多收费的,这个根据自己的需求选择。之后的内容都很简单,就不一一写明了。我个人的主题使用的是twenty fifteen。

初到四牌楼

By | 2016年8月8日

一、

出了文昌宿舍所在的小区,横穿太平北路的一个斑马线,经过文昌桥走到小路的尽头,向右转再走不到100米,就是东南大学四牌楼校区的东门了。

在我眼中,四牌楼校区相比于九龙湖校区,简直是没有可比性的。四牌楼这边宿舍陈旧,实验室太小以至于要两个人做一张桌子,浴室的承载能力有限,在高峰的时候洗澡很不方便,更不用说食堂饭菜不好,体育场也很小等等这些细枝末节的问题了。

当然,这边还是有很多惊喜的。因为去年复试就是在四牌楼,所以国立中央大学的旧址所带来的古朴和厚重就显得没那么吸引我了,令我欣喜的,反倒是另外一番景象。

街道上散落的炒饭摊点,道路两旁整齐的绿化,许久没听见的大片大片的蝉鸣,以及一个城市中老居民区的生活。

听同学说,这个宿舍原本是居民小区,因为学校宿舍不够用征用过来的,所以这附近住着很多的南京本地的居民。有居民的地方,周边自然有很多生活元素:小吃摊、水果店、理发厅等等。这些当然不足为奇,但是这对于在九龙湖那边的生活来说,可算是再奢侈不过了。同时,这些元素让我想起很多年前还能常常呆在家中的时光了——每天早上都要排队等候的包子铺,教育孩子要好好学习的家长,以及下象棋打牌的中年人——起码上了大学之后就没再经历过这样的生活了。这种感觉,只有融入了这样的行为模式一段时间之后才会有,不是仅仅看看就能产生的。

刚到这边的时候给我印象最深的是一家小店,叫做「战将鸡排」,因为它不像附近其他几家炒饭摊那样满是油污,而且这边食堂整体没有九龙湖那边好吃,所以要提前找好懒得去食堂的时候能够饱腹的地方。

最近天热了,看到这家店门口正好贴着凉面皮的价格,我就走过去要了一份。老板拌凉面皮的功夫,我和她搭起话来。

「你这地方不大,卖的种类到不少呢,还真没看出来」,我有点惊叹的问到。

「啊,那可不是么」,老板边忙着拌凉皮儿边回答着我为了避免静默所引起尴尬的随意的话语。

「好久没吃过凉皮了,大概上了大学之后就没再吃过了吧。我刚才九龙湖搬过来,这边四牌楼食堂感觉不太好吃。对了,记得小时候最喜欢吃凉皮里面的面筋泡子,多放点吧」,我接着说到。

「行」。老板爽快的答到。

「我家儿子也是,在外面上大学,整天抱怨食堂的饭菜不好吃,经常在外面吃」,我的话仿佛说到了全国各地大学食堂的通病,她也不禁地帮着儿子抱怨着。

之后,老板又说了说自己店面干净,不仅是学生,还有好多居民都到她这边买小吃的情况,我也跟着搭搭话,表示以后会常来关顾的。

回到寝室吃着凉皮,感觉还是没有小时候家边店里面的味道。

二、

提到蚌埠,大部分人的印象可能是以前坐火车经过此地吧。再多一点,就是蚌埠是一个大站了。

是的,蚌埠是火车拉来的城市,提到它想到蚌埠火车站一点不令人出乎意料。

其实最早听到以「火车拉来的城市」的称呼来形容蚌埠,还是从本科室友的口中。

大概是刚刚上大学没多久,我聊到家乡蚌埠。他说蚌埠是火车拉来的城市。

我听了他的形容之后惊异的问到:「『火车拉来的城市』在以前地理书上面介绍的不是株洲么?」

「我们上地理课时,老师还举了个例子,说我们省的蚌埠也是火车拉来的」,他回答说。

可能是因为他也是安徽人的原因吧,所以老师才会拿一个比较熟悉的城市举例。这是我之后想到一个合理的解释。

其实,蚌埠的小吃也是不错的。可能是因为交通便捷,文化交流会多一点,很多南方北方的小吃本地都有。蚌埠本地曾今有首RAP,叫做《烧饼夹里脊》,里面有句歌词唱到:「都说中华美食遍天下,遍天下的美食都在蚌埠开了花。烧饼,包子,油茶,春卷,辣汤,麻圆,米线,凉皮,火锅,拉面,水单饼,大麻花。吃啥啥香,你要啥有啥」。当然,对于自己家乡的印象每个人都有很多很多,且都如数家珍。熟悉的街道、肆无忌惮开着玩笑的发小儿、伴随着记忆中的自己成长的那些学校,还有在家中做个孩子的味道。

记得刚搬过来的时候,在沙塘园食堂吃饭的时候突然发现有豆腐脑儿,一时兴起想要尝尝,发现也不如小时候家边店里的好吃:汤不是骨头汤,里面没放粉丝,没放黄豆,竟然吃到了一点孜然的味道。吃完了之后想了想,可能也不见得就是不好吃,人家没准认为这是美味呐。只是这不是我熟悉的味道罢。

三、

一转眼,来到四牌楼校区一个月了。

搬到一个新的地儿,自然要置办一些东西,来适应新的住所。这边寝室的地方实在太小了,自己想买一个大点儿收纳箱,把一些柜子里面放不下的衣物给塞到收纳箱里。

这边校区在市区,不远处就有超市,这个我倒是挺满意的。即使在这个网络购物已经足够便捷、实惠的时代,不时去趟超市,看看生活中最常接触的柴米油盐,看看生活中最常遇到的普通百姓,还是很有必要的。而不仅仅是被充斥着京东首页的数码产品或者是铺满淘宝首页的时尚衣物或者是网络媒体中所报道的名人大V所占据。

想了想,好久没吃太多的零食了,而且,很久也没大鱼大肉一番了。其实很久以前,大鱼大肉对我的吸引力就已经不怎么存在了。记得在九龙湖那边时,几次和室友去吃自助,自己都是不停地拿蔬菜水果,而不是去弥补在校园食堂里面亏欠的动物蛋白。

上次一个人逛超市大概是一年多之前吧,研一阶段去超市一直是和室友一起的。看了好几款,挑了一个大小适中,颜色淡雅的收纳箱,放到了手推车里。终于,来到这边宿舍最大的一桩事情算是弄好了——我的东西差不多能放下了。

走到零食的那一排排货架前,自己还是在那放缓了步伐,毕竟我每次都会买点饼干之类的简单食品,留在晚上饿了的时候充饥。现在零食的种类确实丰富,不论从口味还是包装,都足够吸引人。我拿了一袋看看,这个钠含量太高了,给放了回去;又拿了一袋看看,这个能量太高,也不需要,又给放了回去。我在这排货架面前驻足了有大约十几分钟,最后还是拿了自己常吃的那种饼干放到了推车里面:有一点糖分,在晚间能补充能量;钠的含量不高,对于现代人的生活节奏而言比较合适;而且每个小包装里面数量不多,不用怕放久了回潮。

走到收银台那边,不经意间看到一个顾客推车里面放满了零食,我没忍住嘴角微微扬起:「原来在很多方面,我已经足够理性了。」

「人到了一定年龄,分化的程度太令人可怕了。」我有点无奈地笑笑。

四、

2016年7月的南京,甚至全国,都是挺令人难忘的吧。湖北、安徽等地区遭遇了多年不遇的强降雨,很多地方水灾泛滥。起初天气还不算热的,但是雨一停,直接进入了以往夏季的燥热。空气中到处都弥散着令人窒息的热气。

横穿太平北路,经过文昌桥。经过文昌桥,再横穿太平北路。去实验室,回寝室。这是再熟悉不过的路程了。

横穿太平北路的时候,要经过一个斑马线。斑马线前的红灯,大约80秒左右。在这盛夏的时节,等个红灯,也足以让人感到筋疲力尽。

那天,我在看到绿灯刚刚过了之后,站在很远的树荫下等红灯。红灯后,一个女生从斑马线的另一端走过来,白皙的皮肤,穿着蓝色上衣、白色的裙子,打着遮阳伞。她大概注意到我了,嘴角微微上扬,视线向另一侧转去。其实在等红绿灯的功夫我就注意到她了。我也微微笑笑,然后径直地穿过了斑马线。