数据结构课程设计1: 区块链

这篇具有很好参考价值的文章主要介绍了数据结构课程设计1: 区块链。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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: 区块链

区块链测试用例

数据结构课程设计1: 区块链

 区块链测试结果1

数据结构课程设计1: 区块链

区块链测试结果2

数据结构课程设计1: 区块链

区块链测试结果3文章来源地址https://www.toymoban.com/news/detail-415004.html

到了这里,关于数据结构课程设计1: 区块链的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构课程设计 ——考试报名系统

    数据结构课程设计 ——考试报名系统 一、项目功能要求 完成对考生信息的建立,查找,插入,修改,删除等功能。其中考生信息包括准考证号,姓名,性别,年龄和报考类别等信息。项目在设计时应首先确定系统的数据结构,定义类的成员变量和成员函数;然后实现各成员

    2024年02月04日
    浏览(36)
  • 数据结构课程设计 仓储管理系统

    【基本功能】 把货品信息表抽象成一个线性表,货品信息(包括ID、货品名、定价、数量等)作为线性表的一个元素,实现:按ID、货品名分别查找某货品信息(包括ID、货品名、定价、数量等);收录货品(如果货品在帐中已有,则只将总库存量增加。否则插入新增信息);

    2024年01月23日
    浏览(43)
  • 【数据结构课程设计】简单搜索引擎系统

    该程序使用python语言实现利用爬虫代码爬取网站链接信息,将网站中文词语通过结巴分词进行分割,并存储爬取的数据信息,利用结巴分词库处理输入框用户输入的词语,进行搜索,通过链接评价函数,优先显示评分较高的链接;设计简单的html页面,实现可视化搜索功能。

    2024年01月23日
    浏览(43)
  • 数据结构课程设计——项目2:校园导游咨询

    【问题描述】 设计一个校园导游程序,为来访的客人提供各种信息查询服务。 【基本要求】 设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校 内各景点,存放景点名称、代号、简介 等信息;以边表示路径,存放路径长度等相关信息。 为来访客人提供图中任

    2024年02月02日
    浏览(53)
  • 数据结构课程设计:学生成绩管理系统

    目  录 第一章   需求分析 第二章 概要设计 第三章 详细设计 第四章 测试报告 第五章 安装及使用 第六章 项目总结 第七章 源码 一.需求分析        学生成绩管理是一个学校不可缺少的部分,它的内容对于学校的管理者和学生以及学生家长来说都至关重要,所以一个良好

    2024年02月02日
    浏览(53)
  • 数据结构课程设计——哈夫曼编/译码系统设计与实现(C++)

    对于生产实际的问题,本设计可以作为一个无损数据压缩工具,在需要传输海量数据时,利用哈夫曼编码可以将数据进行压缩,从而减小传输的数据量,提高数据传输效率。同时,哈夫曼编码也可以应用于数据加密和解密等领域。 本设计的主要目的是学习哈夫曼编码算法,并

    2024年02月04日
    浏览(31)
  • 【用C语言描述数据结构】课程设计:歌手比赛系统

    ✅作者简介:一名在读大二学生,希望大家多多支持👍👍👍 🔥系列专栏:数据结构 💬个人主页:梦园的CSDN博客 文末附有全部代码哦 💖💖 文末附有全部代码哦~ 设计一个简单的歌手比赛绩管理程序,对一次歌手比赛的成绩进行管理,使用 链表 实现,基本的设计要求如

    2024年02月03日
    浏览(34)
  • 数据结构课程设计-宿舍管理查询软件-(C/C++)

    目录 1. 系统需求分析      1.1 设计理由与意义      1.2 功能需求分析      1.3 数据需求分析 2. 系统设计       2.1 数据结构类型设计       2.2 整体功能结构设计      2.3 子模块详细设计       2.4 程序流程图设计 3.系统实现       3.1 系统源代码 4.运行效果截图(部分)

    2024年02月05日
    浏览(31)
  • 数据结构与算法课程设计---最小生成树的应用

    1.问题 假定有这么一个问题,有11个城市,城市之间有一些天然气管道,铺设天然气管道需要花费不同的金额,现在要你选择其中一些天然气管道,使得所有城市可以互相联通且花费最小。 2.分析 我们把这个问题抽象为一张图,每个城市是一个顶点,城市与城市之间的管道是

    2024年02月08日
    浏览(37)
  • 《数据结构》课程设计(C/C++版):植物百科数据的管理与分析

    目录 第1关:增加植物信息 第2关:删除植物信息 第3关:修改植物信息 第4关:基于顺序表的顺序查找 第5关:基于链表的顺序查找 第6关:基于顺序表的折半查找 第7关:基于二叉排序树的查找 第8关:基于开放地址法的散列查找 第9关:基于链地址法的散列查找 第10关:基于

    2024年04月09日
    浏览(170)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包