采用选择排序法对链表进行排序,注意交换操作中不是对链表里某一节点里的某一元素进行交换,而是对两节点指针的交换
2010-05-23 23:51
477 查看
/*结构体定义*/
struct stu
{
int StuID;//
char name[10];//
int sex;//
int years;//
struct stu *next;
};
/***************************************************************
* Function Name: SortList(struct stu *pHead)
* Purpose: 对链表按学号进行排序
* Inputs:
1.pHead, 链表头指针
* Outputs:
NULL
* Retrun Value: 返回int类型值
****************************************************************/
int SortList(struct stu *pHead)
{
/*指针变量定义*/
struct stu *pi = NULL;
struct stu *pj = NULL;
struct stu *psmall = NULL;
struct stu *pafter = NULL;
struct stu *piAfter = NULL;
struct stu *pjAfter = NULL;
struct stu *ptemp = NULL;
struct stu *psmallAfter = NULL;
piAfter = pHead;//目的是记住pi的上一个元素
/*选择排序法*/
for(pi = pHead->next; pi->next != NULL; pi = pi->next)
{
psmall = pi;
for(pj = pi->next ; pj != NULL; psmallAfter = pj, pj = pj->next)//注意for循环的写法
{
if(pj->StuID < psmall->StuID)
{
psmall = pj;
pjAfter = psmallAfter;/*记住psmall的上一个元素*/
}
}
/*以下这种情况是当psmall指向的元素是链表最后一个元素时所进行的交换*/
if(psmall->next == NULL)//这时pi肯定不等于psmall,因为pi到不了链表尾,最多是链表尾的前一个节点处
{
piAfter->next = psmall;
psmall->next = pi->next;
pjAfter->next = pi;
pi->next = NULL;
}
else
if(psmall != pi)
{
piAfter->next = psmall;
pjAfter->next = pi;
ptemp = psmall->next;//暂存
psmall->next = pi->next;
pi->next = ptemp;
}
/* 由于前面的地址交换,使得pi的值改变,这时回到第一层循环前应该将其还原到原来位置的下一个位置,
* 由于有for语句的pi = pi->next,所以这里需要将pi还原为原来的位置
*/
pi = piAfter->next;
piAfter = piAfter->next;/*记住pi的上一个元素*/
}
return 0;
}
struct stu
{
int StuID;//
char name[10];//
int sex;//
int years;//
struct stu *next;
};
/***************************************************************
* Function Name: SortList(struct stu *pHead)
* Purpose: 对链表按学号进行排序
* Inputs:
1.pHead, 链表头指针
* Outputs:
NULL
* Retrun Value: 返回int类型值
****************************************************************/
int SortList(struct stu *pHead)
{
/*指针变量定义*/
struct stu *pi = NULL;
struct stu *pj = NULL;
struct stu *psmall = NULL;
struct stu *pafter = NULL;
struct stu *piAfter = NULL;
struct stu *pjAfter = NULL;
struct stu *ptemp = NULL;
struct stu *psmallAfter = NULL;
piAfter = pHead;//目的是记住pi的上一个元素
/*选择排序法*/
for(pi = pHead->next; pi->next != NULL; pi = pi->next)
{
psmall = pi;
for(pj = pi->next ; pj != NULL; psmallAfter = pj, pj = pj->next)//注意for循环的写法
{
if(pj->StuID < psmall->StuID)
{
psmall = pj;
pjAfter = psmallAfter;/*记住psmall的上一个元素*/
}
}
/*以下这种情况是当psmall指向的元素是链表最后一个元素时所进行的交换*/
if(psmall->next == NULL)//这时pi肯定不等于psmall,因为pi到不了链表尾,最多是链表尾的前一个节点处
{
piAfter->next = psmall;
psmall->next = pi->next;
pjAfter->next = pi;
pi->next = NULL;
}
else
if(psmall != pi)
{
piAfter->next = psmall;
pjAfter->next = pi;
ptemp = psmall->next;//暂存
psmall->next = pi->next;
pi->next = ptemp;
}
/* 由于前面的地址交换,使得pi的值改变,这时回到第一层循环前应该将其还原到原来位置的下一个位置,
* 由于有for语句的pi = pi->next,所以这里需要将pi还原为原来的位置
*/
pi = piAfter->next;
piAfter = piAfter->next;/*记住pi的上一个元素*/
}
return 0;
}
相关文章推荐
- 链表的基本操作 (1)采用尾插法建立一个链表; (2)输入一个元素,在道表中查找该元素是否存在,请给出相关信息; (3)将链表中的元素进行就地逆置。
- 编码实现环状单向链表(尾指针直接指向头指针,中间没有空节点),去除连续的重复元素的操作
- 给定一个单向链表,目前已经有一个指针,指向某一个节点(记作A),现在要删除这个节点A,如何操作。
- 链表排序交换节点为什么还得单独交换next指针?
- 单链表进行排序-通过节点交换,不通过值交换
- 编码实现环状单向链表(尾指针直接指向头指针,中间没有空节点),去除连续的重复元素的操作。
- 那些年我们刷过的算法题(排序)---有一个只由0,1,2三种元素构成的整数数组,请使用交换、原地排序而不是使用计数进行排序
- 编码实现环状单向链表(尾指针直接指向头指针,中间没有空节点),去除连续的重复元素的操作
- 假设以带头结点的循环链表表示队列, 并且只设一个指针指向队尾元素结点(注意不设头指针) 试编写相应的队列初始化,入队列和出队列的算法
- 采用单链表进行冒泡排序
- Java链表指针确实好烦 - 交换链表中连续的两个节点的位置
- jQuery利用sort对DOM元素进行排序操作
- 将链表逆序排列的一个程序及思考的对链表依某一元素排序方法
- 数据结构与算法:单链表(利用万能指针实现对任意类型数据进行操作)
- (转)问题:假设一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(既不是第一个,也不是最后一个节点),请将该节点从单链表中删除。
- python --- 根据某一元素进行分组,然后排序
- ArrayList和LinkedList都是实现了List接口的类,他们都是元素的容器,用于存放对象的引用; 他们都可以对存放的元素进行增删改查的操作,还可以进行排序。 但是,他们还是有区别的。
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
- 编写一个使用数组类模板Array对数组进行排序、求最大值和求元素和的程序,并采用相关数据进行测试。
- 单链表节点插入并进行排序