详细见:http://expert.csdn.net/Expert/topic/2979/2979870.xml?temp=.4648096

解决方案 »

  1.   

    http://www.csdn.net/develop/Read_Article.asp?Id=22857
      

  2.   

    建议你把链表A、B、C以及链表中的元素都抽象出类,类中添加Serialize,任务扎看起来很复杂,但是你一点一点地分解任务,就好办了
      

  3.   

    typedef struct conductor_net
    {
    char *name;
    int net_id;
    int visible;
    int select;
    net_data_t * ndata;
    pad_hole_data_t *phdata;
    struct conductor_net * next;

    }conductor_net_t;typedef struct pad_hole_data
    {
    int op_code;
    double x;
    double y;
    double cx;
    double cy;
    double dia;
    int ism;
    int isp;
    int ids;
    int layer_id;
    struct pad_hole_data *next; }pad_hole_data_t;typedef struct net_data
    {
    double startx;
    double endx;
    double starty;
    double endy;
    double cx;
    double cy;
    int layerid;
    struct net_data *next;}net_data_t;上面是相关的基本结构!!
    全部是c的
    现在的问题是给定一个conductor_net的头节点 *cnhead 然后将链表中的内容全部保存到文件中,包括节点中的子链表读文档时,能快速和相对比较简单的生成和原链表结构一致的链表
    谢谢!
      

  4.   


    class T_BaseClassInfor : public CObject
    {
    public:                   T_BaseClassInfor();
    virtual void      Serialize(CArchive& ar);
    void              GZLI_SetName(CString& name);
    CString           GZLI_GetName();
    void              GZLI_SetAuthority(CString& Authority);
    CString           GZLI_GetAuthority();private: CString S_Name;
    CString     S_Authority;protected:   DECLARE_SERIAL(T_BaseClassInfor)};
    class T_FuncParameterInfor : public CObject
    {public:
                     T_FuncParameterInfor();
    virtual  void    Serialize(CArchive& ar);
    void          GZLI_SetParaName(CString& paraname);
    CString          GZLI_GetParaName();
    void             GZLI_SetParaType(CString& Paratype);
    CString          GZLI_GetParatype();private:
    CString S_ParaName;
    CString     S_ParaType;protected: DECLARE_SERIAL(T_FuncParameterInfor)};class T_MemDataInfor : public CObject
    {
    public:                  T_MemDataInfor();
         virtual  void   Serialize(CArchive& ar);
     void            GZLI_SetDataName(CString& DataName);
     CString         GZLI_GetDataName();
     void            GZLI_SetDataType(CString& DataType);
     CString         GZLI_GetDataType();
     void            GZLI_SetVisitRight(CString& VisitRight);
     CString         GZLI_GetVisitRight();private:
    CString     S_MemDataName;
    CString     S_MemDataType;
    CString     S_VisitRight;protected: DECLARE_SERIAL(T_MemDataInfor)};class T_FuncInfor : public CObject
    {
    public:
                     T_FuncInfor();
        virtual  void    Serialize(CArchive& ar);
    void             GZLI_SetFuncName(CString& name);
    CString          GZLI_GetFuncName();
    void             GZLI_SetReturnType(CString& type);
    CString          GZLI_GetReturnType();
        void             GZLI_SetVisitRight(CString& visitright);
    CString          GZLI_GetVisitRight();
    void             GZLI_SetVirtual(BOOL Virtual);
    BOOL             GZLI_GetVirtual();
    public:
       
        void NewFuncParameter();
     
    private: CString    S_FuncName;
    CString    S_ReturnType;
    CString    S_VisitRight;
    BOOL       B_Virtual;
    public:     CTypedPtrList<CObList,T_FuncParameterInfor*> L_ParamaterList;
       
     // CString    S_FuncCode;protected:
    DECLARE_SERIAL(T_FuncInfor)
    public:};class T_ClassInfor : public CObject
    {
    public:
        virtual  void    Serialize(CArchive& ar);
                         T_ClassInfor(); 
    public:    CTypedPtrList<CObList,T_BaseClassInfor*>  BaseClassList;
        CTypedPtrList<CObList,T_FuncInfor*>       MemFuncList;
        CTypedPtrList<CObList,T_MemDataInfor*>    MemDataList;
    public:
    void newbaseclass();
    void newmemfunc();
    void newmemdata();protected: DECLARE_SERIAL(T_ClassInfor)public:};  
    IMPLEMENT_SERIAL(T_BaseClassInfor,CObject,1)
    T_BaseClassInfor::T_BaseClassInfor()
    {
    //for dynamic creation
    }void     T_BaseClassInfor::GZLI_SetName(CString& name)
    {
    S_Name = name;}CString  T_BaseClassInfor::GZLI_GetName()
    {
    return S_Name;
    }void     T_BaseClassInfor::GZLI_SetAuthority(CString& Authority)
    {
    S_Authority = Authority;}CString  T_BaseClassInfor::GZLI_GetAuthority()
    {
    return S_Authority;
    }void T_BaseClassInfor::Serialize(CArchive& ar)
    {
    if(ar.IsStoring())
    {
    ar << S_Name << S_Authority;
    }
    else
    {
    ar >> S_Name >> S_Authority;
    }}
    IMPLEMENT_SERIAL(T_FuncParameterInfor,CObject,1)T_FuncParameterInfor::T_FuncParameterInfor()
    {
    //for dynamic create
    }void T_FuncParameterInfor::GZLI_SetParaName(CString& paraname)
    {
    S_ParaName = paraname;}CString T_FuncParameterInfor::GZLI_GetParaName()
    {
    return S_ParaName;
    }void   T_FuncParameterInfor::GZLI_SetParaType(CString& paratype)
    {
    S_ParaType = paratype;}CString  T_FuncParameterInfor::GZLI_GetParatype()
    {
    return S_ParaType;
    }
    void  T_FuncParameterInfor::Serialize(CArchive& ar)
    {
    if(ar.IsStoring())
    {
    ar << S_ParaName << S_ParaType;
    }
    else
    {
    ar >> S_ParaName >> S_ParaType;
    }}IMPLEMENT_SERIAL(T_MemDataInfor,CObject,1)T_MemDataInfor::T_MemDataInfor()
    {
    // for dynamic creation
    }void T_MemDataInfor::GZLI_SetDataName(CString& DataName)
    {
    S_MemDataName = DataName;}CString T_MemDataInfor::GZLI_GetDataName()
    {
    return S_MemDataName;
    }void   T_MemDataInfor::GZLI_SetDataType(CString& DataType)
    {
    S_MemDataType = DataType;}CString T_MemDataInfor::GZLI_GetDataType()
    {
    return S_MemDataType;
    }void   T_MemDataInfor::GZLI_SetVisitRight(CString& VisitRight)
    {
    S_VisitRight = VisitRight;}CString T_MemDataInfor::GZLI_GetVisitRight()
    {
    return S_VisitRight;
    }void T_MemDataInfor::Serialize(CArchive& ar)
    {
    if(ar.IsStoring())
    {
    ar << S_MemDataName << S_MemDataType << S_VisitRight;
    }
    else
    {
    ar >> S_MemDataName >> S_MemDataType >> S_VisitRight;
    }}IMPLEMENT_SERIAL(T_FuncInfor,CObject,1)T_FuncInfor::T_FuncInfor()
    {
    //for dynamic creation
    }void     T_FuncInfor::GZLI_SetFuncName(CString& name)
    {
    S_FuncName = name;}CString  T_FuncInfor::GZLI_GetFuncName()
    {
    return S_FuncName;
    }void     T_FuncInfor::GZLI_SetReturnType(CString& type)
    {
           S_ReturnType = type; 
       
    }CString  T_FuncInfor::GZLI_GetReturnType()
    {
    return S_ReturnType;
    }void     T_FuncInfor::GZLI_SetVisitRight(CString& visitright)
    {
    S_VisitRight = visitright;
    }CString  T_FuncInfor::GZLI_GetVisitRight()
    {
    return S_VisitRight;
    }void T_FuncInfor::GZLI_SetVirtual(BOOL Virtual)
    {
    B_Virtual = Virtual;
    }BOOL T_FuncInfor::GZLI_GetVirtual()
    {
    return B_Virtual;
    }
    void T_FuncInfor::Serialize(CArchive& ar)
    {
    if( ar.IsStoring() )
    {
    ar << S_FuncName << S_ReturnType << S_VisitRight << B_Virtual;
    L_ParamaterList.Serialize(ar); }
    else
    {
    ar >> S_FuncName >> S_ReturnType >> S_VisitRight >> B_Virtual;
            L_ParamaterList.Serialize(ar);
    }}IMPLEMENT_SERIAL(T_ClassInfor,CObject,1)T_ClassInfor::T_ClassInfor()
    {
    // for dynamic creation
    }void T_ClassInfor::Serialize(CArchive& ar)
    {
    if(ar.IsStoring())
    {
           BaseClassList.Serialize(ar);
       MemFuncList.Serialize(ar);
       MemDataList.Serialize(ar);
    }
    else

       BaseClassList.Serialize(ar);
       MemFuncList.Serialize(ar);
       MemDataList.Serialize(ar); }

    }
    void T_FuncInfor :: NewFuncParameter()
    {
     T_FuncParameterInfor* newpara = new  T_FuncParameterInfor;
         CString m_string("paraname");
       
     newpara->GZLI_SetParaName(m_string);
     newpara->GZLI_SetParaType(m_string);
     L_ParamaterList.AddTail(newpara);} 
    void T_ClassInfor::newbaseclass()
    {
    T_BaseClassInfor* newbase = new T_BaseClassInfor;
    CString m_string("public"); newbase->GZLI_SetAuthority(m_string);
    newbase->GZLI_SetName(m_string); BaseClassList.AddTail(newbase);}void T_ClassInfor::newmemfunc()
    {
    T_FuncInfor* newfunc = new  T_FuncInfor;
    newfunc->NewFuncParameter();

    CString m_string("index");
    newfunc->GZLI_SetFuncName(m_string);
    newfunc->GZLI_SetReturnType(m_string);
    newfunc->GZLI_SetVisitRight(m_string);
    newfunc->GZLI_SetVirtual(FALSE);

    MemFuncList.AddTail(newfunc);}
    void  T_ClassInfor :: newmemdata()
    {
    T_MemDataInfor*  newdata = new T_MemDataInfor;
        CString m_string("dataname");

    newdata->GZLI_SetDataName(m_string);
    newdata->GZLI_SetDataType(m_string);
    newdata->GZLI_SetVisitRight(m_string); MemDataList.AddTail(newdata);}
    这是我写一个类库管理系统使用的类的一部分  你只要修改一下就好了
      

  5.   

    其他涉及的相关函数
    conductor_net_t * new_conductor_net(void)
    {
    conductor_net_t *tmp = NULL;
    tmp = (conductor_net_t*)malloc(sizeof( conductor_net_t));
    if( tmp == NULL )
    return NULL;
    memset(tmp,0,sizeof(conductor_net_t));
    tmp->net_id = -1;
    tmp->visible = 1;

    tmp->ndata = new_net_data();
    if( tmp->ndata == NULL )
    {
    free(tmp);
    } tmp->phdata = new_pad_hole_data();
    if( tmp->phdata == NULL)
    {
    free_net_data(tmp->ndata);
    free(tmp);
    } return tmp;
    }net_data_t * new_net_data(void)
    {
    net_data_t *tmp = NULL;
    tmp = (net_data_t*)malloc(sizeof( net_data_t));
    if( tmp == NULL )
    return NULL;
    memset(tmp,0,sizeof(net_data_t));
    tmp->layerid = -1;
    return tmp;
    }pad_hole_data_t *new_pad_hole_data(void)
    {
    pad_hole_data_t *tmp = NULL;
    tmp = (pad_hole_data_t*)malloc(sizeof( pad_hole_data_t));
    if( tmp == NULL )
    return NULL;
    memset(tmp,0,sizeof(pad_hole_data_t));
    tmp->ids = -1;
    tmp->layer_id = -1;
    return tmp;}void free_net_data( net_data_t * ndata)
    {
    if( ndata == NULL)
    return;
    net_data_t *tmp = ndata;
    while( ndata != NULL)
    {
    tmp = ndata->next;
    free(ndata);
    ndata = tmp;
    }
    }void free_pad_hole_data(pad_hole_data_t *phdata)
    {
    if( phdata == NULL)
    return;
    pad_hole_data_t *tmp = phdata;
    while( phdata != NULL)
    {
    tmp = phdata->next;
    free(phdata);
    phdata = tmp;
    }}
    void free_conductor_net(conductor_net_t * net)
    {
    if( net == NULL )
    return;
    conductor_net_t *tmp = net; while( net != NULL)
    {
    tmp = net->next;
    if( net->name != NULL)
    free(net->name);
    if( net->ndata != NULL)
    free_net_data(net->ndata);
    if( net->phdata != NULL)
    free_pad_hole_data(net->phdata);
    free(net);
    net = tmp;
    }
    }