因此,对于链表来说,二分法检索是不可以的(对顺序链表或排序后的链表是可以用的)。% 查找和排序旋转数组的最小数字5815.06% 递归和循环斐波那契数列9323.32% 位运算二进制中1的个数7438.22% 代码的完整性数值的整数次方4920.55% 代码的完整性调整数组顺序使奇数位于偶数前面4223.23% 代码的鲁棒性链表中倒数第k个结点4423.98% 代码的鲁棒性反转链表5626.05% 代码的鲁棒性合并两个排序的链表3429.37% 代码的鲁棒性树的子结构...。对链表进行直接插入排序的基本思想就是假设链表的前面n-1个节点是已经按键值(就是用它排序的字段,我们取学号num为键值)排好序的c语言链表的冒泡排序,对于节点n在这个序列中找插入位置,使得n插入后新序列仍然有序。
/*
==========================
功能:选择排序(由小到大)
返回:指向链表表头的指针
==========================
选择排序的基本思想就是反复从还未排好序的那些节点中,
选出键值(就是用它排序的字段,我们取学号num为键值)最小的节点,
依次重新组合成一个链表。
我认为写链表这类程序,关键是理解:
head存储的是第一个节点的地址,head->next存储的是第二个节点的地址;
任意一个节点p的地址,只能通过它前一个节点的next来求得。
单向链表的选择排序图示:
---->[1]---->[3]---->[2]...---->[n]---->[NULL](原链表)
head1->next3->next2->nextn->next
---->[NULL](空链表)
first
tail
---->[1]---->[2]---->[3]...---->[n]---->[NULL](排序后链表)
first1->next2->next3->nexttail->next
1、先在原链表中找最小的,找到一个后就把它放到另一个空的链表中;
2、空链表中安放第一个进来的节点,产生一个有序链表,并且让它在原链表中分离出来(此时要注意原链表中出来的是第一个节点还是中间其它节点);
3、继续在原链表中找下一个最小的,找到后把它放入有序链表的尾指针的next,然后它变成其尾指针;
*/
structstudent*SelectSort(structstudent*head)
{
structstudent*pfirst;/*排列后有序链的表头指针*/
structstudent*ptail;/*排列后有序链的表尾指针*/
structstudent*pminBefore;/*保留键值更小的节点的前驱节点的指针*/
structstudent*pmin;/*存储最小节点*/
structstudent*p;/*当前比较的节点*/
pfirst=NULL;
while(head!=NULL)/*在链表中找键值最小的节点。*/
{
/*注意:这里for语句就是体现选择排序思想的地方*/
p = p->next)//循环遍历链表中的节点,找出此时最小的节点。最后指出:可以给节点再添加一个prev元素,用于指出前一个节点是谁,即同时有next和prev二个指向,这种改进后的链表称为“双向链表”,它有助于某些情况下减少遍历循环的次数,本文中的这种仅有一个next指向的链表,称为“单链表”。带头结点的循环双链表当head->next和heaad->prior两个指针都等于head时链表为空。
{
if(p->next->numnum)/*找到一个比当前min小的节点。*/
{
pminBefore=p;/*保存找到节点的前驱节点:显然p->next的前驱节点是p。*/
pmin=p->next;/*保存键值更小的节点。*/
}
}
/*上面for语句结束后,就要做两件事;一是把它放入有序链表中;二是根据相应的条件判断c语言链表的冒泡排序,安排它离开原来的链表。*/
/*第一件事*/
if(pfirst==NULL)/*如果有序链表目前还是一个空链表*/
{
pfirst=pmin;/*第一次找到键值最小的节点。*/
ptail=pmin;/*注意:尾指针让它指向最后的一个节点。*/
}
else/*有序链表中已经有节点*/
{
ptail->next=pmin;/*把刚找到的最小节点放到最后,即让尾指针的next指向它。*/
ptail=pmin;/*尾指针也要指向它。*/
}
/*第二件事*/
if(pmin==head)/*如果找到的最小节点就是第一个节点*/
{
head=head->next;/*显然让head指向原head->next,即第二个节点,就OK*/
}
else/*如果不是第一个节点*/
{
//前次最小节点的next指向当前min的next,这样就让min离开了原链表。而第二次遍历时将新节点里的random指针指向旧节点random指针指向的节点的next,如果在链表1->1'->2->2'->3->3'->4->4'中,节点4的random指针指向了节点1,那么就让节点4的next (4')的random指向节点1的next (1')。 使用三个指针表示前驱,当前和后继节点,每次将当前节点的next指向前驱节点,然后向后遍历直到链表末尾。
}
}
if(pfirst!=NULL)/*循环结束得到有序链表first*/
{
ptail->next=NULL;/*单向链表的最后一个节点的next应该指向NULL*/
}
head=pfirst;
returnhead;
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-109946-1.html