?unknown函数中,首先定义了三个Node类型的指针节点,并让p指向首节点,q指向p的下一个节点,r指向q的下一个节点。
如图类似于这样一个链表:
看到p->data>q->data 知道这个函数与节点中存储的值的大小有关 我便让p指向的节点data值设定为大于q指向节点的data值。
然后p=p->prior 让p指向头节点??
q->prior->next=r;? 让q指向节点的前驱节点 也就是原来p指向的节点的next指向r节点
空过(1) q->next=p->next; q->prior=p; 让q的next指向p原来指向的节点,也就是首节点,让q的前驱节点指向头节点??
看到这 我大概就知道 他是让q指向的节点与p原来指向的节点互换位置? 也就是说让data小的值放到链表前面 data大的值放到链表后面?
然后通过while循环给链表排序,排序方法为冒泡排序。
后面的代码就是将p,q,r,依次指向各自的下一个节点。
具体实现代码 如下:
#include<stdio.h> #include<stdlib.h> typedef struct Node { ?? ?int data; ?? ?struct Node *prior; ?? ?struct Node *next; }Linknode,*Linklist; void create(Linklist L,int *len); void maopaopx(Linklist L); void show(Linklist L,int *len); void destroy(Linklist L); int main(void) { ?? ?Linklist L; ?? ?int len; ?? ?L=(Linklist)malloc(sizeof(Linknode)); ?? ?L->next=L->prior=NULL; ?? ?create(L,&len); ?? ?show(L,&len); ?? ?maopaopx(L); ?? ?show(L,&len); ?? ?destroy(L); ?? ? } void create(Linklist L,int *len) { ?? ?int val; ?? ?Linklist pNew,rear=L; ?? ?printf("请输入链表长度: "); ?? ?scanf("%d",len);
?? ?for(int i=0;i<*len;i++) ?? ?{ ?? ??? ?printf("请输入第%d个值:",i+1); ?? ??? ?scanf("%d",&val); ?? ??? ?pNew=(Linklist)malloc(sizeof(Linknode)); ?? ??? ?pNew->data=val; ?? ??? ?pNew->prior=rear; ?? ??? ?pNew->next=L; ?? ??? ?rear->next=pNew; ?? ??? ?L->prior=pNew; ?? ??? ?rear=pNew; ?? ?} } void maopaopx(Linklist L) { ?? ?Linklist p,q,r; ?? ?p=L->next; ?? ?q=p->next; ?? ?r=q->next; ?? ?while(q!=L) ?? ?{ ?? ??? ?while(p!=L && p->data>q->data) ?? ??? ?{ ?? ??? ??? ?p=p->prior; ?? ??? ?} ?? ??? ?q->prior->next=r; ?? ??? ?r->prior=q->prior; ?? ??? ?q->next=p->next; ?? ??? ?q->prior=p; ?? ??? ?p->next->prior=q; ?? ??? ?p->next=q; ?? ??? ?q=r; ?? ??? ?p=q->prior; ?? ??? ?r=r->next; ?? ?} ?? ? } void show(Linklist L,int *len) { ?? ?Linklist p=L; ?? ?for(int i=0;i<*len;i++) ?? ?{ ?? ??? ?printf("%d ?",p->next->data); ?? ??? ?p=p->next; ?? ?}
} void destroy(Linklist L) { ?? ?Linklist c,p=L->next; ?? ?while(p!=L) ?? ?{ ?? ??? ?c=p; ?? ??? ?p=p->next; ?? ??? ?free(c); ?? ??? ?c=NULL; ?? ?} ?? ?free(L); ?? ?L=NULL; }
?
|