急求c语言高手解释程序

来源:百度知道 编辑:UC知道 时间:2024/05/28 15:19:55
给定程序中,函数fun的功能是将带头结点的单向链表逆置。即若原链表中从头至尾结点数据域依次为:2,4,6,8,10,逆置后,从头至尾结点数据域依次:10,8,6,4,2.
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{int data;
struct node *next;}NODE;
void fun(NODE *h)
{NODE *p,*q,*r;
p=h->next;
if(p==NULL) return;
q=p->next;
p->next=NULL;
while(q){r=q->next;q->next=p;p=q;q=r;} 此行是如何实现逆置的?
h->next=p;
}

就以你的数据(2,4,6,8,10)为例讲解一下:
(1)p=h->next;
if(p==NULL) return;
q=p->next;
p->next=NULL;经过这段程序后指针h连着指针p,p再连着指针q,所以*p等于2,*q等于4
(2)经过r=q->next;后,*r等于6,
经过q->next=p;后,那么指针q就连着指针p,*q等于4,*p等于2,这样就将2和4颠倒了
(3)经过p=q;q=r;后,*q等于6,*p等于4,这样又来一次循环,就达到把指针p连着指针q后面,实现6,4,2的排序
(4)不断的循环知道q指向NULL才停止,最后结果是10,8,6,4,2
第一次这样仔细分析程序,可惜画不出图,自己慢慢画图琢磨下,很容易领会的