#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define N 3
typedef 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;
}