C语言双向链表的操作

typedef struct node
{
char name[20];
struct node *prior,*next;
}STU;

/*逆置双链表的原理,依次将原链表中的结点
用头插法插入到新的链接表中,新的链表不用分配内存*/
STU *reverse(stud *head)
{
  STU *p,*r,*h;
/*
p用来指向原链表中的第一个结点,待链入新链表头的结点
r用来指向原链表中的第二个结点
h用来指向新链表中的第一个结点
*/
  h=head->next;/*h用来指向链表的第一个结点*/
  if(h&&h->next)
  {
    p=h;
    r=p->next;/*r指向p的下一个结点*/
    p->next=NULL;/*让p的下一个结点为NULL*/
  while(r)
  {
    p=r;/*p指向r结点*/
    r=r->next;/*r继续指向下一个结点*/
    p->next=h;/*p的后继指向链表的第一个结点h*/
    h->prior=p;/*链表的第一各结点h的前驱指向p*/
    h=p;/*p链入链表后,p就成为了链表的第一个结点*/
  }
  head->next=h;/*头结点head的后继指向新链表的第一个结点h*/
  h->prior=head;/*新链表的第一结点h的前驱指向头结点head*/
  return head;
  }
}
原文地址:https://www.cnblogs.com/wangjz/p/4740632.html