将链表逆序排列的一个程序及思考的对链表依某一元素排序方法
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的
后一位。
根据这个思路,对链表排序,可以将要排序的元素,顺序放到一数组中,同时将个地址也存放在一数组中,
按元素排序的同时将地址移动,之后将地址赋给指针即可。
程序如下:
#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的
后一位。
根据这个思路,对链表排序,可以将要排序的元素,顺序放到一数组中,同时将个地址也存放在一数组中,
按元素排序的同时将地址移动,之后将地址赋给指针即可。
相关文章推荐
- 怎样编写一个程序,把一个有序整数数组放到二叉树中? 编写实现链表排序的一种算法。说明为什么你会选择用这样的方法?
- 链表逆序(递归&非递归)/倒序输出链表值/用一个递增序列构建平衡二叉搜索树/用递归的方法判断数组是不是升(降)序排列
- 数据结构链表习题2.27,假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合,现要求另辟空间构成一个顺序链表
- 2. 编写一个Java应用程序,用户从键盘输入一个1~9999之间的数,程序将判断这个数是几位数,并判断这个数是否是回文数。回文数是指将该数含有的数字逆序排列后得到的数和原数相同,例如12121、32
- java基础—自定义一个比较器,对TreeSet 集合中的元素按指定方法来排序(java集合六)
- 18.9 随机生成一些数字并传入某个插入方法。 编写一个程序,高效地插入过的元素的维护中位数。
- jquery delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数
- 设计鲁棒性的方法:输入一个链表的头结点,逆序遍历打印该链表出来
- 2. Add Two Numbers 给定的两个链表是逆序排列的,相加后放在一个新的链表里边
- 无序链表合并为一个有序链表,且排序后链表中无重复元素
- 将两个按元素值递增排序的单链表合并成一个按元素值递减的单链表
- 编写一个排序函数,实现数字排序。排序方法由客户函数实现,函数参数个数为两个,两个参数的关系作为排序后的元素间的关系。
- 设计鲁棒性的方法:输入一个链表的头结点,逆序遍历打印该链表出来
- 编写一个Java应用程序。用户从键盘输入一个1—9999之间的数,程序将判断这个数是几位数, 并判断这个数是否是回文数。回文数是指将该数含有的数字逆序排列后得到的数和原数相同, 例如12121、3
- 对一个二维数组中的数据排序,方法如下: 将整个数组中值最小的元素所在行调整为数组第一行, 将除第一行外的行中最小元素所在行调整为第2行, 将除第1,2行外的行中最小值元素所在行调整为第3行,以此类推
- <数据结构>单链表元素按插入方法排序实现
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环)
- C语言 将链表中的元素在同一个链表中逆序输出
- 给定一个排序链表,删除所有重复的元素每个元素只留下一个。
- 用了接近一天的程序看懂了堆排序,堆排序的“筛选”的前提条件是一个大(小)顶堆,只有堆顶的元素不是有序的。这样从堆顶开始的排序才是筛选。而堆排序就是反复筛选的程序。