/*********************************************************************
呵呵,代码来了,太长,只好把上面几个题的删了。
还有,其实每个链表以及相关的函数,最好有个专门的头文件和源文件,全都凑
在一起的做法很不好。
*********************************************************************/
#include
#include
#include
typedef struct INT_LIST
{
int i_numb;
INT_LIST* last;
INT_LIST* next;
}ILIST,*LIST_PTR;
LIST_PTR CreatList(int iMax);
LIST_PTR AddNumber(LIST_PTR listPtr,int iNumb);
void FreeList(LIST_PTR listPtr);
LIST_PTR GetTail(LIST_PTR listPtr);
void printList(LIST_PTR listPtr);
LIST_PTR CopeList(LIST_PTR newList,LIST_PTR oldList);
LIST_PTR CopeListBit(LIST_PTR newList,LIST_PTR oldList, int max);
LIST_PTR SetList(LIST_PTR listPtr,int iPos,int iNumb);
int GetData(LIST_PTR listPtr,int iPos);
int SameList(LIST_PTR list1,LIST_PTR list2);
int ListLong(LIST_PTR list1);
typedef struct LISTVECTOR
{
LIST_PTR list;
LISTVECTOR* last;
LISTVECTOR* next;
}LVECTOR,*VECTOR_PTR;
VECTOR_PTR GreatVector(int iMax);
VECTOR_PTR AddList(VECTOR_PTR vPtr,LIST_PTR lPtr);
void FreeVector(VECTOR_PTR vPtr);
VECTOR_PTR GetVTail(VECTOR_PTR vPtr);
void printVector(VECTOR_PTR vPtr);
int HaveSameList(VECTOR_PTR vPtr, LIST_PTR lPtr);
LIST_PTR GetBaseList(int iNumb,int* iMax);
LIST_PTR GetMinList(int iNumb,int iMax);
VECTOR_PTR DealLast(VECTOR_PTR vPtr, LIST_PTR lMaxPtr, LIST_PTR lMinPtr, int iPos, int iMaxPos);
VECTOR_PTR DealNext(VECTOR_PTR vPtr, LIST_PTR lMaxPtr, LIST_PTR lMinPtr, LIST_PTR lNewPtr, int iPos, int iMaxPos);
///
//
int main()
{
LIST_PTR basePtr=NULL;
VECTOR_PTR vectorPtr=NULL;
int iInput;
int iMaxNumb=0;
printf("please input a number ! : ");
scanf("%d",&iInput);
basePtr=GetBaseList(iInput,&iMaxNumb);
vectorPtr=AddList(vectorPtr,basePtr);
LIST_PTR maxPtr=NULL;
LIST_PTR minPtr=NULL;
for(int i=iMaxNumb; i>=1; i--)
{
maxPtr=CopeListBit(maxPtr,basePtr,i);
minPtr=GetMinList(iInput,i);
vectorPtr=DealLast(vectorPtr,maxPtr,minPtr,i,i);
FreeList(maxPtr);
maxPtr=NULL;
FreeList(minPtr);
minPtr=NULL;
}
VECTOR_PTR head=vectorPtr;
int iMax=0;
while(head->next)
{
head=head->next;
iMax++;
}
printVector(vectorPtr);
printf("\nT(n)=%d\n",iMax);
FreeVector(vectorPtr);
FreeList(basePtr);
return 0;
}
//
///
LIST_PTR CreatList(int iMax)
{
iMax= iMax ? iMax : 1;
LIST_PTR listPtr;
LIST_PTR tailPtr;
listPtr=(LIST_PTR) malloc(sizeof(ILIST));
listPtr->last=NULL;
listPtr->next=NULL;
listPtr->i_numb=0;
tailPtr=listPtr;
for(int i=2; inext=(LIST_PTR) malloc(sizeof(ILIST));
tailPtr->next->last=tailPtr;
tailPtr=tailPtr->next;
tailPtr->next=NULL;
tailPtr->i_numb=0;
}
return listPtr;
}
void FreeList(LIST_PTR listPtr)
{
if(!listPtr)
{
return;
}
while(listPtr->next)
{
listPtr=listPtr->next;
free(listPtr->last);
}
free(listPtr);
listPtr=NULL;
}
LIST_PTR AddNumber(LIST_PTR listPtr,int iNumb)
{
if(!listPtr)
{
listPtr=CreatList(1);
listPtr->i_numb=iNumb;
return listPtr;
}
LIST_PTR tailPtr=GetTail(listPtr);
tailPtr->next=(LIST_PTR) malloc(sizeof(ILIST));
tailPtr->next->last=tailPtr;
tailPtr=tailPtr->next;
tailPtr->next=NULL;
tailPtr->i_numb=iNumb;
return listPtr;
}
LIST_PTR GetTail(LIST_PTR listPtr)
{
if(!listPtr)
{
return NULL;
}
LIST_PTR tailPtr;
tailPtr=listPtr;
while(tailPtr->next)
{
tailPtr=tailPtr->next;
}
return tailPtr;
}
LIST_PTR CopeList(LIST_PTR newList,LIST_PTR oldList)
{
if(!oldList)
{
FreeList(newList);
newList=NULL;
return newList;
}
if(newList)
{
FreeList(newList);
}
LIST_PTR tailPtr=oldList;
while(tailPtr->next)
{
newList=AddNumber(newList,tailPtr->i_numb);
tailPtr=tailPtr->next;
}
return newList=AddNumber(newList,tailPtr->i_numb);
}
void printList(LIST_PTR listPtr)
{
if(!listPtr)
{
return;
}
LIST_PTR tailPtr=GetTail(listPtr);
printf("(");
while(tailPtr->last)
{
printf("%d,",tailPtr->i_numb);
tailPtr=tailPtr->last;
}
printf("%d)",tailPtr->i_numb);
}
VECTOR_PTR GreatVector(int iMax)
{
iMax= iMax ? iMax : 1;
VECTOR_PTR tailPtr;
VECTOR_PTR vPtr=(VECTOR_PTR) malloc(sizeof(LVECTOR));
vPtr->last=NULL;
vPtr->next=NULL;
vPtr->list=NULL;
tailPtr=vPtr;
for(int i=2; inext=(VECTOR_PTR) malloc(sizeof(LVECTOR));
tailPtr->next->last=tailPtr;
tailPtr=tailPtr->next;
tailPtr->next=NULL;
tailPtr->list=NULL;
}
return vPtr;
}
VECTOR_PTR AddList(VECTOR_PTR vPtr,LIST_PTR lPtr)
{
if(!vPtr)
{
vPtr=GreatVector(1);
CopeList(vPtr->list,lPtr);
}
VECTOR_PTR tailPtr=GetVTail(vPtr);
tailPtr->next=(VECTOR_PTR) malloc(sizeof(LVECTOR));
tailPtr->next->last=tailPtr;
tailPtr=tailPtr->next;
tailPtr->next=NULL;
tailPtr->list=NULL;
tailPtr->list=CopeList(tailPtr->list,lPtr);
return vPtr;
}
void FreeVector(VECTOR_PTR vPtr)
{
if(!vPtr)
{
return;
}
while(vPtr->next)
{
vPtr=vPtr->next;
FreeList(vPtr->last->list);
free(vPtr->last);
}
FreeList(vPtr->list);
free(vPtr);
vPtr=NULL;
}
VECTOR_PTR GetVTail(VECTOR_PTR vPtr)
{
if(!vPtr)
{
return NULL;
}
VECTOR_PTR tailPtr=vPtr;
while(tailPtr->next)
{
tailPtr=tailPtr->next;
}
return tailPtr;
}
void printVector(VECTOR_PTR vPtr)
{
if(!vPtr)
{
return;
}
VECTOR_PTR tailPtr=vPtr;
int i=0;
int length=0;
while(tailPtr->next)
{
printList(tailPtr->list);
tailPtr=tailPtr->next;
if(!(i++%3))
{
printf("\n");
}
else
{
printf("\t\t");
}
}
printList(tailPtr->list);
}
LIST_PTR GetBaseList(int iNumb,int* iMax)
{
iNumb= iNumb ? iNumb : 1;
*iMax=1;
LIST_PTR baseList=NULL;
baseList=AddNumber(baseList,iNumb);
if(1==iNumb)
{
return baseList;
}
int numb=(int) sqrt(iNumb);
while(numb>1)
{
baseList=AddNumber(baseList,numb);
numb=(int) sqrt(numb);
*iMax=*iMax+1;
}
*iMax=*iMax+1;
return baseList=AddNumber(baseList,numb);
}
LIST_PTR GetMinList(int iNumb,int iMax)
{
LIST_PTR minList=NULL;
iMax= iMax ? iMax : 1;
minList=CreatList(iMax);
minList=SetList(minList,1,iNumb);
int lastNumb=2;
int count=iMax;
switch(iMax)
{
case 1:
break;
case 2:
minList=SetList(minList,2,1);
break;
default:
minList=SetList(minList,count--,1);
while(1next)
{
newData=newData->next;
}
else
{
return listPtr;
}
}
newData->i_numb=iNumb;
return listPtr;
}
int GetData(LIST_PTR listPtr,int iPos)
{
if(!listPtr || !iPos)
{
return -1;
}
LIST_PTR dataPtr=listPtr;
for(int i=2; inext)
{
dataPtr=dataPtr->next;
}
else
{
return -1;
}
}
return dataPtr->i_numb;
}
VECTOR_PTR DealLast(VECTOR_PTR vPtr, LIST_PTR lMaxPtr, LIST_PTR lMinPtr, int iPos, int iMaxPos)
{
if(iPos=minNumb)
{
newPtr=NULL;
newPtr=CopeList(newPtr,lMaxPtr);
newPtr=SetList(newPtr,iPos,iNumber);
if(iPos=minNumb)
{
lNewPtr=SetList(lNewPtr,iPos,iNumber);
if(iPosnext)
{
break;
}
newList=AddNumber(newList,tailPtr->i_numb);
tailPtr=tailPtr->next;
}
return newList=AddNumber(newList,tailPtr->i_numb);
}
int SameList(LIST_PTR list1,LIST_PTR list2)
{
if(!list1||!list2)
{
return 0;
}
int max;
if((max=ListLong(list1))!=ListLong(list2))
{
return 0;
}
LIST_PTR tail1=list1;
LIST_PTR tail2=list2;
for(int i=1; ii_numb != tail2->i_numb)
{
return 0;
}
tail1=tail1->next;
tail2=tail2->next;
}
return 1;
}
int ListLong(LIST_PTR list1)
{
LIST_PTR tail=list1;
int i=0;
while(tail)
{
tail=tail->next;
i++;
}
return i;
}
int HaveSameList(VECTOR_PTR vPtr, LIST_PTR lPtr)
{
VECTOR_PTR tailV=vPtr;
while(tailV)
{
if(SameList(tailV->list,lPtr))
{
return 1;
}
tailV=tailV->next;
}
return 0;
}
/*
修改一下,把引用换成指针
*/
。
全部