`
ileson
  • 浏览: 215028 次
  • 性别: Icon_minigender_1
  • 来自: 河南省
社区版块
存档分类
最新评论

C语言之-链表学习

c 
阅读更多
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语言开发----链表HuffmanTree.rar”显然聚焦于使用C语言实现数据结构中的一个重要概念——链表,以及与之结合的哈夫曼树(Huffman Tree),这是一种用于数据压缩的有效算法。 首先,我们来详细了解一下...

    c语言--链表 PPT

    总结起来,C语言链表的核心知识点包括: 1. 链表的定义:节点结构、头指针和数据存储。 2. 链表的优点:动态内存分配、灵活的数据增删。 3. 链表类型:单向链表、双向链表和环形链表。 4. 链表操作:插入和删除节点...

    学习C语言的第一个难点---链表

    帅到不行的C语言---简直简单到不行的最简化----约瑟芬报数问题

    c语言基础-c语言编程基础之链表操作示例-反转链表.zip

    在压缩包中的"**c语言基础_c语言编程基础之链表操作示例_反转链表**"文件中,你可以找到关于C语言实现链表反转的具体示例代码,这将帮助你深入理解这个概念,并能动手实践。通过分析和运行这些代码,你可以看到如何...

    C语言实现通讯录制作-链表学习案例

    C语言实现通讯录制作-链表学习案例文章所提到源码 学习数据结构中链表部分的总结 可以在C语言实训或数据结构课程设计中使用 代码相对来说还有许多地方可以改进,希望大家指出 全部内容均由本人所写算法实现

    c语言基础-c语言编程基础之链表操作示例-环形链表.zip

    链表作为一种重要的数据结构,在计算机科学中有着广泛的应用,特别是在C语言编程中。本文将深入探讨C语言中的链表操作,特别是...学习并熟练运用这些知识,能提升你的C语言编程技能,为后续的高级编程打下坚实基础。

    C语言数据结构-链表版学生管理系统

    本项目《C语言数据结构-链表版学生管理系统》通过C语言实现了基于链表的学生信息管理,旨在帮助学习者更好地理解和应用链表。 链表不同于数组,它不连续存储数据,而是通过节点间的指针连接。每个节点包含数据元素...

    C语言-链表基本操作源码

    链表是一种重要的数据结构,广泛应用于计算机科学,特别是在C语言中。它不同于数组,因为数组在内存中是连续存储的,而链表的元素(节点)可以在内存的任意位置,通过指针链接起来。本教程将深入探讨C语言中链表的...

    C语言经典但链表,C语言经典但链表,C语言经典但链表

    链表是一种基础且重要的数据结构,它在计算机科学和编程,尤其是C语言中扮演着核心角色。相较于数组,链表提供了更加灵活的数据存储方式。...因此,深入学习和实践链表对于提升编程技能具有重要意义。

    数据结构-循环链表-C语言实现循环链表功能-数据结构学习

    用于C语言以及数据结构的学习,熟练对循环链表边界的判定 实现了以下功能: 创建无头循环链表 向循环链表中插入元素(头插法,尾插法,任意位置插入法) 删除循环链表中的元素(头删法,尾删法,任意位置删除法) ...

    数据结构C语言版-二叉树的三叉链表存储表示.doc

    数据结构C语言版-二叉树的三叉链表存储表示.doc

    C语言学习之链表ppt.zip

    C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言学习资源C语言...

    有用的C语言源代码-二叉树-链表-数组等

    本压缩包文件提供了一系列关于C语言实现的数据结构和算法的源代码,对于学习和理解计算机科学至关重要。下面将详细讨论其中涉及的主要知识点。 首先,我们来看"链表"部分。链表是一种线性数据结构,不同于数组,它...

    C语言课程设计 链表

    总的来说,这个C语言课程设计提供了链表基础知识的学习机会,包括链表的构造、插入、删除等基本操作。对于初学者,这将是一次宝贵的学习经历,帮助他们深入理解数据结构和C语言编程。通过实践这些操作,你将能够掌握...

    个人C语言学习实录练习题-链表.数据结构.快速排序练习.rar

    本压缩包文件“个人C语言学习实录练习题-链表.数据结构.快速排序练习.rar”显然旨在帮助学习者深入理解C语言中的链表操作和数据结构基础。 链表的常见类型包括单向链表、双向链表和循环链表。在单向链表中,每个...

    C语言实现多态链表

    本资源“C语言实现多态链表”是某培训机构内部的学习材料,旨在帮助开发者理解如何在C语言中通过宏定义来实现一个具有多态性的链表数据结构。下面我们将深入探讨这一主题。 首先,链表是一种动态数据结构,与数组...

    C语言教程的链表知识

    本文将深入探讨C语言中的链表和指针相关的知识点,帮助学习者掌握其奥妙。 首先,我们要明白链表不同于数组,数组是连续存储的数据结构,而链表则是由一系列节点构成,每个节点包含数据和指向下一个节点的指针。...

    C语言基础-C语言编程基础之Leetcode编程题解之第25题K个一组翻转链表.zip

    通过解决这道题,程序员可以锻炼对链表操作的熟练度,理解链表翻转的本质,并学习如何在C语言中高效地实现这一过程。同时,参与LeetCode的挑战也能提升编程思维和算法能力,为面试和实际工作中的问题解决打下坚实...

    C语言开发----c语言华容道源码.rar

    在本资源"C语言开发----c语言华容道源码.rar"中,我们主要探讨的是使用C语言编程实现经典游戏——华容道的源代码。...对于想要提升C语言编程能力和对游戏编程感兴趣的开发者来说,这是一个极好的学习资源。

Global site tag (gtag.js) - Google Analytics