单链表的逆置(完整程序加思路分析)

来源:互联网 发布:发那科机器人编程培训 编辑:程序博客网 时间:2024/06/08 13:47
#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define N 3typedef struct node{    char name[20];    struct node *next;}stud;stud *creat(int n){    stud *p,*h,*s;    int i;    if((h=(stud*)malloc(sizeof(stud)))==NULL)    {        printf("不能分配内存空间!");        exit(0);    }    h->name[0] = '\0';    h->next=NULL;    p = h;    for(i = 0;i<n;i++)    {if((s=(stud*)malloc(sizeof(stud)))==NULL)    {        printf("不能分配内存空间!");        exit(0);    }p->next = s;printf("请输入第%d个人的名字",i+1);scanf("%s",s->name);s->next = NULL;p = s;    }    return(h);}void printList(stud *p){    while(p->next){    p = p->next;    printf("%s\n",p->name);}}void reverse(stud *p){  stud *a,*b,*c;  a = p;  b = p->next;  while(b->next!=NULL)  {      c=b->next;      b->next = a;      a = b;      b=c;  }  b->next = a;  p->next->next = NULL;  p->next=b;}void main(){    int number;    stud *head;    number = N;    head = creat(number);    printList(head);    reverse(head);    printf("单链表逆置之后:\n");    printList(head);}

结果如下:
结果

下面就来详细解释一下单链表逆置的思想:
什么是单链表逆置
链表 a -> b -> c -> d 表头是a,表尾是d。逆置的意思就是变成:
a <- b <- c <- d a变成表尾,d变成表头

void reverse(stud *p){  stud *a,*b,*c;  a = p;//p传的是表头;a此时指向了表头;  b = p->next;//b指向了表的第一个节点  while(b->next!=NULL)//就是只要b的下一个节点不为空,就改变指针方向  {      c=b->next;  //先把b的下一个节点保存      b->next = a;//改变b->next的指向      a = b;//下面这两句相当于a和b分别后移了一个节点。      b=c;  }  b->next = a;  p->next->next = NULL;  p->next=b;}
0 0
原创粉丝点击