- 论坛徽章:
- 0
|
如何实现一个单链表的反转?
今天早上起来想了想,由于语言的问题,在类型转换时还是使用了辅助指针及int临时变量。没有完全达到楼主的要求,思索再三,要想完全不再多用辅助变量,只能借助于块汇编了,避开类型转换时需要中间变量。
改了三处,如下所示。欢迎大家讨论。
- #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 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);
- _asm{
- mov ebx,DWORD PTR Tail
- mov esi,4
- }
- 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;
- }
复制代码 |
|