#include <bits/stdc++.h> using namespace std; struct node { char data; struct node *lc, *rc; }; char s[505]; int num; struct node *creat() { struct node *root; if(s[num ++] == ',') { root = NULL; } else { root = new node; root -> data = s[num - 1…
本文根据<大话数据结构>一书,实现了Java版的单链表. 每个结点中只包含一个指针域的链表,称为单链表. 单链表的结构如图所示: 单链表与顺序存储结构的对比: 实现程序: package LinkList; /** * 说明: * 1.<大话数据结构>中没有线性表的长度,但提到可以存储于头节点的数据域中. * 本程序的线性表长度存放于count变量中,线性表长度可以使程序比较方便. * 2.程序中,第i个位置代表第i个结点,头结点属于第0个结点 * 3.因为链表为泛型,整表创建采用…
逻辑结构上一个挨一个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着.恰恰相反,数据随机分布在内存中的各个位置,这种存储结构称为线性表的链式存储. 由于分散存储,为了能够体现出数据元素之间的逻辑关系,每个数据元素在存储的同时,要配备一个指针,用于指向它的直接后继元素,即每一个数据元素都指向下一个数据元素(最后一个指向NULL(空)). 图1 链式存储存放数据 如图1所示,当每一个数据元素都和它下一个数据元素用指针链接在一起时,就形成了一个链,这个链子的头就位于第一个数据元素,这样的存储方式就…
数据结构实验之排序五:归并求逆序数 Time Limit: 50 ms Memory Limit: 65536 KiB Problem Description 对于数列a1,a2,a3-中的任意两个数ai,aj (i < j),如果ai > aj,那么我们就说这两个数构成了一个逆序对:在一个数列中逆序对的总数称之为逆序数,如数列 1 6 3 7 2 4 9中,(6,4)是一个逆序对,同样还有(3,2),(7,4),(6,2),(6,3)等等,你的任务是对给定的数列求出数列的逆序数. Input…
数据结构实验之图论五:从起始点到目标点的最短步数(BFS) Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Description 在古老的魔兽传说中,有两个军团,一个叫天灾,一个叫近卫.在他们所在的地域,有n个隘口,编号为1..n,某些隘口之间是有通道连接的.其中近卫军团在1号隘口,天灾军团在n号隘口.某一天,天灾军团的领袖巫妖王决定派兵攻打近卫军团,天灾军团的部队如此庞大,甚至可以填江过…
数据结构实验之二叉树五:层序遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点).请建立二叉树并求二叉树的层次遍历序列. Input  输入数据有多行,第一行是一个整数t (t<1000),代表有t行测试数据.每行是一个长度小于50个字符的字符串. Output  输出二叉树的层次遍历序列. Example…
[文档整理系列] 线性链表之单链表 /* 问题描述:线性表____链表_____单链表 @date 2017-3-7 */ #include<iostream> using namespace std; template<typename T> struct node{ T data; node<T> *next; }; template<typename T> class LinkedList{ public: LinkedList(); LinkedLi…
数据结构实验之二叉树五:层序遍历 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Description 已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点).请建立二叉树并求二叉树的层次遍历序列. Input  输入数据有多行,第一行是一个整数t (t<1000),代表有t行测试数据.每行是一个长度小于50个字符的字符串. Output  输出二叉树的层次遍历…
数据结构实验之排序五:归并求逆序数 Time Limit: 40MS Memory Limit: 65536KB Submit Statistic Problem Description 对于数列a1,a2,a3…中的任意两个数ai,aj (i < j),如果ai > aj,那么我们就说这两个数构成了一个逆序对:在一个数列中逆序对的总数称之为逆序数,如数列 1 6 3 7 2 4 9中,(6,4)是一个逆序对,同样还有(3,2),(7,4),(6,2),(6,3)等等,你的任务是对给定的数列求…
数据结构实验之查找五:平方之哈希表 Time Limit: 400MS Memory Limit: 65536KB Submit Statistic Problem Description 给定的一组无重复数据的正整数,根据给定的哈希函数建立其对应hash表,哈希函数是H(Key)=Key%P,P是哈希表表长,P是素数,处理冲突的方法采用平方探测方法,增量di=±i^2,i=1,2,3,...,m-1 Input 输入一组测试数据,数据的第1行给出两个正整数N(N <= 500)和P(P >=…
数据结构实验之查找五:平方之哈希表 Time Limit: 400 ms Memory Limit: 65536 KiB Problem Description 给定的一组无重复数据的正整数,根据给定的哈希函数建立其对应hash表,哈希函数是H(Key)=Key%P,P是哈希表表长,P是素数,处理冲突的方法采用平方探测方法,增量di=±i^2,i=1,2,3,...,m-1 Input 输入包含多组测试数据,到 EOF 结束. 每组数据的第1行给出两个正整数N(N <= 500)和P(P >=…
数据结构实验之二叉树五:层序遍历 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点).请建立二叉树并求二叉树的层次遍历序列. Input 输入数据有多行,第一行是一个整数t (t<1000),代表有t行测试数据.每行是一个长度小于50个字符的字符串. Output 输出二叉树的层次遍历序列. Sample Input 2 abd,,eg,…
一 (单)链表 ADT + Status InitList(LinkList &L) 初始化(单)链表 + void printList(LinkList L) 遍历(单)链表 + int ListLength(LinkList L) 获得表长 + void CreateList_Head(LinkList &L, int n) 创建单链表 (头插法)[重点] + void CreateList_Rear(LinkList &L, int n) 创建单链表 (尾插法) [重点] +…
一.单链表(LinkedList)介绍和内存布局 链表是有序的列表,它在内存中的实际存储结构如下: 看上去虽然无序,但他是靠灭个链表节点元素的地址和next域来分清首尾相连的顺序,如下图所示,由头指针指向第一个元素,进而第二个.三个... 链表的逻辑结构: 二.单链表创建.遍历实现以及单链表节点增.删.改.查操作   1.创建.新增.遍历显示 模型如下:1)head节点 2)中间节点 3)尾结点 每个节点的next域指向下一个节点的对象地址,尾结点为空 创建 新建所需实体类: package .…
首先,链表有以下特点: 1. 存储空间不固定,可灵活扩充 2.方便多次的插入和删除,效率较高 单链表 单链表是最常用的链表,其对数据的操作均为单项的,向后查找的. /* 链表(基于对象) 此处为单链表 */ function Node (ele) { this.element = ele; this.next = null; } function LinkedList () { this.head = new Node("head"); // 头结点 this.find = find;…
在单链表中,每个结点包括两部分:存放每个数据元素本身信息的数据域和存放其直接后继存储位置的指针域. 单链表结点的类型描写叙述: typedef int ElemType; typedef struct node{ ElemType data; struct node *next; }LNode,*LinkList; 单链表的存取必须从头指针開始进行,因此,通经常使用头指针来标识一个单链表.若头指针为空,则表示空链表. 有时,在单链表的第一个结点之前附设一个结点.称之为头结点. 单链表的操作: 1…
# coding:utf-8 # 单链表的相关操作: # is_empty() 链表是否为空 # length() 链表长度 # travel() 遍历整个链表 # add(item) 链表头部添加元素 # append(item) 链表尾部添加元素 # insert(pos, item) 指定位置添加元素 # remove(item) 删除节点 # search(item) 查找节点是否存在 class Node(object): """节点""&quo…
使用单链表实现LRU(Least Recently Used)淘汰缓存机制 需求:存在一个单链表,在单链表尾部的都是越早之前添加的元素. 当元素被访问到时,会添加进缓存(也就是这个单链表中). 如果这个元素在之前已经被缓存到了链表中,则将这个元素从原来的位置删除,用头插法放到链表的头部. 如果这个元素不在链表中,则根据链表的容量进行判断 缓存容量未满时,直接用头插法,放到链表的头部 缓存容量已满时,首先删除链表尾部的元素,再将元素进行插入到头部. 创建Node对象 package com.cod…
参考资料 • Floyd判圈算法 { 链接 } • 单链表“环”.“环的起点”.环的长度”问题 { 链接 } 链表环的问题 一.判断链表有换 使用两个指针slow和fast.两个指针开始时均在头节点处(SS点),slow指针(龟)一次向后移动一个一步,fast指针(兔)一次向后移动两步.若存在环,则slow和fast必能相遇:反之若slow到达链表尾时两个指针仍不能相遇,则不存在环. 代码:链接 如果我们把环从P点“切开”(当然并不是真的切,那就破坏原来的数据结构了),那么问题就转化为计算两个相…
归并排序详解(戳我). 以下是搬了别人的. #include<stdio.h> #include<stdlib.h> long long sum = 0; int a[100005]; int temp[100005]; void Merge(int s1, int e1, int s2, int e2) { int p = 0; int p1 = s1; int p2 = s2; while(p1 <= e1 && p2 <= e2) { if(a[p…
Hash表的平方探测思路:如果当前这个没存放数值,就放进去,如果当前这个地方Hash [ i ] 已经有数值了,就以平方的间隔左右寻找没有存放数的空白 Hash [ i ]. #include <bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; int a[2000]; int Hash[2000]; int main() { int n,p; while(~scanf("%d%d",&n…
分析:有向图里面找最短路径,原理就是每一步都走距离自己最近的路, 一旦发现走一步可以到,那么这个一定是最短的. #include <bits/stdc++.h> using namespace std; struct node { int step; int data; }l,w; int vis[1002]; int gra[1002][1002]; int n, m, u, v; void bfs(int s) { vis[s] = 1; w.data = s; w.step = 0; s…
#include <stdio.h> #include <string.h> #include <stdlib.h> struct node { char data[15]; struct node *next; //存放名字 }; struct node *head[2018]; // 每个课程都有一个相应的开始 int num[2018]; // 存放每个课程选的人数 char name[15]; int main() { int n,m,sum,cnt; whil…
#include <stdio.h> #include <stdlib.h> #include <string.h> void Swap(int a[], int i, int j) // 交换函数 { int t = a[i]; a[i] = a[j]; a[j] = t; } void HeapMerge(int *a,int i,int n) //调整函数,也是核心地方 // 以下的树的概念都是把这个堆转变成树来说的 { int lc = 2*i; // 因为我们…
(不知道为啥开个数组就 TLE .QAQ) #include <stdio.h> #include <stdlib.h> #include <string.h> //const int maxn = 100005; // //int a[maxn]; int main() { int n,k,ans,x; while(~scanf("%d%d",&n,&k)) { ans = -1; for(int i = 1; i <= n;…
#include <stdio.h> #include <string.h> #include <stdlib.h> int a[1000005]; int fin(int x,int l,int r) { int m = (l + r) / 2; if(l > r) return -1; if(a[m] == x) return m; else if(a[m] > x) return fin(x,l,m - 1); //别忘记了 m 需要变化 else r…
#include <bits/stdc++.h> using namespace std; int gra[1002][1005]; int vis[1002]; int n,m; void dfs(int x) { vis[x] = 1; for(int i = 1; i <= n ; i ++) { if(gra[x][i] == 1 && !vis[i]) { dfs(i); } } } int main() { while(~scanf("%d%d&qu…
#include <bits/stdc++.h> using namespace std; struct node { char data; struct node *lc, *rc; }; char a[100]; int num = 0; struct node *creat() { struct node *root; if(a[num++] == ',') { root = NULL; } else { root = new node; root -> data = a[num…
#include <stdio.h> #include <string.h> struct node { char data; struct node *l,*r; }; struct node *root; char st[51]; int i; int count; struct node *creat() { struct node *root; if(st[i++] == ',') root = NULL; else { root = (struct node *)mall…
Problem Description 数组--矩阵的转置 给定一个m*n的矩阵(m,n<=100),求该矩阵的转置矩阵并输出. Input 输入包含多组测试数据,每组测试数据格式如下: 第一行包含两个数m,n 以下m行,每行n个数,分别代表矩阵内的元素. (保证矩阵内的数字在int范围之内) Output 对于每组输出,输出给定矩阵的转置矩阵.两组输出之间用空行隔开. Sample Input 2 3 1 2 3 4 5 6 1 1 1 Sample Output 1 4 2 5 3 6 1…