以前一个人给的,现在失联了,感觉不是很懂他的代码,第一次发这个,感觉不会用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;}