别人的代码,看不懂
查看原帖
别人的代码,看不懂
459305
Wolftuteng楼主2021/4/29 20:36

以前一个人给的,现在失联了,感觉不是很懂他的代码,第一次发这个,感觉不会用makedown

#include

using namespace std;

typedef struct DataType

{

int number;

int Link[37],top;

int t1,t2;//递归自由度

}*pDataType;

typedef struct Node

{

pDataType data;

Node *next,*prev;

}*pNode;

typedef struct LinkList

{

pNode Head,Tail;

int Length;

}*pLinkList;

void haha_non_restion(const int k);//处理的地方

pLinkList LinkList_Creat();//创建链表返回指针

bool LinkList_Destroy(pLinkList *pLink);//销毁链表

pNode LinkList_Search_Point(const pLinkList Link,const int place);

pDataType LinkList_Search_DataType(const pLinkList Link,const int place);//返回第place个节点的数据

bool LinkList_Insert(pLinkList Link,const int place,const int number);//在第place个节点后插入新的节点

bool LinkList_Delete(pLinkList Link,const int place);//把第place个节点删除

pDataType Data_Pack(const int number);//将复杂数据打包为数据节点

bool Data_Delete(pDataType *pdata);//销毁数据节点

int min(const int x,const int y);

int main()

{

int n;

scanf("%d",&n);

haha_non_restion(n);

return 0;

}

void haha_non_restion(const int k)

{

pLinkList Link=LinkList_Creat();

LinkList_Insert(Link,Link->Length,k);

while((Link->Length)>0)

{

    pDataType Data=LinkList_Search_DataType(Link,Link->Length);

    int p=0;

    switch(Data->t1)

    {//递归入口

        case 0:

            while((Data->number)>0)

            {

                if((Data->number)&1)Data->Link[++(Data->top)]=p;

                (Data->number)>>=1;

                p++;

            }

            (Data->t1)++;

            break;

        case 1:

            while((Data->top)>0&&(Data->t1==1))

            {

                switch(Data->Link[(Data->top)])

                {

                    case 0:printf("2(0)");

                        break;

                    case 1:printf("2");

                        break;

                    default:

                        switch(Data->t2)

                        {

                            case 0:

                                printf("2(");

                                (Data->t2)++;

                                LinkList_Insert(Link,Link->Length,Data->Link[(Data->top)]);

                                Data=LinkList_Search_DataType(Link,Link->Length);

                                break;

                            case 1:

                                printf(")");

                                (Data->t2)=0;

                                break;

                            default:;   

                        }

                }

                if(Data->t1==1)

                {

                    (Data->top)--;

                    if((Data->top)>0)printf("+");

                }

            }

            if(Data->t1==1)(Data->t1)++;

            break;

        default://递归结束

            LinkList_Delete(Link,Link->Length);

    }

}

}

pLinkList LinkList_Creat()//创建链表返回指针

{

pLinkList Link=new LinkList();

Link->Head=new Node();

Link->Tail=new Node();

Link->Head->data=Data_Pack(0);

Link->Tail->data=Data_Pack(0);

Link->Head->next=Link->Tail;

Link->Head->prev=Link->Head;//初始化头尾节点

Link->Tail->prev=Link->Head;

Link->Tail->next=Link->Tail;

Link->Length=0;

return Link;

}

bool LinkList_Destroy(pLinkList *pLink)

{

while((*pLink)->Head!=(*pLink)->Tail)

{

    (*pLink)->Head=(*pLink)->Head->next;

    Data_Delete(&((*pLink)->Head->prev->data));

    delete (*pLink)->Head->prev;

}

delete (*pLink)->Head->data;

delete (*pLink)->Head;

delete (*pLink);

(*pLink)=NULL;

return true;

}

pNode LinkList_Search_Point(const pLinkList Link,const int place)

{

if(!Link)

{

    printf("LinkList_Search_Point:链表指针为空.\n");

    return NULL;

}

if(place<0||Link->Length<place)

{

    printf("LinkList_Search_Point:place范围错误.\n");

    return NULL;

}

pNode p;

const int min_place=min(place,Link->Length+1-place);

if(place==min_place)

{

    p=Link->Head;

    for(int i=1;i<=min_place;i++)//数place次

    p=p->next;

}

else

{

    p=Link->Tail;

    for(int i=1;i<=min_place;i++)//数place次

    p=p->prev;

}

return p;

}

pDataType LinkList_Search_DataType(const pLinkList Link,const int place)

{

if(!Link)

{

    printf("LinkList_Search_DataType:链表指针为空.\n");

    return NULL;

}

if(place<=0||Link->Length<place)

{

    printf("LinkList_Search_DataType:place范围错误.\n");

    return NULL;

}

pNode p=LinkList_Search_Point(Link,place);

if(!p)

{

    printf("LinkList_Search_DataType:链表节点指针为空.\n");

    return NULL;

}

return p->data;

}

bool LinkList_Insert(pLinkList Link,const int place,const int number)

{//头节点为零,插入到第place个节点后

if(!Link)

{

    printf("LinkList_Insert:链表指针为空.\n");

    return false;

}

if(place<0||Link->Length<place)

{

    printf("LinkList_Insert:place范围错误.\n");

    return false;

}

pNode An=LinkList_Search_Point(Link,place);

if(!An)//找到对应节点An

{

    printf("LinkList_Insert:链表节点指针为空.\n");

    return false;

}

pNode Bn=new Node();

if(!Bn)

{

    printf("LinkList_Insert:链表节点空间申请失败.\n");

    return false;

}

pNode Cn=An->next;

Bn->data=Data_Pack(number);//给Bn填写数据

An->next=Bn;//An Cn...

Bn->next=Cn;

Cn->prev=Bn;

Bn->prev=An;//An Bn Cn...

Link->Length++;

return true;

}

bool LinkList_Delete(pLinkList Link,const int place)//把第place个节点删除

{

if(!Link)

{

    printf("LinkList_Delete:链表指针为空.\n");

    return false;

}

if(place<=0||Link->Length<place)

{

    printf("LinkList_Delete:place范围错误.\n");

    return false;

}

pNode B=LinkList_Search_Point(Link,place);//找到对应节点B

if(!B)

{

    printf("LinkList_Delete:链表节点指针为空.\n");

    return false;

}

pNode A=B->prev;

pNode C=B->next;

A->next=C;

C->prev=A;

Data_Delete(&(B->data));

delete B;

Link->Length--;

return true;

}

pDataType Data_Pack(const int number)

{

pDataType data=new DataType();

if(!data)

{

    printf("Data_Pack:数据节点申请空间失败.\n");

    return NULL;

}

data->number=number;

return data;

}

bool Data_Delete(pDataType *pdata)//销毁数据节点

{

if(!pdata)

{

    printf("Data_Delete:双重指针为空.\n");

    return false;

}

if(!(*pdata))

{

    printf("Data_Delete:数据节点指针为空.\n");

    return false;

}

delete (*pdata);

(*pdata)=NULL;

return true;

}

int min(const int x,const int y)

{return x>y?y:x;}

2021/4/29 20:36
加载中...