1.任务:

[问题描述]

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

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

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

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

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

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

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

[基本要求]

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

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

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

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

2.采用的数据结构:

采用单链表

3.算法设计思想:

使用rand函数随机在文档中生成区块链内容,随后从文件中读入内容。对于区块链的校验码进行计算和校对。当链表中元素的发生添加与修改的操作时,同时对于各结点的校验码进行改动。空间复杂度:S(n)=O(n),时间复杂度T(n)=O(n^2)。

4.源程序:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include <sstream>
#include <ctime>
using namespace std;typedef struct LNode
{int code;string data;int DataAscii;int check;LNode *next;
}*LinkList,LNode;int num=0;
int Create()
{srand((unsigned)time(NULL));                      //随机生成区块链内容 ofstream out;out.open("demo1.txt", ios::out);if (!out.is_open()) {printf("Init Error\n");return 0;}string H;int len = rand() % 30 + 1;for (int j = 0; j < len; ++j) {H += rand() % 92+33;}H += '\0';out << H; for (int i = 1; i < 1000; ++i) {string str;int len = rand() % 30 + 1;for (int j = 0; j < len; ++j) {str += rand() % 92+33;}str += '\0';out << endl<< str ;}out.close();                                      //在文档中生成完毕
}int input(LinkList &L)
{ifstream infile;char ch;infile.open("demo1.txt",ios::in);LNode *p=L;int asc=0;if(infile){while(!infile.eof()){LNode *newNode=new LNode;p->next=newNode;p=p->next;p->next=NULL;p->code=num;num++;getline(infile,p->data);string k=p->data;int s=0;for(int i=0;k[i]!='\0';i++){s=s+int(k[i]);}p->DataAscii=s;asc=(asc+s+num-1)%113;                  //计算校验码 p->check=asc;}}else{printf("打开失败.\n");return 0;}infile.close();p=L->next;printf("链表的编号、信息的ASCII码和校验码依次为:\n");while(p){printf("%d %d %d\n",p->code,p->DataAscii,p->check);p=p->next;}printf("--------------------------------------------------\n");
}void AddData(LNode* p,string s)                    //增加数据
{LNode *t = p;while (t->next != NULL){t=t->next;}int a=t->check;LNode* q = new LNode;q->code = num;num++;q->data = s;int sum = 0;for (int i = 0; i < q->data.size(); ++i){sum += q->data[i];}q->DataAscii=sum;q->check = (sum + q->code + a) % 113;t->next = q;q->next = NULL;cout << "添加完成!\n";cout<<"新增的结点为:\n";cout<<q->code<<" "<<q->data<<" "<<q->DataAscii<<" "<<q->check<<endl;}void Correct(LinkList &L)                              //修改指定位置数据
{printf("请输入需要修改的位置:\n");int place;scanf("%d",&place); LNode *p;p=L;for(int i=0;i<place;i++){p=p->next;}cout << "请输入修改后的的信息:\n";string s2="";cin>>s2;p->next->data=s2;int s=0;for(int i=0;s2[i]!='\0';i++){s=s+int(s2[i]);}p->next->DataAscii=s;printf("是否需要修改校验码 是:1/否:0\n");int h;cin>>h;if(h==1){while(p->next){p->next->check=(p->next->DataAscii+p->check+p->next->code) % 113;p=p->next;}cout<<"校验码修改完成!\n";}
}int CheckCode(LinkList &L)                                 //核验校验码
{LNode *p;p=L->next;while(p->next){if(p->next->check==(p->next->DataAscii+p->check+p->next->code) % 113){p=p->next;continue;}else{cout<<"该链表存在错误!"<<endl;return 0;}}cout<<"该链表有效!"<<endl;
}void CorrectChoice(LinkList &L)                              //校正所有校验码
{LNode *p;p=L;p->next->check=(p->next->DataAscii+p->next->code) % 113;p=p->next;while(p->next){p->next->check=(p->next->DataAscii+p->check+p->next->code) % 113;p=p->next;}cout<<"校验码全部修改完成!\n";
}int main()
{LinkList L;L=new LNode;L->next=NULL;Create();input(L);while(1){system("pause");system("cls");cout << "请选择操作类型:\n1.向链表中添加信息.\n2.修改特定编号的结点内容"<<endl;cout<<"3.输出链表各个结点内容.\n4.检查链表是否有效.\n5.校正所有校验码.\n6.退出\n";int choice;scanf("%d",&choice);if(choice==1){ LNode *p;p=L;string data;cout << "请输入要添加的信息:\n";cin >> data;AddData(p, data);  } else if(choice==2){Correct(L);}else if(choice==3){LNode *p;p=L->next;printf("链表的编号、信息、信息的ASCII码和校验码依次为:\n");while(p){cout<<p->code<<" "<<p->data<<" "<<p->DataAscii<<" "<<p->check<<endl;p=p->next;}cout<<"输出完成!\n";}else if(choice==4){CheckCode(L);}else if(choice==5){CorrectChoice(L);}else if(choice==6){break;}}return 0;
}

5.源程序测试数据及结果

区块链测试用例

区块链测试结果1

区块链测试结果2

区块链测试结果3

数据结构课程设计1: 区块链相关推荐

  1. 数据结构课程设计之区块链工作原理模拟设计

    数据结构与算法课程设计课程之区块链客户端设计 本文章是基于C/C++进行模拟区块链主要工作原理的代码模拟设计,主要是对数据结构与算法的实践. 一. 设计要求 1. 基本算法设计 a) 创建交易单和区块 ...

  2. c语言数据结构五子棋实验报告,数据结构课程设计-五子棋

    数据结构课程设计-五子棋 姓 名: 学 院: 计算机与通信学院 班 级: 通信工程 101 班 指导老师: 目录一.需求分析 31.1 开发背景 .32.2 功能简介 .3二.系统设计 42.1 函数 ...

  3. 学生搭配问题数据结构报告c语言,数据结构课程设计_学生搭配问题.doc

    数据结构课程设计_学生搭配问题 数据结构课程设计 题 目: 学生搭配问题 学 院: 班 级: 学 生 姓 名: 学 生 学 号: 指 导 教 师: 2012 年 12 月 3 日 课程设计任务书 姓名 ...

  4. c语言一元多项式课程设计,一元多项式的计算数据结构课程设计.doc

    一元多项式的计算数据结构课程设计.doc 一元多项式的计算加,减摘要题目一元多项式计算任务能够按照指数降序排列建立并输出多项式:能够完成两个多项式的相加.相减,并将结果输入:目录1引言2需求分析3概要 ...

  5. c语言实现一元多项式程序报告设计,数据结构课程设计报告一元多项式的计算..doc...

    数据结构课程设计报告一元多项式的计算. 题目:一元多项式的计算 --链表 摘要(题目) 一元多项式计算 任务:能够按照指数降序排列建立并输出多项式: 能够完成两个多项式的相加.相减,并将结果输入: 目 ...

  6. 大学数据结构课程设计题目

    数据结构课程设计题目 1.         飞机订票系统(限1 人完成) 任务:通过此系统可以实现如下功能: 录入: 可以录入航班情况(数据可以存储在一个数据文件中,数据结构.具体数据自定) 查询: ...

  7. C++数据结构课程设计

    C++数据结构课程设计 <数据结构>课程设计指导书 一.课程设计的目的 课程设计为学生提供了一个独立实践的机会,将课本上的理论知识和实际问题结合起来,锻炼学生分析.解决实际问题的能力,提高 ...

  8. 数据结构课程设计 公交系统

    大家好! 这是我的第一篇文章,是将这学期的数据结构课设报告整理出来的.可能还有些小错误,还请多多指正. 数据结构课程设计<公交系统> 一.引言 (一)课题描述 (二)设计要求 二.总体设计 ...

  9. C/C++数据结构课程设计安排

    C/C++数据结构课程设计安排 数据结构课程设计安排 课程设计学时:32学时 课程设计目的:综合应用数据结构课程中所学的数据结构:线性表.栈.队列.数组.广义表.树.二叉树.图.查找表中的一种或多种数 ...

  10. 家族关系查询系统程序设计算法思路_数据结构课程设计(家族关系查询系统)..doc...

    数据结构课程设计(家族关系查询系统). 1 课程设计介绍 1.1课程设计项目简介 家谱是一种以表谱形式,记载一个以血缘关系为主体的家族世系繁衍和重要人物事迹的特殊图书载体.家谱是中国特有的文化遗产,是 ...

最新文章

  1. C#与java的比较
  2. Codeigniter 获取当前的控制器名称和方法名称
  3. SAP Cloud for Customer Sales Order Requested Date的业务含义和实现
  4. 高品质静物空间海报模板PSD分层素材
  5. python高阶_Python高阶学习
  6. 对话框:创建对话框模板和修改对话框属性
  7. cin.ignore()函数的用法
  8. Elastic Job 入门
  9. 学习退款数据分析思路
  10. 廖雪峰——练习 请把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']。
  11. windows10出现扬声器小红叉问题的解决方法
  12. 安卓中为了获取context的方法和区别(getContext,getActivity,this,mainActivity.this等)
  13. java中grid是什么意思,DataGrid是什么意思
  14. Linux 对整个系统备份和还原
  15. python 下载qq群文件_python作业/练习/实战:下载QQ群所有人的头像
  16. 讲一讲 MySQL 数据备份杀手锏 binlog
  17. 【干货】如何快速高效阅读Paper(硕士生版)
  18. 美国计算机科学排名2010,2010年美国大学计算机科学专业研究生排名
  19. RobotFramework功能自动化测试框架基础篇
  20. IP获取方法一:网页JS获取当前地理位置(省市区)

热门文章

  1. 有乐窝一周精选(二)
  2. 手机app测试用例怎么写?手机app测试点有哪些?
  3. [心得]分布式系统概念与设计知识整理
  4. 使用python实现微信小程序自动签到
  5. 使用JS完成一个简单的计算器功能
  6. Win10下Eclipse运行环境的安装及使用
  7. 视频搬运伪原创 视频修改MD5值
  8. MVPArms官方首发一键生成组件化,体验纯傻瓜式组件化开发
  9. 【加密工具】2019年网络安全加密工具排行,好用的计算机加密软件推荐
  10. JVM之类的加载与类加载器