关于链表的插入排序

zealot198226 2005-04-01 11:24:01
#include <iostream.h>
#include <stdlib.h>
/* InsertonSort: sort liked list by the insertion sort method.
PRE: The linked list list had been created.Each entry of list contains a key
POST: The entries of the list have been rearranged so that the keys in all the entries are sorted into nondecreasing order.*/
void InsertionSort(List* list)
{
ListNode *fu; /*the first unsorted node to be inserted */
ListNode *Is; /*the last sorted node (tail of sorted sublists) */
ListNode *current,*trailing;
if(list->head){
Is = list->head; /*An empty list is already sorted */
while(Is->next) {
fu=Is->next; /*Remember first unsorted node */
if(LT(fu->entry.key,list->head->entry.key)){
Is->next=fu->next;
fu->next=list->head;
list->head=fu; /*Insert first unsorted at the head of sorted list*/
}else{
trailing=list->head;
for(current=trailing->next; GT(fu->entry.key,current->entry.key);current=current->next)
trailing=current;
/*First unsorted node now belongs between trailing and current */
if(fu== current)
Is=fu;
else{
Is->next=fu->next;
fu->next=current;
trailing->next=fu;
}
}
}
}
}


这是用链表实现插入排序的过程,但是看不清这个循环最后是什么样的变化,有人能分析下这个链表在排序过程中如何变化吗?GT和LT分别是宏代表GREATER THAN 和LESS THAN
...全文
360 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pcboyxhy 2005-04-01
  • 打赏
  • 举报
回复
你拿一个长度为3的链表测试一下
如果觉得很吃力
就想办法练练基本功
zealot198226 2005-04-01
  • 打赏
  • 举报
回复
已经想通了,是因为第二个IF语句的条件没看清。
xxxdg 2005-04-01
  • 打赏
  • 举报
回复
呵呵,有别人问我的同样的问题,
互相参考一下
这个程序也是有问题的,呼呼
xxxdg 2005-04-01
  • 打赏
  • 举报
回复
#include "iostream"
using namespace std;

struct Node
{
int value;
Node * pNext;
};

struct List
{
Node Head;
Node Tail;
};

void Init(List * pList)
{
pList->Head.pNext = &pList->Tail;
pList->Tail.pNext = 0;
pList->Head.value=0;
}
void Insert(Node * pCurrent,Node * pNew)
{
if(pCurrent)
{
pNew->pNext = pCurrent->pNext;
pCurrent->pNext = pNew;
}

}

void Delete(Node * pCurrent,Node * pToDelete)
{
if(pCurrent&&pToDelete&&(pCurrent->pNext==pToDelete))
pCurrent->pNext = pToDelete->pNext;
free(pToDelete);
}

void Destroy(List * pList)
{
while(pList->Head.pNext!=&pList->Tail)
Delete(&pList->Head,pList->Head.pNext);
}

int compare(Node * p1,Node * p2)
{
if(p1->value>=p2->value)
return 1;
else
return 0;
}
void Sort(List * pSource)
{
if(pSource->Head.value>0)
{
Node * pTemp = pSource->Head.pNext;
Init(pSource);
Insert(&pSource->Head,pTemp);
pTemp=pTemp->pNext;
Node * p1,*p2;
while(pTemp!=&pSource->Tail)
{
p2=&pSource->Head;
p1=pSource->Head.pNext;
while(compare(p1,pTemp)&&p1!=&pSource->Tail)
{
p2=p1;
p1=p1->pNext;
}
Insert(p2,pTemp);
pTemp=pTemp->pNext;
}

}
}

int main(int argc, char* argv[])
{

List l;
Init(&l);
Node * p;
for(int i=0;i<10;i++)
{
p=(Node *)malloc(sizeof(Node));
p->value=i;
Insert(&l.Head,p);
cout<<p->value<<" ";
}
cout<<endl;
Sort(&l);
for(p=l.Head.pNext;p!=&l.Tail;p=p->pNext)
cout<<p->value<<" ";
cout<<endl;
Destroy(&l);
return 0;
}
zealot198226 2005-04-01
  • 打赏
  • 举报
