1、静态链表
#include <stdio.h>
/**
*定义节点结构体
*/
struct sNode{
int num;
struct sNode* next;
}s[3]={{1},{2},{3}};
typedef struct sNode sn;
/**
*静态单链表
*/
int main(void){
sn *p,*head;
head=s; //将数组首址赋给 临时(头)指针 head;
s[0].next=&s[1]; //将节点2的地址赋给节点1的next指针;节点1next指向节点2
s[1].next=&s[2]; //将节点3的地址赋给节点2的next指针;节点2next指向节点3
s[2].next=NULL; //将NULL赋给节点3的next指针; 节点3next指向NULL
p=head; //将头指针赋给 p指针,完成遍历。
printf("num\n");
do{
printf("%d\t\n",p->num);
p=p->next; //因为当p为节点1时,p->next 是节点2的地址,所以执行完后p的地址就是下一个节点地址。
}while(p!=NULL);
return 0;
}
2、动态链表
3、hash 算法,简单来说就是:利用数组可以根据下标快速定位的特性,来实现能快速查询的数据结构。
文件头(list.h),相当地java中的接口。
#include < stdio.h >
#define HASHSIZE 256
//定义hash表中的节点的类型
struct nlist {
struct nlist * next;
char * key;
char * value;
};
//定义接口中的函数,也就是对外来说,这个程序可以做什么
unsigned hash(char * s); //计算一个串的hash值
struct nlist * lookup(char * key); //查找一个value,根据key
struct nlist * install(char * key, char * value); //插入一个key=value的对象
(list.c)实现头文件(list.h)中声明的函数,相当java中具体的实现类。
#include < string.h >
#include "list.h"
static struct nlist * hashtab[HASHSIZE];
/**
*哈希表的做法,就是把Key通过一个固定的算法函数,既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里,而当使用哈希表进行查询的时候,就是再次使用哈希函数将key转换为对应的数组下标,并定位到该空间获取value,如此一来,就可以充分利用到数组的定位性能进行数据定位。
*/
unsigned hash(char * s) //取得hash值
{
unsigned hashval;
for (hashval = 0; * s != '\0'; s++)
hashval = * s + 31 * hashval;//这里的31并非随意,乃是一个经验值,选取它的目的在于减少冲突,当然,hash冲突这个问题是不能根本避免的。这里只是一个人们在测试中发现的可以相对减少hash冲突的一个数字,可能以后会发现更好的数值来。
return hashval % HASHSIZE;//最简单的hash 算法,就是对一个数进行求余
}
//根据一个键来进行搜索,并返回节点
struct nlist * lookup(char * key) {
struct nlist * np;
for (np = hashtab[hash(key)]; np != NULL; np = np->next)
if (strcmp(key, np->key) == 0)
return np;
return NULL;
}
//用来插入一个新的节点
struct nlist * install(char * key, char * value) {
struct nlist * np;
unsigned hashval;
if ((np = lookup(key)) == NULL) {
np = (struct nlist * )malloc(sizeof(struct nlist));
if (np == NULL || (np->key= strdup(key)) == NULL)
return NULL;
hashval = hash(key);
np->next = hashtab[hashval];
hashtab[hashval] = np;
} else
free((void * )np->value);
if ((np->value= strdup(value)) == NULL)
return NULL;
return np;
}
引用
分享到:
相关推荐
本压缩包“C语言开发----链表HuffmanTree.rar”显然聚焦于使用C语言实现数据结构中的一个重要概念——链表,以及与之结合的哈夫曼树(Huffman Tree),这是一种用于数据压缩的有效算法。 首先,我们来详细了解一下...
总结起来,C语言链表的核心知识点包括: 1. 链表的定义:节点结构、头指针和数据存储。 2. 链表的优点:动态内存分配、灵活的数据增删。 3. 链表类型:单向链表、双向链表和环形链表。 4. 链表操作:插入和删除节点...
帅到不行的C语言---简直简单到不行的最简化----约瑟芬报数问题
在压缩包中的"**c语言基础_c语言编程基础之链表操作示例_反转链表**"文件中,你可以找到关于C语言实现链表反转的具体示例代码,这将帮助你深入理解这个概念,并能动手实践。通过分析和运行这些代码,你可以看到如何...
C语言实现通讯录制作-链表学习案例文章所提到源码 学习数据结构中链表部分的总结 可以在C语言实训或数据结构课程设计中使用 代码相对来说还有许多地方可以改进,希望大家指出 全部内容均由本人所写算法实现
链表作为一种重要的数据结构,在计算机科学中有着广泛的应用,特别是在C语言编程中。本文将深入探讨C语言中的链表操作,特别是...学习并熟练运用这些知识,能提升你的C语言编程技能,为后续的高级编程打下坚实基础。
本项目《C语言数据结构-链表版学生管理系统》通过C语言实现了基于链表的学生信息管理,旨在帮助学习者更好地理解和应用链表。 链表不同于数组,它不连续存储数据,而是通过节点间的指针连接。每个节点包含数据元素...
链表是一种重要的数据结构,广泛应用于计算机科学,特别是在C语言中。它不同于数组,因为数组在内存中是连续存储的,而链表的元素(节点)可以在内存的任意位置,通过指针链接起来。本教程将深入探讨C语言中链表的...
链表是一种基础且重要的数据结构,它在计算机科学和编程,尤其是C语言中扮演着核心角色。相较于数组,链表提供了更加灵活的数据存储方式。...因此,深入学习和实践链表对于提升编程技能具有重要意义。
用于C语言以及数据结构的学习,熟练对循环链表边界的判定 实现了以下功能: 创建无头循环链表 向循环链表中插入元素(头插法,尾插法,任意位置插入法) 删除循环链表中的元素(头删法,尾删法,任意位置删除法) ...
数据结构C语言版-二叉树的三叉链表存储表示.doc
C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言...
本压缩包文件提供了一系列关于C语言实现的数据结构和算法的源代码,对于学习和理解计算机科学至关重要。下面将详细讨论其中涉及的主要知识点。 首先,我们来看"链表"部分。链表是一种线性数据结构,不同于数组,它...
总的来说,这个C语言课程设计提供了链表基础知识的学习机会,包括链表的构造、插入、删除等基本操作。对于初学者,这将是一次宝贵的学习经历,帮助他们深入理解数据结构和C语言编程。通过实践这些操作,你将能够掌握...
本压缩包文件“个人C语言学习实录练习题-链表.数据结构.快速排序练习.rar”显然旨在帮助学习者深入理解C语言中的链表操作和数据结构基础。 链表的常见类型包括单向链表、双向链表和循环链表。在单向链表中,每个...
本资源“C语言实现多态链表”是某培训机构内部的学习材料,旨在帮助开发者理解如何在C语言中通过宏定义来实现一个具有多态性的链表数据结构。下面我们将深入探讨这一主题。 首先,链表是一种动态数据结构,与数组...
本文将深入探讨C语言中的链表和指针相关的知识点,帮助学习者掌握其奥妙。 首先,我们要明白链表不同于数组,数组是连续存储的数据结构,而链表则是由一系列节点构成,每个节点包含数据和指向下一个节点的指针。...
通过解决这道题,程序员可以锻炼对链表操作的熟练度,理解链表翻转的本质,并学习如何在C语言中高效地实现这一过程。同时,参与LeetCode的挑战也能提升编程思维和算法能力,为面试和实际工作中的问题解决打下坚实...
在本资源"C语言开发----c语言华容道源码.rar"中,我们主要探讨的是使用C语言编程实现经典游戏——华容道的源代码。...对于想要提升C语言编程能力和对游戏编程感兴趣的开发者来说,这是一个极好的学习资源。