• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > C程序:复杂数据结构的快照问题

C程序:复杂数据结构的快照问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了c程序数据类型,24c02读写数据c程序,解析ip数据包的c程序,c程序结构,c程序结构体等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:C程序:复杂数据结构的快照问题
描述:

问题描述:由于想保存数据结构在任意时刻的快照(由用户来触发),需要对当前的数据状态进行深度复制,但是,该结构较为复杂,还没有找到有效的方法来实现。

数据结构代码:

struct value {
value* prev;
value* next;
int value;
};
struct entry {
entry* prev;
entry* next;
value* values;
char key[MAX_KEY_LENGTH];
};
struct snapshot {
snapshot* prev;
snapshot* next;
entry* entries;
int id;
};

如下图描述的那样,1、2、3分别是三个时刻的快照,其保存的是三个时刻的current database state;current database state是当前用户编辑数据的环境。现在的问题就是,如何将current database state复制一份并保存。同时,快照1、2、3还可以被rollback到current database state。
数据结构c语言程序,数据结构与程序设计,数据结构单链表程序,数据结构程序,数据结构二叉树程序,数据结构顺序表程序,数据结构线性表程序,数据结构程序设计题,算法 数据结构 程序,数据结构程序题,数据结构串的程序,数据结构栈程序,数据结构链表程序,数据结构及程序设计,数据结构小程


解决方案1:

我目前的方法是,使用malloc在内存中逐一为current state分配空间,然后按照其原有连接一一复原。代码如下:

            entry* currentEntry = entry_head; // 当前状态
            entry* lastEntry = NULL;
            value* cpValue = NULL;
            value* lastValue = NULL;
            snapshot* newSnapshot = NULL; // 新建的快照
            newSnapshot = (snapshot*)malloc(sizeof(snapshot));
            snapIndex++;
            newSnapshot -> id = snapIndex; // 设置快照ID
            newSnapshot -> prev = NULL;
            newSnapshot -> next = NULL;
            // 开始复制当前状态
            if(currentEntry == NULL){
                newSnapshot -> entries = NULL;
                printf("no entries\n");
            }else{
                    // 由于前一个元素无法确定后一个元素的位置(还未创建),因此,只设置prev指针
                    while(currentEntry != NULL){
                    newEntry = (entry*)malloc(sizeof(entry));
                    newEntry -> next = NULL;
                    strcpy(newEntry -> key, currentEntry -> key);
                    newEntry -> prev = lastEntry;
                    valuePt = currentEntry -> values;
                    while(valuePt != NULL){
                        cpValue = (value*)malloc(sizeof(value));
                        cpValue -> next = NULL;
                        cpValue -> value = valuePt -> value;
                        cpValue -> prev = lastValue;
                        valuePt = valuePt -> next;
                        lastValue = cpValue;
                    }
                    // 反向设置next指针
                    while(lastValue != NULL){
                        if(lastValue -> prev != NULL){
                            lastValue -> prev -> next = lastValue;
                            lastValue = lastValue -> prev;
                        }else{
                            // first value
                            newEntry -> values = lastValue;
                            break;
                        }
                    }

                    currentEntry = currentEntry -> next;
                    lastEntry = newEntry;
                    lastValue = NULL;
                }
                // 反向设置next指针
                while(lastEntry != NULL){

                    if(lastEntry -> prev != NULL){
                        lastEntry -> prev -> next = lastEntry;
                        lastEntry = lastEntry -> prev;
                    }else{
                        newSnapshot -> entries = lastEntry; // 设置新快照的entries指针,此时lastEntry指向第一个value
                        break;
                    }
                }
            }

            // 将新snapshot加入链表中
            if(snapshot_head == NULL){
                snapshot_head = newSnapshot;
            }else{
                newSnapshot -> next = snapshot_head;
                snapshot_head -> prev = newSnapshot;
                snapshot_head = newSnapshot;
            }
            printf("save as snapshot %d\n", snapIndex);

        }

解决方案2:

将数据以二进制的形式保存到日志文件中,需要的时候再从这个日志文件中读取出来,一般思路应该都是这个样子的。

解决方案3:

一个方案是把数据存成c++里的vector, 然后serialize, 比如用boost::serialization.


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C程序:复杂数据结构的快照问题

相关文章

  • 2017-06-07 今日要讨论的议题为:阿里云OS
  • 2017-06-07 如何用python访问网页并在表单处输入内容?
  • 2017-06-07 python源码混淆一般用什么比较好?百度的在线混淆好像不支持Python2,源码是python2的
  • 2017-06-07 pythonftp多线程下载异常
  • 2017-06-07 为什么vs2013没有scrapy?
  • 2017-06-07 我为网站添加了一个A记录指向我的服务器IP,ping成功。但是浏览器通过域名访问不了,但可以通过IP访问。
  • 2017-06-07 jbpmPooledActors问题
  • 2017-06-07 采用redis共享SESSION的时候,那么回话数据的key,是不是还是要基于COOKIE?
  • 2017-06-07 已知一个scalareflectruntimeuniverseType,如何把一个类型为Any的值转换为这个Type
  • 2017-06-07 客服电话不方便接听,工单无人回复,谁能帮下我关于缩略图

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 刚学开发,想做一个很简单的投票的网站,应该怎么开始呢?有一点Python,FLask非常基础的知识!
    • java多线程与python多线程同时进行io密集型操作
    • 如何设置只镜像存储图像文件,而不镜像存储html文件文件
    • 七牛iOSSDK是否处理502错误时代码不严谨?
    • 七牛云存储pythonSDK上传策略中设置callbackBody中的自定以变量,能不通过表单上传么?
    • Golang中mc有类似redis和mysql的连接池的处理吗?
    • 毕福剑处理结果urljoin处理正则匹配结果时的错误
    • 请问哪里有flash的七牛上传客户端的demo?
    • shell脚本(shell)脚本程序问题
    • 用Python写了个程序调用word,运行完后再手动打开word文档就变慢了,这是为啥?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有