这是原双向链表,p表示该结点,c表示p的前缀
图(1)
如何实现将该结点和其前缀位置互换?
第一步:
(1)、将p的前缀指向c的前缀;
(2)、将c的前缀的后缀指向b
如图:
图(2)
第二步:
(1)、将c的前缀指向p的前缀
(2)、将p的前缀的后缀指向c
如图:
图(3)
第三步:
(1)、将c的前缀指向p;
(2)、将p的前缀指向c;
图(4)
完成上述三种算法,即可实现结点和其前缀的位置交换
算法代码如下:
void change(struct LNode *p)
{
struct LNode *c;
c=p->prior;//* *c表示*p的前缀
p->prior=c->prior;c->prior->next=p;//*见图(2)
c->next=p->next;p->next->prior=c;//*见图(3)
p->next=c;c->prior=p;//*见图(4)
}
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
struct LNode
{
int data;
struct LNode *next,*prior;
};
struct LNode *a0()
{
struct LNode *a;
a=(struct LNode*)malloc(sizeof(struct LNode));
a->prior=NULL;
struct LNode *b;
b=(struct LNode*)malloc(sizeof(struct LNode));
b->next=NULL;
a->next=b;
b->prior=a;
return a;
}
struct LNode *a1()
{
struct LNode *a,*d;
a=a0();
d=a;
int c;
for(c=9;c>=1;c--)
{
struct LNode *e;
e=(struct LNode*)malloc(sizeof(struct LNode));
e->data=c;
e->next=d->next;
d->next->prior=e;
e->prior=d;
d->next=e;
}
return a;
}
void change(struct LNode *p)
{
struct LNode *c;
c=p->prior;
p->prior=c->prior;
c->prior->next=p;
c->next=p->next;
p->next->prior=c;
p->next=c;
c->prior=p;
}
void Window_system()
{
char aa[]="Math DashµÄ½»»»Á´±íÖеÄÒ»¸ö½áµã¼°Æäǰ׺µÄ³ÌÐò";
char ab[strlen(aa)+6];
sprintf(ab,"title %s",aa);
system(ab);
puts(aa);
struct LNode *a,*b;
a=a1();
b=a->next;
while(b->next)
{
printf("%d\n",b->data);
b=b->next;
}
b=a->next;
int c=5,d;
for(d=1;d<=c-1;d++)
{
b=b->next;
}
change(&(*b));
b=a->next;
printf("½»»»µÚ%d¸ö½áµãºÍÆäǰ׺µÄλÖÃÖ®ºóµÄÁ´±í£º\n",c);
while(b->next)
{
printf("%d\n",b->data);
b=b->next;
}
system("pause");
}
main()
{
Window_system();
return 0;
}
程序运行结果如下: