草庐IT

1、区块链(必做)(链表)

森之夏时 2024-02-20 原文

1、区块链(必做)(链表)

[问题描述]

使用链表设计一个保存信息的系统,该系统拥有类似区块链的设计以防止信息被轻易篡改。

该题目使用一个链表。信息保存在链表的每一个节点中,每个节点需要包含该节点的编号、信息和校验码。其中:

+ 每个节点的编号按照顺序递增,从0开始。

+ 节点中包含的信息是字符串,且每个字符的ASCII码范围为0-127,以\0结束。

+ 每个节点的校验码等于上一个节点的校验码+本节点的节点编号+本节点信息中字符串ASCII码之和 mod 113。

+ 首个节点的校验码则是本节点信息中字符串ASCII码之和 mod 113。

+ 有效的链表要求所有节点的校验码都能够成功按照上述算法得出。

[基本要求]

(1)要求从文本文件中输入;

(2)给定链表,检查链表是否有效。若无效,输出首个无效节点的节点编号;

(3)允许向链表中添加信息,要求保证链表始终有效;

(4)篡改一个有效的链表中特定编号的节点信息内容,保持篡改后的链表仍然有效。注意,可能需要篡改多个节点以达到此要求。

 

#include <iostream>
#include <fstream>
#include <queue>
#include <math.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>

#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE 0

#define MAXSIZE 128
#define QSIZE 128
#define QINCREMENT 128

using namespace std;

typedef string DataType; 
typedef int ElemType;
typedef int Status;

const char *fileName = "text1.txt";

typedef struct LNode{
	int order_node;
	DataType data;
	int check_node;
	struct LNode *next;	
}LNode,*LinkList;

typedef struct SListInfo{
	LinkList head;
	LinkList tail;
	LNode *pCurNode;
	int length;
}SListInfo;

Status ListLength(LinkList L){//单链表长度
	int n=0;
	LNode *p;
	p = L->next;
	while (p)
	{
		n++;
		p = p->next;
	}
	return n;
}

string st = "";

Status InitList(LinkList &L){//初始化单链表 
	L = (LNode*) malloc (sizeof(LNode));
	if(L == NULL) exit(OVERFLOW);
	L->next = NULL;
//	L->data = st;
//	L->order_node = 0;
//	L->check_node = 0;
	return OK; 
}

Status FirstInsert(LinkList &L){
	L->data = st;
	L->order_node = 0;
	L->check_node = 0;
}

Status InsertElem(LinkList &L, int i, DataType e){	//在第i个位置插入e

	LNode *s =(LNode*)malloc(sizeof(LNode));    //申请新的节点
	
	if(s == NULL)	exit(0);    //申请节点失败 
	
	for(int j = 0; j <MAXSIZE;j++){
		s->data = e;
	} 
	
	LNode *p;
	p = L->next;
	if(i == 1)
	{
		s->next = p;
		L->next = s;
	}
	else if(i>1  &&  i <= ListLength(L))
	{
		for(int j = 0;j<i-2;j++)
		{
			p = p->next;
		}
		s->next = p->next;
		p->next = s;
	}
	else if(i == ListLength(L)+1)
	{
		for(int j = 0;j<i-2;j++)
		{
			p = p->next;
		}
		p->next = s;
		s->next = NULL;
	}
	else
	{
		cout<<"No Position"<<endl;
	}
	return OK;
}

//string ss[MAXSIZE];

Status CreateList(LinkList &L){//在这里读文件string输入,e改为文件输入的string (思路) 
	
	int num = 0;
	int i,len = 0;
	DataType e;
	
	cout<<"scanf len again"<<endl;
	cin>>len;
/*
	fstream readFile;
	char input[MAXSIZE];
	readFile.open("text1.txt",ios::in);
	if(readFile.fail()){
		cout<<"open fail"<<endl;
		exit(0);
	}
	while(!readFile.eof()){
			readFile.getline(input,MAXSIZE+1,'\n');
		
			if(readFile.fail()){
					break;
			}
			ss[num] = input;
			cout<<ss[num]<<endl;
//			e = ss[num];
			num++;
	}
	*/ 
//	for(i = 1; i < len+1; i++){	
//		cout<<"scanf string e to insert"<<endl;
//		cin>>e;
//		InsertElem(L,i,e);
//	}
//	cout<<ss[0]<<endl;
//	readFile.close();
	return OK;
}

int after = 0;
//void CheckNode1(LinkList &L);

void CheckNode(LinkList &L,string str,int ord){
	
	L->data = str;
	L->order_node = ord;

	int sum = 0;
    for(int i = 0; i < L->data.length(); i++) {
        sum += L->data[i];
    }
	
	L->check_node = ( L->order_node + sum + after)%113;
	
	after = L->check_node;
	cout<<L->order_node<<" "<<L->check_node<<endl;
//	L = L->next;
//	L->order_node++;
//	CheckNode(L,str);
//	return 0;
}

int main()
{
	LinkList L;
	InitList(L);
	
	string s;
	int num = 0;
	int length;
	
//	cout<<"scanf len 3 for test"<<endl;
	cout<<"scanf the file's len"<<endl;
	cin>>length;
	
	CreateList(L);	
	fstream readFile;
	char input[MAXSIZE];
	readFile.open("text1.txt",ios::in);
	
	if(readFile.fail()){
		cout<<"open fail"<<endl;
		exit(0);
	}
		
	while(!readFile.eof()){
		readFile.getline(input,MAXSIZE+1,'\n');
		
		s = input;
		cout<<s<<endl;
		InsertElem(L,num+1,s);
		num++;
		if(readFile.fail()){
			break;
		}
	}	
//	CreateList(L);
/*
	L = L->next;
	cout<<L->data<<endl;
	cout<<L->order_node<<endl;
	CheckNode(L,L->data);
	L = L->next;
	L->order_node +=1;
	CheckNode(L,L->data);
	L = L->next;
	L->order_node +=1;
	CheckNode(L,L->data);
*/

	for(int i = 0; i < length; i++){
		L = L->next;
		L->order_node == i;
		CheckNode(L,L->data,i);
	}

//	cout<<L.check_node<<endl;
//	FILE *file = fopen(fileName,"rt");
//	for(int i = 0;i <MAXSIZE;i++){
//		char tmp = file.get();
	//	if(tmp == '\n'||tmp == ' '||EOF==true)
	//		return;
	//	L->data[i] = tmp;
//		cout<<tmp<<" ";
		 
//	}
	readFile.close();
	return 0;
}


/*
void CheckNode1(LinkList &L){
	int first = 0;
	
	L->order_node = first;
	std::ifstream file(fileName);
	
	char buff[1024];
/*	while(file.getline(buff,1024)){
		for(int i = 0; i <1024; i++){
			char tmp = buff[i];
			if(tmp == '\0'){
				break;
			}
			L->data[i] = tmp;
		}
	}

	file.open(fileName,ios::in);
	for(int i = 0;i <MAXSIZE;i++){
		char tmp = file.get();
		if(tmp == '\n'||tmp == ' '||EOF==true)
			return;
		L->data[i] = tmp;
		 
	}
	int sum1 = 0;
	for(int k = 0;k < L->data.length();k++){
		sum1 += L->data[k];
	}
	L->check_node = (0 + L->order_node + sum1 + after)%113;
	after = L->check_node;
	L = L->next;
	CheckNode1(L);
//	return L->chack_node;
}*/



