单向链表

单向链表实例:终端交互简易通讯录

狂风中的少年 提交于 2020-03-24 01:21:05
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 6 typedef struct Contacts_infomation{ 7 char name[13]; 8 char work_unit[61]; 9 char phone_number[12]; 10 char E_mail[61]; 11 struct Contacts_infomation *next; 12 }con_info; 13 14 15 con_info * Creat_node(void) 16 { 17 con_info *new; 18 19 new = (con_info *)malloc(sizeof(con_info)); 20 if(!new){ 21 printf("Malloc Error!\n"); 22 exit(-1); 23 } 24 new->next = NULL; 25 26 return new; 27 } 28 29 int insert_node(con_info ** phead) 30 { 31 con_info *new, *cur; 32 33 cur = *phead; 34 new = Creat_node(); 35 if(!new){ 36 return -1; 37

java集合类分析-hashmap

为君一笑 提交于 2020-03-22 08:13:11
一、HashMap概述 二、HashMap的数据结构 三、HashMap源码分析 1、关键属性 2、构造方法 3、存储数据 4、调整大小 5、数据读取 6、HashMap的性能参数 一、HashMap概述   HashMap基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。   值得注意的是HashMap不是线程安全的,如果想要线程安全的HashMap,可以通过Collections类的静态方法synchronizedMap获得线程安全的HashMap。 Map map = Collections.synchronizedMap(new HashMap()); 二、HashMap的数据结构   HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快的查询速度主要是因为它是通过计算散列码来决定存储的位置。HashMap中主要是通过key的hashCode来计算hash值的,只要hashCode相同,计算出来的hash值就一样。如果存储的对象对多了,就有可能不同的对象所算出来的hash值是相同的,这就出现了所谓的hash冲突。学过数据结构的同学都知道

FutureTask源码完整解读

谁都会走 提交于 2020-03-13 03:06:14
1 简介 上一篇博客“ 异步任务服务简介 ”对FutureTask做过简要介绍与分析,这里再次对FutureTask做一次深入的分析(基于JDK1.8)。 FutureTask同时实现了Future 、Runnable接口,因此它可以交给执行器Executor去执行这个任务,也可以由调用线程直接执行run方法。 根据FutureTask.run方法的执行状态,可将其分为以下3种状态 ①未启动: run方法还未被执行,FutureTask处于未启动状态。 ②已启动: run方法在执行过程中,FutureTask处于已启动状态 ③已完成:run方法正常完成返回或被取消或执行过程中因异常抛出而非正常结束,FutureTask处于已完成状态。 当FutureTask处于未启动或已启动状态时,执行FutureTask.get()方法将导致调用线程阻塞;当FutureTask处于已完成状态时,执行FutureTask.get()方法将导致调用线程立即返回结果或抛出异常。 当FutureTask处于未启动状态时,执行FutureTask.cancel()方法将导致此任务永远不会被执行;当FutureTask处于已启动状态时,执行FutureTask.cancel(true)方法将以中断执行此任务线程的方式来试图停止任务;当FutureTask处于已启动状态时,执行 FutureTask

JDK源码分析(7)之 Reference 框架概览

﹥>﹥吖頭↗ 提交于 2020-03-12 20:45:17
对于 Reference 类大家可能会比较陌生,平时用的也比较少,对他的印象可能仅停在面试的时候查看引用相关的知识点;但在仔细查看源码后发现 Reference 还是非常实用的,平时我们使用的类都是强引用的,它的回收完全依赖于 GC;但是对于有些类我们想要自己控制的时候就比较麻烦,比如我想在内存还足够的时候就保留,不够的时候就回收,这时使用 Reference 就能够十分灵活的控制类的存亡了。 一、类定义 /** * Abstract base class for reference objects. This class defines the * operations common to all reference objects. Because reference objects are * implemented in close cooperation with the garbage collector, this class may * not be subclassed directly. * * @author Mark Reinhold * @since 1.2 */ public abstract class Reference<T> {} 从注释和类图中可以清楚的看到: Reference 类是直接配合 GC 操作的,所以不能直接子类化,但是可以继承

HashTable源码解析

回眸只為那壹抹淺笑 提交于 2020-03-02 10:32:00
Hashtable 简介 和HashMap一样,Hashtable 也是一个 散列表 ,它存储的内容是 键值对(key-value)映射 。 Hashtable 继承于Dictionary ,实现了Map、Cloneable、java.io.Serializable接口。 Hashtable 的函数都是 同步的 ,这意味着它是线程安全的。它的key、value都不可以为null。此外,Hashtable中的映射不是有序的。 此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。 为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。 Hashtable 的实例有两个参数影响其性能: 初始容量 和 加载因子 。容量 是哈希表中桶 的数量,初始容量 就是哈希表创建时的容量。 注意,哈希表的状态为 open:在发生“哈希冲突”的情况下,单个桶会存储多个条目,这些条目必须按顺序搜索。 加载因子 是对哈希表在其容量自动增加之前可以达到多满的一个尺度。初始容量和加载因子这两个参数只是对该实现的提示。 关于何时以及是否调用 rehash 方法的具体细节则依赖于该实现。 通常, 默认加载因子是 0.75 , 这是在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销, 但同时也增加了查找某个条目的时间

约瑟夫问题(C++单向链表解法)

安稳与你 提交于 2020-02-05 18:47:23
【问题描述】 n 个人(编号从1~n)围成一圈,从第 k 个人开始数数,数到 m 的人出圈,然后继续从未出列的下一个人开始数数,数到 m 的人出圈,重复上述过程,直到圈中仅剩下一人。 【输入形式】 输入为一行三个正整数,n、k、m。 【输出形式】 输出为一个正整数,表示最后剩下的人的编号。 【样例输入】 100 1 5 【样例输出】 47 【示例代码】 (可对比数七小游戏) # include <iostream> using namespace std ; class person { private : int no ; /* 人的编号 */ person * next ; /* 指向相邻的下一个人 */ public : person ( int num ) { no = num ; next = NULL ; } void setNext ( person * p ) { next = p ; } int getNo ( ) { return no ; } person * getNext ( ) { return next ; } } ; class cycle { private : person * start ; /* 开始数数的位置 */ int out ; /* 数到几出列 */ int inQueue ; /* 队伍中现有人数 */ public :

单向链表

假如想象 提交于 2020-02-05 00:15:20
原题点这里 代码如下 #include<iostream> using namespace std ; const int N = 100010 ; int ne [ N ] , e [ N ] , head , idx ; void init ( ) { idx = 0 ; head = - 1 ; } void dele ( int k ) { ne [ k ] = ne [ ne [ k ] ] ; } void add_to_head ( int x ) { e [ idx ] = x ; ne [ idx ] = head ; head = idx ; idx + + ; } void add ( int k , int x ) { e [ idx ] = x ; ne [ idx ] = ne [ k ] ; ne [ k ] = idx ; idx + + ; } int main ( ) { int n ; init ( ) ; cin > > n ; while ( n-- ) { int k , x ; char op ; cin > > op ; if ( op = = 'H' ) { cin > > x ; add_to_head ( x ) ; } if ( op = = 'D' ) { cin > > k ; if ( k = = 0 ) head =

单向链表

可紊 提交于 2020-02-01 02:05:26
/* @@ author:justinzhang email:uestczhangchao@gmail.com time:2012-9-1 18:51:44 desc: all the list related operation will be place here; including: 1> combine_list(list<type> *l1, list<type>* l2); 2> list_intersect(list<type> *l1, list<type> *l2) @@ */ #include <iostream> #include <cmath> #include <ctime> using namespace std; template <typename type> class list { public: list<type>* create_list(); void show_list(list<type> *lhead); list<type>* combine_list(list<type> *l1, list<type>* l2); bool list_intersect(list<type> *l1, list<type> *l2); type random(type begin, type end); type get_data() {

单向链表

僤鯓⒐⒋嵵緔 提交于 2020-01-31 14:00:52
链表节点(其中info 表示节点信息,next是下一个节点引用,其中info可以通过template<class T> 实现泛型链表) #pragma once class IntSSLNode { public: IntSSLNode() { next = 0; info = 0; } IntSSLNode(int info, IntSSLNode* in = 0) { this->info = info; next = in; } int info; IntSSLNode* next; }; 链表类 #pragma once #include "IntSSLNode.h" class IntSSList { public: IntSSList() { head = tail = 0; } ~IntSSList(); int isEmpty() { return head == 0; } void addToHead(int); void addTotail(int); int deleteFromHead(); int deleteFromTail(); void deleteNode(int); bool isInList(int) const; private: IntSSLNode* head, * tail; }; #include<iostream> #include

C# 单向链表 逆序(递归)

你离开我真会死。 提交于 2020-01-31 14:00:13
1 static void Main(string[] args) 2 { 3 while (true) 4 { 5 LinkedList L = new LinkedList(); 6 L.Add(new Node("first")); 7 L.Add(new Node("second")); 8 L.Add(new Node("third")); 9 L.Add(new Node("forth")); 10 Cw(L.Head); 11 L.Head= Reverse(L.Head); 12 Cw(L.Head); 13 Console.ReadKey(); 14 i = 1; 15 } 16 17 } 18 19 private static int i = 1; 20 21 22 //单向链表逆序 23 private static Node Reverse(Node header) 24 { 25 if (header.Next == null) 26 { 27 return header; 28 } 29 //找到最后一个 30 var node = Reverse(header.Next); 31 //后一个的指针 指向前一个 32 header.Next.Next = header; 33 //前一个指针置空 34 header.Next = null; 35