数据结构C语言版 表插入排序 静态表
数据结构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语言版 表插入排序 静态表的更多相关文章
- 深入浅出数据结构C语言版(4)——表与链表
在我们谈论本文具体内容之前,我们首先要说明一些事情.在现实生活中我们所说的"表"往往是二维的,比如课程表,就有行和列,成绩表也是有行和列.但是在数据结构,或者说我们本文讨论的范围内 ...
- 数据结构C语言版 有向图的十字链表存储表示和实现
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...
- c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载
百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...
- 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明
<数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑 链接☛☛☛ <数据结构>课本源码合辑 习题集全解析 链接☛☛☛ ...
- 【数据结构(C语言版)系列一】 线性表
最近开始看数据结构,该系列笔记简单记录总结下所学的知识,更详细的推荐博主StrayedKing的数据结构系列,笔记部分也摘抄了博主总结的比较好的内容. 一些基本概念和术语 数据是对客观事物的符号表示, ...
- 数据结构C语言版--动态顺序表的基本功能实现(二)
/* * 若各个方法结构体变量参数为: &L(即地址符加变量)则结构体变量访问结构成员变量时使用"." * 若为:*L(即取地址符加变量)则结构体变量访问结构体成员变量使用 ...
- 数据结构C语言版干货------->线性表之顺序表
一:头文件定义 /*************************************************************************** *项目 数据结构 *概要 逻辑 ...
- 深入浅出数据结构C语言版(6)——游标数组及其实现
在前两次博文中,我们由表讲到数组,然后又由数组的缺陷提出了指针式链表(即http://www.cnblogs.com/mm93/p/6576765.html中讲解的带有next指针的链表).但是指针式 ...
随机推荐
- 当x含有偶数个1,返回1,否则为0。
题目描述: /* Return 1 when x contains an even number of 1s;0 otherwise. Assume W=32 */ int even_ones(uns ...
- Oracle SQL篇(四)group by 分组与分组的加强 rollup
分组操作group by 和分组的强化(rollup) 分组操作和分组函数的使用,对于编写SQL语句的人来说,是最基本的概念. 我们来看下面的例子: 在这里我们使用员工表EMP scott@D ...
- 关于js的一些关键知识点(call,apply,callee, caller,clourse,prototypeChain)
可能不少学习javascript在使用call,apply,callee时会感到困惑,以下希望对于你有所帮助: 1.~~~call ,apply是函数(函数对象)的方法:callee是函数argume ...
- 输出1到最大的N位数
题目:输入数字n,按顺序输出从1最大的n位10进制数.比如输入3,则输出1.2.3一直到最大的3位数即999. 分析:这是一道很有意思的题目.看起来很简单,其实里面却有不少的玄机. 应聘者在解决这个问 ...
- 从事web前端两年半后的迷茫
做了两年半的重构,突然有种迷茫的感觉,好像瓶颈了,不知道自己该怎么继续走下去,以前刚毕业的时候,总觉得自己有好多的东西要学在前端方面,所以有那个促使自己去学习的动力,每当没工作任务的时候,自己总是去主 ...
- perl5 第六章 模式匹配
第六章 模式匹配 by flamephoenix 一.简介二.匹配操作符三.模式中的特殊字符 1.字符+ 2.字符 []和[^] 3.字符 *和? 4.转义字符 5.匹配任意字母或数字 6 ...
- vs2010经常使用快捷键
调试快捷键 F6: 生成解决方式 Ctrl+F6: 生成当前项目 F7: 查看代码 Shift+F7: 查看窗口设计器 F5: 启动调试 Ctrl+F5: 開始运行(不调试) Shift+F5: 停止 ...
- GDB命令行最基本操作
程序启动: A.冷启动 gdb program e.g., gdb ./cs gdb –p pid e.g., gdb –p `pidof c ...
- nodejs partials 分布视图
在学习<node.js开发指南>nodejs partials view时,怎么都不能运行成功.经过艰苦探索,终于成功了,分享一下. Cause: nodejs 的express 版本之间 ...
- spring注解开发中常用注解以及简单配置
一.spring注解开发中常用注解以及简单配置 1.为什么要用注解开发:spring的核心是Ioc容器和Aop,对于传统的Ioc编程来说我们需要在spring的配置文件中邪大量的bean来向sprin ...