数据结构(C语言版):排序
StaticLinkList.h
#pragma once
#include<cstdio>
// 默认静态链表最大容量
#define maxSize 100
// 假定的最大值
#define maxValue 32767
//假定关键码类型int
typedef int DateType;
// 静态链表结点的类型定义
typedef struct {
DateType data; //元素
int link; //节点的链接指针
}SLNode;
// 静态链表的类型定义
typedef struct {
SLNode element[maxSize]; //存储待排序元素的向量
int n; //当前元素个数
}StaticLinkList;
void CreateSList(StaticLinkList& SL, DateType a[], int n) {
/*
从输入数组a创建带头节点的静态链表SL,头结点在SL.element[0],n是表长度
*/
for (size_t i = 0; i < n; i++) //构建链表
{
SL.element[i + 1].data = a[i];
SL.element[i + 1].link = i + 2;
}
SL.element[0].data = maxValue;//头结点存入最大值
// 构成循环单链表
SL.element[0].link = 1;
SL.element[n].link = 0;
SL.n = n;
}
//输出
void OutputSList(StaticLinkList&SL) {
for (size_t i = SL.element[0].link; i!=0; i=SL.element[i].link)
{
printf("%d\t", SL.element[i].data);
}
putchar(10);
}
DataList.h
#pragma once
#include<stdio.h>
#include<cstdlib>
#define maxSize 20
typedef int DateType; //元素数据类型
typedef struct { //数据表的类型定义
DateType data[maxSize];//排序元素数组
int n; //排序元素个数
}DataList;
void Swap(DataList&L, int i, int j) {
if (i>=0&&i<L.n&&j>=0&&j<L.n) {
//交换L.data[i]和 L.data[j]中的内容
DateType temp = L.data[i];
L.data[i] = L.data[j];
L.data[j] = temp;
}
}
void InsertSort(DataList& L) {
/*
依次将元素L.data[i] 按其排序码插入到有序表L.data[0],L.data[1],...,L.data[i-1]中
使得L.data[0]到L.data[i]有序。让i=1到i=L.n-1 重复插入,最终完成排序
*/
DateType temp;
int i, j;
for (i = 1; i <= L.n - 1; i++)
{
//逆序寻找插入位置,否则留置原位
if (L.data[i] < L.data[i - 1]) {
temp = L.data[i]; //暂存待插入元素
for (j = i - 1; j >= 0 && temp<L.data[j]; j--)
{
L.data[j + 1] = L.data[j]; //逆向寻找temp插入位置
}
L.data[j + 1] = temp; //插入
}
}
}
驱动测试
#include<stdio.h>
#include<cstdlib>
#include"StaticLinkList.h"
#include"DataList.h"
int main()
{
int elements[] = { 34,56,78,78,54,34 };
StaticLinkList staticLinkList;
CreateSList(staticLinkList, elements, sizeof(elements)/sizeof(elements[0]));
OutputSList(staticLinkList);
system("pause");
}
posted on 2019-04-26 18:06 Indian_Mysore 阅读(169) 评论(0) 编辑 收藏 举报