您的位置:首页 > 其它

递归实现全排列

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: