不用辅助节点,使用_asm{}实现单链表的反转。
2004-11-06 08:15
274 查看
由于使用宏,还是有要引入几个int类型的临时变量及指针,没有完全发挥xor操作的速度,改用块汇编实现。
只是替换了三处,测试与用C实现的结果一样。速度及空间应该都有改良。
#include <stdio.h>
#include <stdlib.h>
#define SWAP(a,b) { /
a=a^0xFFFFFFFF; /
b=b^a; /
a=a^b; /
b=b^0xFFFFFFFF; /
b=b^a; /
}
#define SWAP_POINT(pA,pB) {/
int h,t; /
pLinkList ph,pt; /
h=(int)pA; /
t=(int)pB; /
ph = (pLinkList)h; /
pt = (pLinkList)t; /
SWAP(h,t); /
pA = (pLinkList)h; /
pB = (pLinkList)t; /
}
typedef struct tagLinkList
{
int data;
struct tagLinkList *next;
} LinkList , *pLinkList ;
int main(int argc, char* argv[])
{
/*
int a=10,b=99;
_asm {
mov eax,a
mov ebx,b
xor ebx,eax
xor eax,ebx
xor ebx,eax
mov a,eax
mov b,ebx
}
printf("a=%d , b=%d /n",a,b);
*/
int count,i;
pLinkList Head,tmpNode,Tail;
Head=NULL;
// Construct LinkList.
printf("Enter count:"); scanf("%d",&count);
if(count <= 1)
{
printf("Count error,must large than 1./n");
exit(1);
}
for(i=1;i<=count;++i)
{
tmpNode=(LinkList *)malloc(sizeof(LinkList));
tmpNode->data=i;
printf("No.=%d/t Address:%X , Data:%d/n",i,tmpNode,tmpNode->data);
if(!Head)
Tail=Head=tmpNode;
else{
Tail->next=tmpNode;
Tail=tmpNode;
}
}
Tail->next=NULL;
// Reverse LinkList.
if(2 == count) {
//N=2
//SWAP_POINT(Head,Tail->next);
_asm {
mov eax,DWORD PTR Head
mov edx,DWORD PTR Tail
mov esi,4
mov ebx,[edx][esi]
xor ebx,eax
xor eax,ebx
xor ebx,eax
mov Head,eax
mov [edx][esi],ebx
}
SWAP_POINT(Head,Tail);
SWAP_POINT(Head->next->next,Tail);
}else if(3 == count) {
//N=3
SWAP_POINT(Head->next,Tail->next);
SWAP_POINT(Head,Tail);
SWAP_POINT(Head->next->next,Tail);
}else{
//N>=4
SWAP_POINT(Head->next,Tail->next);
SWAP_POINT(Head,Tail);
SWAP_POINT(Head->next->next,Tail);
SWAP_POINT(Head->next,Tail->next);
SWAP_POINT(Head->next->next,Tail);
for(i=6;i<=count;++i)
{
//SWAP_POINT(Head->next,Tail);
_asm {
mov edx,DWORD PTR Head
mov ebx,DWORD PTR Tail
mov esi,4
mov eax,[edx][esi]
xor ebx,eax
xor eax,ebx
xor ebx,eax
mov Tail,ebx
mov [edx][esi],eax
}
//SWAP_POINT(Head->next->next,Tail);
_asm {
mov eax,DWORD PTR Head
mov ebx,DWORD PTR Tail
mov esi,4
mov edx,[edx][esi]
mov eax,[edx][esi]
xor ebx,eax
xor eax,ebx
xor ebx,eax
mov Tail,ebx
mov [edx][esi],eax
}
}
}
//Output reversed LinkList.
tmpNode=Head;
printf("After reverse./n");
for(i=1;i<=count;++i)
{
printf("No.=%d/t Address:%X , Data:%d/n",i,tmpNode,tmpNode->data);
tmpNode = tmpNode->next;
}
printf("Tail->data = %d/n",Tail->data);
//Release LinkList
printf("Release LinkList./n");
for(i=1;i<=count;++i)
{
tmpNode=Head;
Head = Head->next;
free(tmpNode);
}
return 0;
}
只是替换了三处,测试与用C实现的结果一样。速度及空间应该都有改良。
#include <stdio.h>
#include <stdlib.h>
#define SWAP(a,b) { /
a=a^0xFFFFFFFF; /
b=b^a; /
a=a^b; /
b=b^0xFFFFFFFF; /
b=b^a; /
}
#define SWAP_POINT(pA,pB) {/
int h,t; /
pLinkList ph,pt; /
h=(int)pA; /
t=(int)pB; /
ph = (pLinkList)h; /
pt = (pLinkList)t; /
SWAP(h,t); /
pA = (pLinkList)h; /
pB = (pLinkList)t; /
}
typedef struct tagLinkList
{
int data;
struct tagLinkList *next;
} LinkList , *pLinkList ;
int main(int argc, char* argv[])
{
/*
int a=10,b=99;
_asm {
mov eax,a
mov ebx,b
xor ebx,eax
xor eax,ebx
xor ebx,eax
mov a,eax
mov b,ebx
}
printf("a=%d , b=%d /n",a,b);
*/
int count,i;
pLinkList Head,tmpNode,Tail;
Head=NULL;
// Construct LinkList.
printf("Enter count:"); scanf("%d",&count);
if(count <= 1)
{
printf("Count error,must large than 1./n");
exit(1);
}
for(i=1;i<=count;++i)
{
tmpNode=(LinkList *)malloc(sizeof(LinkList));
tmpNode->data=i;
printf("No.=%d/t Address:%X , Data:%d/n",i,tmpNode,tmpNode->data);
if(!Head)
Tail=Head=tmpNode;
else{
Tail->next=tmpNode;
Tail=tmpNode;
}
}
Tail->next=NULL;
// Reverse LinkList.
if(2 == count) {
//N=2
//SWAP_POINT(Head,Tail->next);
_asm {
mov eax,DWORD PTR Head
mov edx,DWORD PTR Tail
mov esi,4
mov ebx,[edx][esi]
xor ebx,eax
xor eax,ebx
xor ebx,eax
mov Head,eax
mov [edx][esi],ebx
}
SWAP_POINT(Head,Tail);
SWAP_POINT(Head->next->next,Tail);
}else if(3 == count) {
//N=3
SWAP_POINT(Head->next,Tail->next);
SWAP_POINT(Head,Tail);
SWAP_POINT(Head->next->next,Tail);
}else{
//N>=4
SWAP_POINT(Head->next,Tail->next);
SWAP_POINT(Head,Tail);
SWAP_POINT(Head->next->next,Tail);
SWAP_POINT(Head->next,Tail->next);
SWAP_POINT(Head->next->next,Tail);
for(i=6;i<=count;++i)
{
//SWAP_POINT(Head->next,Tail);
_asm {
mov edx,DWORD PTR Head
mov ebx,DWORD PTR Tail
mov esi,4
mov eax,[edx][esi]
xor ebx,eax
xor eax,ebx
xor ebx,eax
mov Tail,ebx
mov [edx][esi],eax
}
//SWAP_POINT(Head->next->next,Tail);
_asm {
mov eax,DWORD PTR Head
mov ebx,DWORD PTR Tail
mov esi,4
mov edx,[edx][esi]
mov eax,[edx][esi]
xor ebx,eax
xor eax,ebx
xor ebx,eax
mov Tail,ebx
mov [edx][esi],eax
}
}
}
//Output reversed LinkList.
tmpNode=Head;
printf("After reverse./n");
for(i=1;i<=count;++i)
{
printf("No.=%d/t Address:%X , Data:%d/n",i,tmpNode,tmpNode->data);
tmpNode = tmpNode->next;
}
printf("Tail->data = %d/n",Tail->data);
//Release LinkList
printf("Release LinkList./n");
for(i=1;i<=count;++i)
{
tmpNode=Head;
Head = Head->next;
free(tmpNode);
}
return 0;
}
相关文章推荐
- 不用辅助节点,实现单链表的反转。
- 反转单链表+求单链表倒数第k个节点+不用加减乘除做加法
- day02逆置/反转单链表+查找单链表的倒数第k个节点+实现一个Add函数不用四则运算
- 使用递归来实现删除单链表中最后一个节点不是数字‘2’
- Winform使用C#实现Treeview节点"正在展开..."效果
- 关于一道面试题,使用C#实现字符串反转算法
- 从此例中终于实现了从外部xml文件读取数据使用Flare 生成有节点有连线的Graph
- 使用C#实现字符串反转算法的参考答案
- 【多位数】【多重括号】【带负数】【字符表达式运算】【使用递归】【不用栈实现】
- 删除单链表中的倒数第n个节点的实现及测试程序
- 单链表实现删除最小节点的算法
- 使用单链表实现链队列
- Jtree不同节点使用不同图片实现
- 不使用任何中间变量,实现字符串反转
- 使用CSS不用程序实现文字自动截断 用省略号代替
- Asp.Net2.0中TreeView使用javascript客户端实现选择节点联动的脚本
- 使用CSS不用程序实现文字自动截断 用省略号代替
- Java中单链表的实现和单链表的反转(倒置)
- 两则实现相同功能的代码比较(使用临时表与不用临时表比较)