有关1、区块链(必做)(链表)的更多相关文章

  1. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  2. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

  3. iNFTnews | 周杰伦18年前未发布的作品Demo,藏在了区块链技术里 - 2

    当音乐碰上区块链技术,会擦出怎样的火花?或许周杰伦已经给了我们答案。8月29日下午,B站独家首发周杰伦限定珍藏Demo独家访谈VCR,周杰伦在VCR里分享了《晴天》《青花瓷》《搁浅》《爱在西元前》四首经典歌曲Demo背后的创作故事,并首次公布18年前未发布的神秘作品《纽约地铁》的Demo。在VCR中,方文山和杰威尔音乐提及到“多亏了区块链技术,现在我们可以将这些Demos,变成独一无二具有收藏价值的艺术品,这些Demos可以在薄盒(国内数藏平台)上听到。”如何将音乐与区块链技术相结合,薄盒方面称:“薄盒作为区块链技术服务方,打破传统对于区块链技术只能作为数字收藏的理解。聚焦于区块链技术赋能,在

  4. 【数据结构和算法】实现带头双向循环链表(最复杂的链表) - 2

    前文,我们实现了认识了链表这一结构,并实现了无头单向非循环链表,接下来我们实现另一种常用的链表结构,带头双向循环链表。如有仍不了解单向链表的,请看这一篇文章(7条消息)【数据结构和算法】认识线性表中的链表,并实现单向链表_小王学代码的博客-CSDN博客目录前言一、带头双向循环链表是什么?二、实现带头双向循环链表1.结构体和要实现函数2.初始化和打印链表3.头插和尾插4.头删和尾删5.查找和返回结点个数6.在pos位置之前插入结点7.删除指定pos结点8.摧毁链表三、完整代码1.DSLinkList.h2.DSLinkList.c3.test.c总结前言带头双向循环链表,是链表中最为复杂的一种结

  5. 腾讯云区块链服务平台(TBaaS)长安链体验网络公测试用感受 - 2

    前阵InfoQ社区看到腾讯云腾讯云区块链服务平台(TBaaS)长安链体验活动,一顿操作猛如虎报了个名,体验完用一个字概括:强。非要再加几个字的话,总体感受下来装配模式灵活高效,配套工具完整辩解。话不多说开始主题本文目录结构分为区块链分类和TBaaS平台介绍、TBaaS平台上链教程三个部分一、区块链分类:大体上来说,区块链可分为公链,联盟链,私有链三种:公有链(PublicBlockchain)公有链是指任何人都能参与的区块链。公有链是去中心化程度最高的区块链,不受机构控制,整个账本对所有人公开透明。任何人都能在公有链上查询交易、发送交易、参与记账。加入公有链不需要任何人授权,可以自由加入或者离

  6. (Fabric 学习七)Fabric2.4.x 区块链多机部署(重新整一遍) - 2

    时隔很久没有学习区块链了,今天重新搭建一下区块链网络,有了更多新的体会。我是跟着b站up主DevX_一步一步往下搭建的。这是大神的视频,简洁易懂而且很符合我目前的技术栈(java应用端+java链码),而且代码开源,非常适合新手学习!!DevX亡命天涯的个人空间-DevX亡命天涯个人主页-哔哩哔哩视频经过测试已成功。为了今后学习便利,记录一遍搭建过程。一、区块链搭建网络拓扑结构:本次环境搭建要求:3个Orderer节点以满足raft共识;2个组织:org1、org2;两个组织内都有两个peer节点。但是我懒得开多台虚拟机,索性利用一台虚拟机整多个端口来搞了,划分清楚端口就好。资源规划如下:节点

  7. ruby - Ruby 有像栈、队列、链表、映射或集合这样的容器吗? - 2

    我在网上查了几个Ruby教程,他们似乎什么都用数组。那么如何在Ruby中实现以下数据结构呢?堆栈队列链表map组 最佳答案 (从评论中移出)好吧,通过限制堆栈或队列方法(push、pop、shift、unshift),数组可以是堆栈或队列。使用push/pop提供LIFO(后进先出)行为(堆栈),而使用push/shift或unshift/pop提供FIFO行为(队列)。map是hashes,和一个Set类已经存在。您可以使用类实现链表,但数组将使用标准数组方法提供类似于链表的行为。 关

  8. 大数据、人工智能、区块链对数字化转型的支撑作用 - 2

    降维打击。躺平=等死。外卖颠覆餐饮。数字化是基础。对业务流程进行高层次升级,而非简单替代。过去:智慧城市(信息化),现在:数字孪生(数字化),未来:元宇宙(虚拟化)数字化思维:掌握更强手段,进入高纬度。数字化转型=数字底座+数据资产(有价值的数据:无形、可复制、增长、不确定性)。数据资产利用:数据治理示例:数据资产的法律保障:数字底座(底层核心技术和新型基础设施)到数字中台到城市和行业数字化转型。大数据:数据采集:大数据处理:大数据分析技术及其分类:人工智能:用于模拟、延伸和扩展人类所具有的的智能的理论、方法、技术及应用系统。人工智能研究内容:机器学习:机器学习技术原理:神经网络:人工智能典型

  9. javascript - JS将数组转换为json链表? - 2

    我是JS的新手,组织数据的概念让我有些困惑,我试图从特定的数组格式中获取数据(因为这是我必须使用的格式)并将其输出为另一种特定的JSON格式。这是给D3sankey模块传递数据https://github.com/d3/d3-plugins/blob/master/sankey/sankey.js我不知道如何将节点的索引添加到链接中,而不是名称。真的,我完全迷失了它!我在这里做了一个fiddle:https://jsfiddle.net/adamdavi3s/kw3jtzx4/下面是所需数据和输出的示例vardata=[{"source":"Agricultural'waste'","

  10. 合并两个有序链表 - 2

    文章目录1.题目描述2.解题思路方法1:方法2:1.题目描述题目链接:力扣21,合并两个有序链表将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。2.解题思路方法1:首先我们能够想到的就是遍历一遍数组,判断两个结点的大小,将数值小的结点放在前面,数值大的不断尾插在后面。是不是听着挺简单的?具体实现:我们可以创建两个空指针,head用来存放链表的头结点,tail用来遍历两条链表,将两条链表链接起来。当某个链表为空时,我们可以直接返回另一条链表当两个链表都不为空时,我们可以不断比较两条链表的大小,当head和tail为空时,我们将较小的结点同时赋给head

随机推荐