1、区块链(必做)(链表)
1、区块链(必做)(链表)
[问题描述]
使用链表设计一个保存信息的系统,该系统拥有类似区块链的设计以防止信息被轻易篡改。
该题目使用一个链表。信息保存在链表的每一个节点中,每个节点需要包含该节点的编号、信息和校验码。其中:
+ 每个节点的编号按照顺序递增,从0开始。
+ 节点中包含的信息是字符串,且每个字符的ASCII码范围为0-127,以结束。
+ 每个节点的校验码等于上一个节点的校验码+本节点的节点编号+本节点信息中字符串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 == ''){
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;
}*/
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码