链表的逆序操作:
代码如下:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef struct _STU//定义一个结构体,链表的每一个节点都为此类型。
{
int id;//学号
char name[32];//姓名
int age;//年龄
struct _STU *next;//链表指针域
}STU, *PSTU;
void InsertHead(PSTU *pphead,int id,char name[],int age)//头插法
{
PSTU pnew=NULL;
pnew = (PSTU)malloc(sizeof(STU));
pnew->id = id;
strcpy(pnew->name,name);
pnew->age = age;
pnew->next=*pphead;
*pphead=pnew;
}
void show(PSTU head)//输出函数
{
PSTU pos = head;
while (pos != NULL)
{
printf("%d %s %d\n", pos->id, pos->name, pos->age);
pos = pos->next;
}
}
void reverse(PSTU *pphead)//逆序函数
{
if (!(NULL == *pphead || NULL == (*pphead)->next))//先确定链表是否为空或者只有一个节点
{
PSTU p1 = NULL, p2 = NULL, p3 = NULL; // 我们使用3P法来进行逆序操作
p1 = *pphead; //让P1指向第一个节点
p2 = p1->next; //P2指向第二个节点
p3 = p2->next; //P3指向第三个节点
p2->next = p1; //把P1的值给P2->next 就是让第二个节点的指针域指向第一个节点
while (p3 != NULL) //用此方法进行循环,当P3为空时,说明已经遍历完整个链表
{
p1 = p2;
p2 = p3;
p3 = p3->next;
p2->next = p1;
}
(*pphead)->next = NULL; //然后让第一个节点的指针域为空
*pphead = p2; //让头指针指向最后一个节点
}
}
int main()
{
PSTU head = NULL;
InsertHead(&head, 9001, "张黑狗",22);//用头插法插入数据
InsertHead(&head, 9001, "强大力", 22);
InsertHead(&head, 9001, "叶凡", 22);
InsertHead(&head, 9001, "王腾", 22);
InsertHead(&head, 9001, "崔林涛", 22);
InsertHead(&head, 9001, "刘大波", 22);
InsertHead(&head, 9001, "吕狗蛋", 22);
InsertHead(&head, 9001, "李大嘴", 22);
show(head);
puts("-------------------------------");
reverse(&head);
show(head);
return 0;
}
结果如下
流程示意图: