您的位置:首页 > 其它

将链表逆序排列的一个程序及思考的对链表依某一元素排序方法

2012-11-02 18:53 381 查看
遇到将链表逆序排列的问题,一开始觉得肯定会很复杂,后来猛然想到用数组存放地址

程序如下:

#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
={{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的

后一位。

根据这个思路,对链表排序,可以将要排序的元素,顺序放到一数组中,同时将个地址也存放在一数组中,

按元素排序的同时将地址移动,之后将地址赋给指针即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