数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了。他只是比对方更珍惜这份感情。/* 
 数据结构C语言版 表插入排序 
 算法10.3 P267-P270 
 编译环境:Dev-C++ 4.9.9.2
*/

#include <stdio.h>
#include <limits.h>

// 静态链表类型 
#define SIZE 100 // 静态链表容量 
typedef int KeyType; // 定义关键字类型为整型 
typedef int InfoType; // 定义其他信息的类型

typedef struct
{
 KeyType key; // 关键字项 
 InfoType otherinfo; // 其它数据项,具体类型在主程中定义 
}RedType; // 记录类型

typedef struct
{
 RedType rc; // 记录项 
 int next; // 指针项 
}SLNode; // 表结点类型

typedef struct
{
 SLNode r[SIZE]; // 0号单元为表头结点 
 int length; // 链表当前长度 
}SLinkListType; // 静态链表类型

// 由数组D建立n个元素的表插入排序的静态链表SL
void TableInsert(SLinkListType *SL,RedType D[],int n)
{
 int i,p,q;
 // 表头结点记录的关键字取最大整数(非降序链表的表尾)
 (*SL).r[0].rc.key=INT_MAX;  
 (*SL).r[0].next=0; // next域为0表示表尾(现为空表,初始化) 
 for(i=0;i<n;i++)
 {
  (*SL).r[i+1].rc=D[i]; // 将数组D的值赋给静态链表SL 
  q=0;
  p=(*SL).r[0].next;
  while((*SL).r[p].rc.key<=(*SL).r[i+1].rc.key)
  {
   // 静态链表向后移 
   q=p;
   p=(*SL).r[p].next;
  }
  (*SL).r[i+1].next=p; // 将当前记录插入静态链表 
  (*SL).r[q].next=i+1;
 }
 (*SL).length=n;
}

// 算法10.3  P270 
// 根据静态链表SL中各结点的指针值调整记录位置,使得SL中记录按关键字 
// 非递减有序顺序排列
void Arrange(SLinkListType *SL)
{
 int i,p,q;
 SLNode t;
 
 p=(*SL).r[0].next; // p指示第一个记录的当前位置 
 for(i=1;i<(*SL).length;++i)
 {
  // (*SL).r[1..i-1]中记录已按关键字有序排列,第i个记录在SL中的
  // 当前位置应不小于i 
  while(p<i)
   // 找到第i个记录,并用p指示其在SL中当前位置
   p=(*SL).r[p].next;
  q=(*SL).r[p].next; // q指示尚未调整的表尾 
  if(p!=i)
  {
   t=(*SL).r[p]; // 交换记录,使第i个记录到位 
   (*SL).r[p]=(*SL).r[i];
   (*SL).r[i]=t;
   // 指向被移走的记录,使得以后可由while循环找回
   (*SL).r[i].next=p; 
  }
  p=q; // p指示尚未调整的表尾,为找第i+1个记录作准备 
 }
}

// 求得adr[1..L.length],adr[i]为静态链表L的第i个最小记录的序号
void Sort(SLinkListType L,int adr[])
{
 int i=1,p=L.r[0].next;
 while(p)
 {
  adr[i++]=p;
  p=L.r[p].next;
 }
}

// 算法10.18(L的类型有变) P290 
// adr给出静态链表L的有序次序,即L.r[adr[i]]是第i小的记录。 
// 本算法按adr重排L.r,使其有序。 
void Rearrange(SLinkListType *L,int adr[])
{
 int i,j,k;
 for(i=1;i<(*L).length;++i)
 if(adr[i]!=i)
 {
  j=i;
  (*L).r[0]=(*L).r[i]; // 暂存记录(*L).r[i] 
  while(adr[j]!=i)
  {
   // 调整(*L).r[adr[j]]的记录到位直到adr[j]=i为止 
   k=adr[j];
   (*L).r[j]=(*L).r[k];
   adr[j]=j;
   j=k; // 记录按序到位 
  }
  (*L).r[j]=(*L).r[0];
  adr[j]=j;
 }
}

void print(SLinkListType L)
{
 int i;
 for(i=1;i<=L.length;i++)
 printf("key=%d ord=%d next=%d\n",L.r[i].rc.key,
  L.r[i].rc.otherinfo,L.r[i].next);
}

#define N 8

int main()
{
 RedType d[N]={
  {49,1},{38,2},{65,3},{97,4},
  {76,5},{13,6},{27,7},{49,8}
 };
 SLinkListType l1,l2;
 int *adr,i;
 
 TableInsert(&l1,d,N);
 l2=l1; // 复制静态链表l2与l1相同 
 printf("排序前:\n");
 print(l1);
 Arrange(&l1);
 printf("l1排序后:\n");
 print(l1);
 adr=(int*)malloc((l2.length+1)*sizeof(int));
 Sort(l2,adr);
 for(i=1;i<=l2.length;i++)
  printf("adr[%d]=%d ",i,adr[i]);
 printf("\n");
 Rearrange(&l2,adr);
 printf("l2排序后:\n");
 print(l2);
 
 system("pause");
 return 0; 
}
/*

排序前:
key=49 ord=1 next=8
key=38 ord=2 next=1
key=65 ord=3 next=5
key=97 ord=4 next=0
key=76 ord=5 next=4
key=13 ord=6 next=7
key=27 ord=7 next=2
key=49 ord=8 next=3
l1排序后:
key=13 ord=6 next=6
key=27 ord=7 next=7
key=38 ord=2 next=7
key=49 ord=1 next=6
key=49 ord=8 next=8
key=65 ord=3 next=7
key=76 ord=5 next=8
key=97 ord=4 next=0
adr[1]=6 adr[2]=7 adr[3]=2 adr[4]=1 adr[5]=8 adr[6]=3 adr[7]=5 adr[8]=4
l2排序后:
key=13 ord=6 next=7
key=27 ord=7 next=2
key=38 ord=2 next=1
key=49 ord=1 next=8
key=49 ord=8 next=3
key=65 ord=3 next=5
key=76 ord=5 next=4
key=97 ord=4 next=0
请按任意键继续. . .

*/