回复
UP
zealot198226 2005-04-01
  • 打赏
  • 举报
回复
顶下。
zealot198226 2005-04-01
  • 打赏
  • 举报
回复
这个链表算法我觉得是有问题的,比如假设头节点是最大为8,后面按照3,4,5,6,7来排列的话最后得到是7,6,5,4,3,8,只是把8排到最后了而已。这是刚才从新又走了一遍感觉的结果,不知道有没有问题。
源码下载地址: https://pan.quark.cn/s/8d2c461c797c JavaWeb程序设计构成了掌握Web交互式应用程序开发的核心领域,对于初学者来说,精通这一技术具有决定性意义。在“JavaWeb程序设计(第三版)作业答案”中,我们可以预期获得针对该教材习题的一系列深入解析,从而协助学习者强化知识体系。 JavaWeb所包含的技术组件涵盖了Servlet、JSP(JavaServer Pages)、JDBC(Java Database Connectivity)以及各类框架如Spring MVC、Struts等。Servlet是Java平台提供的一种扩展服务器功能的接口,能够处理HTTP请求并生成相应的反馈。JSP则是一种用于构建动态网页的工具,它支持开发者将HTML代码与Java代码进行整合编写,从而简化了Web应用程序的开发流程。 作业答案通常会涉及以下几个核心内容: 1. **Servlet基础**:可能包含Servlet生命周期、init(), service(), destroy()方法的应用,以及如何在web.xml文件中设定Servlet的映射关系。 2. **JSP基础**:JSP的九大内置对象,如request、response、session、application等的使用,以及EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)的实际操作。 3. **HTTP协议理解**:GET和POST请求方法的差异,请求头与响应头的应用,以及会话管理的概念阐释。 4. **JDBC数据库操作**:与数据库建立连接,执行SQL指令,处理查询结果集,以及...
源码链接: https://pan.quark.cn/s/a4b39357ea24 斐讯K2是一款广受用户青睐的无线路由器,其运行表现稳定且具备较高的可操作性,在DIY爱好者群体中拥有极高的声誉。本资料将系统性地阐述斐讯K2的固件刷机方法及其关联的技术要点。固件升级是路由器爱好者改善设备性能、扩展功能的一种普遍手段,经由替换出厂固件,能够达成更加个性化的网络配置、增强安全防护等目标。斐讯K2固件资源库涵盖了多种知名的非官方固件,诸如Tomato Pheonix 不死鸟、高恪、PandoraBox 潘多拉等,这些固件均具备独特的优势,能够适配不同用户的需求。 1. Tomato Pheonix 不死鸟:Tomato是一款立足于Linux的开源固件,以其精巧、高效而备受推崇。不死鸟版本是专门为华硕及斐讯路由器优化的分支,提供了卓越的QoS(服务质量)配置、详尽的图表监控以及便捷的固件升级途径。对于那些需要精准调控带宽和监测网络状态的用户而言,这是一个理想的选项。 2. 高恪:高恪固件是OpenWrt的定制化版本,着重于操作的便捷性和运行的可靠性,特别适合对路由器操作不甚熟悉的用户群体。它提供了一些实用的功能,例如内置的广告屏蔽、快速测速工具等,同时保留了OpenWrt的适应性。 3. PandoraBox 潘多拉:潘多拉盒是另一款基于OpenWrt的固件,它以丰富的插件库和强大的自定义潜力而闻名。用户能够依据个人需求安装各类插件,实现更多功能,如远程接入、DDNS(动态域名解析服务)等。 4. 官方固件的纯净版本与定制版本:官方固件通常更侧重于稳定性,纯净版意味着未预置额外的应用或服务,适合注重稳定性的用户。定制版则可能包含了制造商的特色功能或优...

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