递归实现全排列
2015-02-10 17:14
169 查看
1、如果运算力,和理乱麻的水平不够。尽量不要复用本地变量(比如c用来计数,“不计数后”,又用来做其它比如作为步长),除非你确认不会出现问题。
2、尽量让每个逻辑单元(函数内可以有多个逻辑单元)尽量小,逻辑尽量要清晰
3、语言组织能力有限,就说这些了。(代码未整理,抱歉了)
// ArrangeDemo.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
int *g_pData=0;
int g_iTotal=4;
typedef struct _TestNode{
int data;
struct _TestNode *next;
}TestNode;
void DeinitLink(TestNode *pNodeHead);
int GetNodeCount(TestNode *pNodeHead);
int InsertNode(TestNode **ppNodeHead, TestNode *pNode, int position);
int GetNode(TestNode **ppNodeHead, int position);
int DeleteNode(TestNode **ppNodeHead, int position);
int Arrange(TestNode **ppNodeHead);
TestNode *InitLink();
int ArrangeDemo();
int ArrangeDemo(){
int ret=0;
TestNode *pNodeHead=InitLink();
int c=GetNodeCount(pNodeHead);
g_pData=(int *)malloc((c+3)*sizeof(int));
memset(g_pData, 0, (c+3)*sizeof(int));
ret=Arrange(&pNodeHead);
free(g_pData);
g_pData=0;
DeinitLink(pNodeHead);
return ret;
}
TestNode *InitLink(){
TestNode *pNode=0, *pHeadNode=0, *pTailNode=0;
int i=0;
for(i=0; i<g_iTotal; i++){
pNode=(TestNode *)malloc(sizeof(TestNode));
pNode->data=i;
pNode->next=0;
if(pHeadNode){
pTailNode->next=pNode;
pTailNode=pNode;
}
else{
pTailNode=pNode;
pHeadNode=pTailNode;
}
}
return pHeadNode;
}
int Arrange(TestNode **ppNodeHead){
int ret=0;
TestNode *pNodeHead=*ppNodeHead;
TestNode *pNode=0;
int c=GetNodeCount(pNodeHead);
if(c==1)
{
g_pData[g_iTotal-1]=pNodeHead->data;
int j=0;
for (j=0; j<g_iTotal; j++)
{
printf("%d", g_pData[j]);
}
printf("\n");
return ret;
}
int i=0;
for(i=0; i<c; i++){
pNode=(TestNode *)malloc(sizeof(TestNode));
pNode->data=GetNode(&pNodeHead, i);
pNode->next=0;
DeleteNode(&pNodeHead, i);
Arrange(&pNodeHead);
InsertNode(&pNodeHead, pNode, i);
*ppNodeHead=pNodeHead;
}
return ret;
}
int GetNode(TestNode **ppNodeHead, int position){
int ret=0;
TestNode *pNodeHead=*ppNodeHead;
TestNode *pNode=0, *p=0;
int c=GetNodeCount(pNodeHead);
if(position<1){
pNode=pNodeHead;
return pNode->data;
}
else{
int i=0;
p=pNodeHead;
for(i=0; i<c; i++){
if(i==position){
pNode=p;
return pNode->data;
}
else{
p=p->next;
}
}
}
return ret;
}
int DeleteNode(TestNode **ppNodeHead, int position){
int ret=0;
TestNode *pNodeHead=*ppNodeHead;
TestNode *pNode=0, *p=0, *q=0;
int c=GetNodeCount(pNodeHead);
if(position<1){
pNode=pNodeHead;
pNodeHead=pNodeHead->next;
*ppNodeHead=pNodeHead;
g_pData[g_iTotal-c]=pNode->data;
free(pNode);
}
else{
int i=0;
p=pNodeHead;
for(i=0; i<c; i++){
if(i==position){
pNode=p;
q->next=p->next;
g_pData[g_iTotal-c]=pNode->data;
free(pNode);
return ret;
}
else{
q=p;
p=p->next;
}
}
}
return ret;
}
int InsertNode(TestNode **ppNodeHead, TestNode *pNode, int position){
int ret=0;
TestNode *pNodeHead=*ppNodeHead, *p=0;
if(position<1){
pNode->next=pNodeHead;
pNodeHead=pNode;
*ppNodeHead=pNodeHead;
}
else{
int i=0;
p=pNodeHead;
for(i=0; i<position; i++){
if(i==position-1){
if(p)
{
pNode->next=p->next;
p->next=pNode;
}
}
else{
p=p->next;
}
}
}
return ret;
}
int GetNodeCount(TestNode *pNodeHead){
int c=0;
while(pNodeHead){
c++;
pNodeHead=pNodeHead->next;
}
return c;
}
void DeinitLink(TestNode *pNodeHead){
TestNode *pNode=0;
while(pNodeHead){
pNode=pNodeHead;
pNodeHead=pNodeHead->next;
free(pNode);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
ArrangeDemo();
return 0;
}
2、尽量让每个逻辑单元(函数内可以有多个逻辑单元)尽量小,逻辑尽量要清晰
3、语言组织能力有限,就说这些了。(代码未整理,抱歉了)
// ArrangeDemo.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
int *g_pData=0;
int g_iTotal=4;
typedef struct _TestNode{
int data;
struct _TestNode *next;
}TestNode;
void DeinitLink(TestNode *pNodeHead);
int GetNodeCount(TestNode *pNodeHead);
int InsertNode(TestNode **ppNodeHead, TestNode *pNode, int position);
int GetNode(TestNode **ppNodeHead, int position);
int DeleteNode(TestNode **ppNodeHead, int position);
int Arrange(TestNode **ppNodeHead);
TestNode *InitLink();
int ArrangeDemo();
int ArrangeDemo(){
int ret=0;
TestNode *pNodeHead=InitLink();
int c=GetNodeCount(pNodeHead);
g_pData=(int *)malloc((c+3)*sizeof(int));
memset(g_pData, 0, (c+3)*sizeof(int));
ret=Arrange(&pNodeHead);
free(g_pData);
g_pData=0;
DeinitLink(pNodeHead);
return ret;
}
TestNode *InitLink(){
TestNode *pNode=0, *pHeadNode=0, *pTailNode=0;
int i=0;
for(i=0; i<g_iTotal; i++){
pNode=(TestNode *)malloc(sizeof(TestNode));
pNode->data=i;
pNode->next=0;
if(pHeadNode){
pTailNode->next=pNode;
pTailNode=pNode;
}
else{
pTailNode=pNode;
pHeadNode=pTailNode;
}
}
return pHeadNode;
}
int Arrange(TestNode **ppNodeHead){
int ret=0;
TestNode *pNodeHead=*ppNodeHead;
TestNode *pNode=0;
int c=GetNodeCount(pNodeHead);
if(c==1)
{
g_pData[g_iTotal-1]=pNodeHead->data;
int j=0;
for (j=0; j<g_iTotal; j++)
{
printf("%d", g_pData[j]);
}
printf("\n");
return ret;
}
int i=0;
for(i=0; i<c; i++){
pNode=(TestNode *)malloc(sizeof(TestNode));
pNode->data=GetNode(&pNodeHead, i);
pNode->next=0;
DeleteNode(&pNodeHead, i);
Arrange(&pNodeHead);
InsertNode(&pNodeHead, pNode, i);
*ppNodeHead=pNodeHead;
}
return ret;
}
int GetNode(TestNode **ppNodeHead, int position){
int ret=0;
TestNode *pNodeHead=*ppNodeHead;
TestNode *pNode=0, *p=0;
int c=GetNodeCount(pNodeHead);
if(position<1){
pNode=pNodeHead;
return pNode->data;
}
else{
int i=0;
p=pNodeHead;
for(i=0; i<c; i++){
if(i==position){
pNode=p;
return pNode->data;
}
else{
p=p->next;
}
}
}
return ret;
}
int DeleteNode(TestNode **ppNodeHead, int position){
int ret=0;
TestNode *pNodeHead=*ppNodeHead;
TestNode *pNode=0, *p=0, *q=0;
int c=GetNodeCount(pNodeHead);
if(position<1){
pNode=pNodeHead;
pNodeHead=pNodeHead->next;
*ppNodeHead=pNodeHead;
g_pData[g_iTotal-c]=pNode->data;
free(pNode);
}
else{
int i=0;
p=pNodeHead;
for(i=0; i<c; i++){
if(i==position){
pNode=p;
q->next=p->next;
g_pData[g_iTotal-c]=pNode->data;
free(pNode);
return ret;
}
else{
q=p;
p=p->next;
}
}
}
return ret;
}
int InsertNode(TestNode **ppNodeHead, TestNode *pNode, int position){
int ret=0;
TestNode *pNodeHead=*ppNodeHead, *p=0;
if(position<1){
pNode->next=pNodeHead;
pNodeHead=pNode;
*ppNodeHead=pNodeHead;
}
else{
int i=0;
p=pNodeHead;
for(i=0; i<position; i++){
if(i==position-1){
if(p)
{
pNode->next=p->next;
p->next=pNode;
}
}
else{
p=p->next;
}
}
}
return ret;
}
int GetNodeCount(TestNode *pNodeHead){
int c=0;
while(pNodeHead){
c++;
pNodeHead=pNodeHead->next;
}
return c;
}
void DeinitLink(TestNode *pNodeHead){
TestNode *pNode=0;
while(pNodeHead){
pNode=pNodeHead;
pNodeHead=pNodeHead->next;
free(pNode);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
ArrangeDemo();
return 0;
}