数据结构C语言版 表插入排序 静态表的更多相关文章

  1. 深入浅出数据结构C语言版(4)——表与链表

    在我们谈论本文具体内容之前,我们首先要说明一些事情.在现实生活中我们所说的"表"往往是二维的,比如课程表,就有行和列,成绩表也是有行和列.但是在数据结构,或者说我们本文讨论的范围内 ...

  2. 数据结构C语言版 有向图的十字链表存储表示和实现

    /*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...

  3. c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...

  4. 数据结构C语言版 弗洛伊德算法实现

    /* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...

  5. 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

    <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑  链接☛☛☛ <数据结构>课本源码合辑 习题集全解析  链接☛☛☛  ...

  6. 【数据结构(C语言版)系列一】 线性表

    最近开始看数据结构,该系列笔记简单记录总结下所学的知识,更详细的推荐博主StrayedKing的数据结构系列,笔记部分也摘抄了博主总结的比较好的内容. 一些基本概念和术语 数据是对客观事物的符号表示, ...

  7. 数据结构C语言版--动态顺序表的基本功能实现(二)

    /* * 若各个方法结构体变量参数为: &L(即地址符加变量)则结构体变量访问结构成员变量时使用"." * 若为:*L(即取地址符加变量)则结构体变量访问结构体成员变量使用 ...

  8. 数据结构C语言版干货------->线性表之顺序表

    一:头文件定义 /*************************************************************************** *项目 数据结构 *概要 逻辑 ...

  9. 深入浅出数据结构C语言版(6)——游标数组及其实现

    在前两次博文中,我们由表讲到数组,然后又由数组的缺陷提出了指针式链表(即http://www.cnblogs.com/mm93/p/6576765.html中讲解的带有next指针的链表).但是指针式 ...

随机推荐

  1. 国内外主流BI厂商对比

    BI(Business Intelligence),即商业智能或者商务智能,它是一套完整的解决方案,用来将企业中现有的数据进行有效的整合,快速准确的提供报表并提出决策依据,帮助企业做出明智的业务经营决 ...

  2. 【android开发】小说阅读器

    新人开发理念 1 activity 是每个功能页面的入口 2 动画效果需要配合资源文件中,动画的定义 3 文件的读取是有权限控制的 4 布局应该尽量简单,这样才能让程序跑的飞快 前记 重新开始一个新的 ...

  3. InfoQ文章

    http://www.infoq.com/cn/presentations/log-platform-construction-weipinhui https://github.com/Telesco ...

  4. 射频识别技术漫谈(16)——Mifare UltraLight

    Mifare UltraLight又称为MF0,从UltraLight(超轻的)这个名字就可以看出来,它是一个低成本.小容量的卡片.低成本,是指它是目前市场中价格最低的遵守ISO14443A协议的芯片 ...

  5. PCB的整个加工流程

    1 MI:制作生产流程卡,指导产线如何去生产出所需要的pcb.2 内层:PCB,除了最便宜的单层板,简单的双层板,有时候需要使用4层 6层 8层,以实现复杂的连 接关系和高密度,再就是减少干扰或者降低 ...

  6. Qt中QFtp获取带有中文的文件名称出现乱码的解决方法(执行操作前就转换编码)

    今天研究了一下QFtp这个类,发现访问得到的文件名称中一旦出现中文,不管怎么转换编码格式,最终显示出来的始终都是乱码.由于编码错误,我写了两个函数用于互相转换编码. 一个是由正常编码转为QFTP上所谓 ...

  7. Linux计时体系结构

    [Linux操作系统分析]定时测量——RTC,TSC,PIT,jiffies,计时体系结构,延迟函数   1 基本概念 定时机制连同一些更可见的内核活动(如检查超时)来驱使进程切换. 两种主要的定时测 ...

  8. Nginx 的 Echo 模块 —— echo-nginx-module(转)

    Nginx 有个 echo 模块可以用来输出一些简单的信息,例如: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2 ...

  9. HDU 2451 Simple Addition Expression

    题目大意:有一个关于 简单加法表达式  的定义告诉你,就是  选一个数字i  如果 i+(i+1)+(i+2) 它的和,没有任何一位进位的话,那就是 一个i的简单加法表达式,求小于n的表达式数目. 题 ...

  10. Clojure绘制UML

    简单介绍 使用Clojure封装了Graphviz的使用.眼下主要实现了UML的绘制 使用 以命令模式的UML为例,演示cdraw的使用 安装Graphviz cdraw是对Graphviz的简单封装 ...