【qianlong88的APUE读书笔记】第二章:uinx标准化及实现

2.1 引言

标准化,为了可移植。

2.2 unix 标准化

ISO C 1999 :24个区,24个头文件

IEEE POSIX 1003.1:定义了一个接口而非实现,故不区分系统调用和库函数

POSIX.1:ISO/IEC 9945-1:1996,包括多线程接口:pthreads

最新,2001

Single UNIX Specification:

遵循XSI的实现才能称作Unix

2.3 unix系统实现

AT&T分支:导出系统iii和系统V

加州大学伯克利分校分支:导出4.xBSD

SVR4/4.4BSD/FreeBSD/Linux/Mac OS X/Solaris/AIX/HP-UX/IRIX/UNIX WARE

2.5 限制

编译时限制:短整形的最大值是?解决:头文件

运行时限制:文件名可以有多少个字符?

Sysconf函数:不与文件或目录相关联

Pathconf和fpathconf函数:与文件或目录相关联

ISO C 限制:都是编译时限制,<limits.h>

POSIX限制,分为5类:

用sysconf等函数得到实际的实现值。

XSI限制:

不确定的运行时限制:很麻烦,没太搞清楚

2.6 选项

2.7 功能测试宏

2.8 基本系统数据类型

头文件<sys/types.h>中定义了某些与实现有关的数据类型,被称作系统数据类型。

定义了这些数据类型后,就不再需要考虑因系统而异的程序实现细节。

2.9 标准之间的冲突

 

后记:当时看这一章的时候觉得很生涩抽象,也没啥意义;但看了后面的章节后,回头看这一章,还是非常有意义的。如限制、系统数据类型等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用线性探测再散列法解决冲突的哈希表实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define TABLE_SIZE 53 #define MAX_PROBE_LENGTH 2 typedef struct Node { char *key; struct Node *next; } Node; Node *table[TABLE_SIZE]; // 哈希函数,使用简单的取模法 unsigned int hash(char *key) { unsigned int value = 0; unsigned int i = 0; unsigned int key_len = strlen(key); // 遍历key中的每个字符,将其ascii码值相加 for (; i < key_len; ++i) { value = value * 37 + key[i]; } // 对TABLE_SIZE取模,确保哈希值在0-TABLE_SIZE-1之间 value = value % TABLE_SIZE; return value; } // 处理冲突的方法,使用线性探测再散列法 unsigned int probe(unsigned int index, unsigned int i) { return (index + i) % TABLE_SIZE; } // 添加键值对 void put(char *key) { unsigned int index = hash(key); unsigned int i = 0; unsigned int probe_index = index; // 线性探测,找到第一个空闲位置 while (table[probe_index] != NULL && i <= MAX_PROBE_LENGTH) { probe_index = probe(index, ++i); } // 如果找到了空闲位置,则插入新节点 if (table[probe_index] == NULL) { Node *new_node = (Node *)malloc(sizeof(Node)); new_node->key = strdup(key); new_node->next = NULL; table[probe_index] = new_node; } else { printf("Error: Hash table is full\n"); } } // 根据key查找节点 Node *find(char *key) { unsigned int index = hash(key); unsigned int i = 0; unsigned int probe_index = index; // 线性探测,查找key对应的节点 while (table[probe_index] != NULL && i <= MAX_PROBE_LENGTH) { if (strcmp(table[probe_index]->key, key) == 0) { return table[probe_index]; } probe_index = probe(index, ++i); } return NULL; } int main() { char *names[] = {"zhangsan", "lisi", "wangwu", "zhaoliu", "sunqi", "liuba", "chenjiu", "zhouer", "wushisan", "zhengshi", "fanyi", "xianghuang", "liushen", "liangqi", "fengwu", "zhangjie", "zhaoyi", "chenjing", "yangming", "zouyun", "zhangliu", "qianqi", "sunba", "zhoujiu", "liangliang", "zhangqing", "liushi", "wangyue", "zhaowu", "xianzi", "yangguang", "songshu", "liuzi", "chenming", "zhaoxing", "jianghu", "zhangfei", "liuyi", "zhaozhao", "liyan", "wangxiao", "fengmian", "zoubo", "sunjun", "zhaohua", "chenkai", "yangzi", "qianlong", "gaoxia", "zhangzhang", "liuxi", "liyue", "zhengzheng", "liujie", "yangyang"}; // 将所有姓名插入哈希表 for (int i = 0; i < 53; i++) { put(names[i]); } // 查找一些姓名 Node *node = find("lisi"); if (node != NULL) { printf("lisi is in the hash table\n"); } else { printf("lisi is not in the hash table\n"); } node = find("zhangsan"); if (node != NULL) { printf("zhangsan is in the hash table\n"); } else { printf("zhangsan is not in the hash table\n"); } node = find("wangmazi"); if (node != NULL) { printf("wangmazi is in the hash table\n"); } else { printf("wangmazi is not in the hash table\n"); } return 0; } ``` 这里使用了一个数组来存储哈希表,每个数组元素对应一个链表,链表中存储了key。在添加键值对的时候,先计算出key的哈希值,然后使用线性探测再散列法,找到第一个空闲位置并插入新节点;在查找节点的时候,也先计算出key的哈希值,然后使用线性探测再散列法,查找key对应的节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值