自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 资源 (1)
  • 收藏
  • 关注

原创 C函数指针的常见2大应用:回调函数和转移表

函数指针在实际的代码中还是很常见,一般有2大应用:1、回调函数(Callback Functions)我们先看一下之前我们在链表中查找一个节点的做法:typedef struct NODE { int value; struct NODE *link;} Node;void display(Node *list) { Node *p = list; do { printf("%d ", p->value); } while(

2021-02-24 20:08:47 240

原创 用链表实现索引单词表

【12.8-7】编写一个函数,把一个新单词插入到问题7所描述的索引表中。函数接受两个参数,一个指向list指针的指针和一个字符串,该字符串假定包含单个单词,如果这个单词原先并未存在索引表中,它应该复制一块动态分配的节点并插入到这个索引表中,如果成功插入返回真,如果该字符原先已经存在于索引表中,或字符串不是以字符开头或其他错误返回假。函数应该维护一个一级链表,节点的排序以字母为序,其余的二级链表则以单词为序排列。第一步构建一个索引列表:typedef struct WORD { str

2021-02-24 15:03:49 613

原创 双链表删除节点

编写一个程序,从双链表中移除一个节点,函数的原型如下int dll_remove(struct NODE *rootp, struct NODE *node);你可以假设节点数据结构在头文件double_linked_list_node.h文件中定义,函数第一个参数是一个指向包含链表根指针的节点的指针,第二个参数是个指向欲移除的节点的指针,如果链表并不包含欲移除的指针,函数就返回假,否则函数移除该节点并返回真。遇到链表操作的题目,第一步就是画一个链表图,然后理清指针指向然后再转化成代码

2021-02-22 16:29:08 6553

原创 单链表移除节点

【12.8-5】编写一个程序,从一个单链表中移除一个节点,函数的原型如下:int sll_remove(struct NODE **rootp, struct NODE *node);你可以假设节点数据结构在头文件singly_linked_list_node.h中定义,函数的第一个参数是一个指向链表根指针的指针,第二个参数是一个指向欲移除的节点的指针,如果链表并不包含该指针,函数就返回假,否则它就移除这个节点并返回真,把一个欲移除的节点的指针而不是欲移除的值作为参数传递给函数有哪些优点?这个

2021-02-22 15:19:01 268 1

原创 高频面试考点:反序排列单链表

【12.8 4】编写一个函数,反序排列一个单链表中所有的节点。函数应该具有下面的原型:struct NODE *sll_reverse(struct NODE *first);在头文件singly_linked_list_node.h中声明节点数据结构。函数的参数指向链表的第一个节点。当链表被重排之后,函数返回一个指向链表新头节点的指针,链表最后一个节点的link字段的值应设置为NULL,在空链表(first == NULL)上执行这个函数将返回NULL。实现单链表的反转方法有很多种,这里就

2021-02-22 14:20:31 268

原创 双链表进化-实现一个最优的双链表插入算法

(注意:这里第一个结点的bwd为NULL,最后一个节点的fwd位NULL。)要将一个节点插入到双链表中,有几种情况:1、插入链表中间位置2、插入链表起始位置3、插入链表结束位置4、原链表为空,相当于既要插入起始位置,又插入结束位置。每种情况有4个指针必须修改:在1,2 两种情况下新节点fwd字段必须设置为指向链表的下一个节点,链表下一个节点的bwd字段必须指向这个新节点。在3,4两种情况下,新节点的fwd字段字段必须设置为NULL,根节点的fwd必须指向这个新节...

2021-02-19 13:36:51 253

原创 单链表进化-实现一个最优的单链表插入算法

实现如下有序的单链表:创建数据结构:typedef struct NODE { int value; struct NODE *link;} Node;版本一:int ssl_inset(Node *current, int new_value) { Node *previous; Node *new_node; while(current->value < new_value) { previous = cu

2021-02-18 18:01:16 362

原创 最简单的数据链表雏形

【11-4】编写一个程序,按照下图中的样子创建数据结构,最后三个对象都是动态分配的结构。第一个对象则可能是一个静态的指向结构的指针。你不必使这个程序过于全面--我们将在下一章讨论这个结构。这个题目就是定义一个最简单的数据链表,实际应用中我们会写大量类似的代码,在后面的链表结构的时候在重点讨论。typedef struct NODE { int value; struct NODE *next;} Node;Node *new_node(int value) { N

2021-02-09 17:37:27 139

原创 从标准输入读取字符串

【11-3】编写一个函数,从标准输入读取一个字符串,把字符串复制到动态内存分配的内存中,并返回该字符串的拷贝,这个函数不应该对读入字符串的长度作任何限制!这个问题比较简单,需要注意字符串输入的结束处理和内存空间的申请的时机。#include <stdio.h>#include <string.h>#include <assert.h>typedef short int int16_t;typedef int int32_t;#define TRU

2021-02-09 15:25:25 762 1

原创 从标准输入读取一系列数字的处理

【11-2】编写一个函数,从标准输入读取一列整数,把这些值存储于一个动态分配的数组中并返回这个数组,函数通过观察EOF判断输入是否结束,数组的第一个数是数组包含的值的个数,它的后面就是这些整数值。这个题目看起来很简单,但是有一个地方不好处理,scanf到达尾部EOF的时候才返回,那这些缓冲区的数据如何存储?这些缓冲区的数据包含了数组大小和实际的数据内容。...

2021-02-08 18:46:49 1056

原创 C语言结构体的位段替代方法

【10-11】如果不使用位段,你怎样实现下面这段代码的功能?假定你使用的是一台16位的机器,它从左向右为位段分配内存。struct { int a: 4; int b: 8; int c: 3; int d: 1;} x;....x.a = aaa;x.b = bbb;x.c = ccc;x.d = ddd;这个题目的思路很重要,特别是对嵌入式开发来讲,在C语言中,不管是什么结构,解析为内存地址映射后就比较好理解。比如这个题目这个结构体变量x,它

2021-02-05 18:14:21 398 1

原创 C语言结构体数组的指针运用

【10-7】考虑下面这些声明和数据。struct NODE{ int a; struct NODE *b; struct NODE *c;};struct NODE nodes[5] = { {5, nodes + 3, NULL}, {15, nodes + 4, nodes + 3}, {22, NULL, nodes + 4}, {12, nodes + 1, nodes}, {18, nodes + 2, nodes .

2021-02-05 15:02:54 613

原创 C实现有效位处理的通用字符串格式化

【9-17】这个程序与前两个练习类似,但更加一般化了,它允许调用程序把逗号放在大数的内部,去除多余的前导0以及提供一个浮动的美元符号等。这个函数的操作类似于IBM370机器上的Edit和Mark指令。它的原型如下:char *edit(char *pattern, char const *digits);它的基本思路很简单,模式(pattern)就是一个图样,处理结果看上去应该向它的样子。数字字符串中的字符根据这个图样所提供的方式从左向右复制到模式字符串。数字字符串的第一位有效数字很重要,结

2021-02-04 21:26:19 205 1

原创 C实现通用字符串格式化

【9-16】这个程序与前一个练习相似,但它更为通用。它按照一个指定的格式字符串对一个数字字符串进行格式化,类似许多BASIC编码器所提供的“print using”语句。函数的原型如下:int format(char *format_string, char const *digit_string);digit_string中的数字根据一开始在format_string中找到的字符从右到左逐个复制到format_string中。注意被修改后的format_string就是这个处理过程的结果,当你

2021-02-04 17:40:18 1613

原创 战争谍报加密算法

【9-12】有一种技巧可以对数据进行加密,并使用一个单词作为它的密钥。下面是它的工作原理:首先,选择一个单词作为密钥,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第一个,其余几个丢弃。现在,修改过的那个单词列于字母表的下面,如下所示:最后,底下那行字母表中剩余的字母填充完整(不能和前面的重复):在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母。因此,使用这个密钥,ATTACK AT DAWN(黎明时攻击)就会被加密为TPPTAD

2021-02-02 22:03:11 718

原创 回文检测

编写函数int palindrome(char *string);如果参数字符串是个回文,函数就返回真,否则返回假。回文就是指一个字符串从左向右和从右向左读是一样的。函数应该忽略所有的非字母字符,而且在进行字符比较时不用区分大小写。其实回文本身的检测逻辑其实很简单,就是将一个指针指向最后,一个指针指向头部,不断靠近对比。但这个题目加了一些额外条件:1、忽略所有非字母字符2、忽略大小写大的检测逻辑没有变化,只是说判断的时候需要添加额外条件。#define TRUE 1#

2021-02-02 15:28:16 613

原创 实现查找字符指定第几次出现的函数my_strnchr

编写一个名叫my_strnchr的函数,它的原型如下:char *my_strnchr(char comst *str, int ch, int which);这个函数类似于strchr,但它的第三个参数指定ch字符在str字符串中第几次出现,例如,第三个参数为1,这个函数的功能就和strchr一样,如果参数为2,这个函数就返回一个指向ch字符在str字符串中第二次出现的位置的指针。char *my_strnchr(char const *str, int ch, int which)

2021-02-01 18:28:03 896

原创 实现字符串拷贝函数my_strcpy

【8-3】编写一个名为my_strcpy的函数,它类似与strcpy函数,但它不会溢出目标数组。复制的结果必须是一个真正的字符串。目标字符数组,是空的,要想保证其不溢出,有什么可以作为判断条件呢? 只有传入一个长度,也就是strncpy的实现。char * my_strcpy(char *dst, const char *src, int size) { strncpy(dst, src, size); *(dst + size - 1) = NUL; return ds

2021-02-01 16:54:13 803 1

原创 实现字符串长度函数my_strlen

【9-2】编写一个名叫my_strlen的函数,它类似与strlen函数,但它能够处理由于使用strn--函数而创建的未以NUL字节结尾的字符串。你需要向函数传递一个参数,它的值就是保存了需要进行长度测试的字符串的数组的长度。这个题目比较简单就2个条件:字符串以'\0'结束,或者到达了传入的len长度:#define NUL '\0'int my_strlen(char * str, int len) { int count = 0; while( *str++ != NU

2021-02-01 16:01:09 664

5日学会动态HTML

5日学会动态HTML

2007-11-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除