遇到将链表逆序排列的问题,一开始觉得肯定会很复杂,后来猛然想到用数组存放地址
程序如下:
#include <stdio.h>
#include <stdlib.h>
#define N 6
typedef struct student
{int num;
char name[8];
int age;
struct student *next;
}BT;
void main()
{
BT a[N]={{100,"Lui",20},{101,"Wang",21},{102,"LI",21},{105,"zhang",22},{106,"Wei",22},{107,"Guo",23}};
int i,m,j;
BT *p1,*p2,*head,*p3,*q[N+2];
p1=a;
head=a;
p2=head;
printf("List a:\n");
for(i=1;i<=N;i++)
{
p3=p1;
printf("%8d% 8s %8d\n",p1->num,p1->name,p1->age);
p1->next=a+i;
p1=p1->next;
}
p3->next=NULL;//这里使用p1和p3是不一样的
printf("\n\n");
p1=head;
i=0;
while(p1!=NULL)
{
q[i]=p1;
printf("地址值为:%d\n",q[i]);
p1=p1->next;
i++;
}
printf("\n\n");
head=q[i-1];
p1=head;
for(j=i-2;j>-1;j--)
{
p1->next=q[j];
p1=p1->next;
}
p1->next=NULL;//倒序排列时这里要用p1,而不是用p3,用p3的话会少一个值。
p1=head;
while(p1!=NULL)
{
printf("%8d% 8s %8d\n",p1->num,p1->name,p1->age);
p1=p1->next;
}
system("pause");
}
这里说下标注的地方,的处理,第一处使用p1->next=NULL,会导致逆序后溢出,因为p1是p3的
后一位。
根据这个思路,对链表排序,可以将要排序的元素,顺序放到一数组中,同时将个地址也存放在一数组中,
按元素排序的同时将地址移动,之后将地址赋给指针即可。