C语言数据结构课程设计(可运行)

简介: C语言数据结构课程设计(可运行)

本文章为课程设计全部内容

目录(根据自己的设计更改页数)


1、 任务设计……………………………………2


2、 代码说明……………………………………3


3、 代码清单……………………………………18


4、 代码测试……………………………………18


5、 课程设计总结……………………………19


一、任务设计

1、 设计题目

题目: 数据结构排序实践


2、 课程设计目的

目的:排序时计算机程序设计中的一种重要操作,其功能时按照记录集合中每个记录的关键字之间所存在递增或递减关系,将该集合中的记录次序重新排列。

3、 基本思想

插入排序:包括直接插入排序、折半插入排序、希尔(Shell)排序。将记录集合分为有序和无序俩个序列。从无序序列中任取一个记录,然后根据该记录的关键字大小在有序序列中查找一个合适的位置,使得该记录放入这个位置后,这个有序序列仍然保持有序。每插入一个记录称为一趟插入排序,经过多趟插入排序,使得无序序列中的记录全部插入到有序序列中,则排序完成。

交换排序:包括冒泡排序、快速排序。交换排序是通过交换记录中的位置来实现排序的。俩俩比较待排序记录的关键字,一旦发现俩个记录的次序与排序要求相逆则交换这俩个记录的位置,直到表中没有逆序的记录存在为止。

选择排序:包括直接选择排序、堆排序。每一趟从待排序记录中选取关键字最小的记录,并顺序放在已排好序的记录序列的最后,直到全部记录排序完成为止。

4、 使用编译环境

软件:Visual C++ 2010 Express

5、 主要功能:

使用多种方法进行排序(从小到大)。


二、代码说明

Interposition插入排序、Binary_insert折半插入排序、Bubbing冒泡排序、Speediness快速排序、Select/选择排序、Pile堆排序、select选择、MAXSIZE记录类型数组、key关键字项、data其他数据项、RecordType记录类型、D_Insert直接插入排序函数、B_InsertSort折半插入排序函数、BubbleSort冒泡排序函数、Partition划分算法、QuickSort快速排序函数、SelectSort选择排序函数、


三、代码清单

#include
#define MAXSIZE 30
typedef struct
{
int key;//关键字项
char data;//其他数据项
}RecordType;//记录类型
//插入排序
void D_Insert(RecordType R[],int n)
{ //对n个记录序列R[1]~R[n]进行直接插入排序
int i,j;
for(i=2;i<=n;i++) //进行n-1趟排序
if(R[i].key
{//R[i].key小于R[i-].key时,需将R[i]插入到有序序列R[1]~R[i-1]中
R[0]=R[i];//设置查找监视哨R[0]并保存待插入记录R[i]值
j=i-1; //j定位于有序序列的最后一个记录R[i-1]处
while(R[j].key>R[0].key)//在有序序列中寻找R[i]的插入位置
{/将有序序列中关键字值大于R[i].key(即此刻的R[0].key)的所有Rj
由后向前顺序后移一个记录位置/
R[j+1]=R[j];
j–;
}
R[j+1]=R[0]; //将Ri插入到有序序列中应插位置上
}
}
void Interposition()
{
int i=1,j,x;
RecordType R[MAXSIZE];//定义记录类型数组R
printf(“输入所需排序的值直至-1结束:\n”);
scanf("%d",&x);
while(x!=-1)
{
R[i].key=x;
scanf("%d",&x);
i++;
}
printf(“输出表中记录的字:\n”);
for(j=1;j
printf("%4d",R[j].key);
printf("\n排序\n");
D_Insert(R,i-1); //进行直接插入排序
printf(“输出直接插入排序后的结果:\n”);
for(j=1;j
printf("%4d",R[j].key);
printf("\n");
}
//折半插入排序
void B_InsertSort(RecordType R[],int n)
{ //对n个记录序列R[1]~R[n]进行折半插入排序
int i,j,low,high,mid;
for(i=2;i<=n;i++) //进行n-1趟排序
{
R[0]=R[i]; //设置查找监视哨R[0]并保存待插入记录的R[i]值
low=1,high=i-1;//设置初始化查找区间
while(low<=high)//寻找插入位置
{
mid=(low+high)/2;
if(R[0].key>R[mid].key)
low=mid+1;//插入位置在右半区
else
high=mid-1;//插入位置在左半区
}
for(j=i-1;j>=high;j–)
/high+1为插入位置,将R[i-1],R[i-2],…,R[high+1]顺序后移一个位置R[j+1]=R[j]/
R[high+1]=R[0];//将Ri放入应插入位置high+1
}
}
void Binary_insert()
{
int i=1,j,x;
RecordType R[MAXSIZE];//定义记录类型数组R
printf(“输入所需排序的值直至-1结束:\n”);
scanf("%d",&x);
while(x!=-1)
{
R[i].key=x;
scanf("%d",&x);
i++;
}
printf(“输出表中记录的关键字:\n”);
for(j=1;j
printf("%4d",R[j].key);
printf("\n排序\n");
B_InsertSort(R,i-1); //进行折半插入排序
printf("\n输出折半插入排序后的结果:\n");
for(j=1;j
printf("%4d",R[j].key);
printf("\n");
}
//冒泡排序
void BubbleSort(RecordType R[],int n)
{ //对R[1]~R[n]这n个记录进行冒泡排序
int i,j,swap;
for(i=1;i
{
swap=0; //设置未发生交换标志
for(j=1;j<=n-i;j++) //R[1]~R[n-i]记录进行俩俩比较
if(R[j].key>R[j+1].key)
//如果R[j].key大于R[j+1].key,则交换R[j]和R[j+1]
{
R[0]=R[j];
R[j]=R[j+1];
R[j+1]=R[0];
swap=1;//有交换发生
}
if(swap==0)
break; //本躺比较中未出现交换,则结束排序(序已排好)
}
}
void Bubbing()
{
int i=1,j,x;
RecordType R[MAXSIZE];//定义记录类型数组R
printf(“输入你要进行排序的数字直到-1结束:\n”);
scanf("%d",&x);
while(x!=-1)
{
R[i].key=x;
scanf("%d",&x);
i++;
}
printf(“输出表中各记录的关键字:\n”);
for(j=1;j
printf("%4d",R[j].key);
BubbleSort(R,i-1); //进行冒泡排序
printf("\n输出冒泡排序后的结果\n");
for(j=1;j
printf("%4d",R[j].key);
printf("\n");
}
//快速排序
int Partition(RecordType R[], int i, int j)//划分算法
{ //对R[i]~R[j], 以R1为基准记录进行划分并返回划分后R[i]的正确位置
R[0]=R[i]; //暂存基准记录R[i]于R[0]
while(i
{
while (i=R[0].key)
//(从右向左扫描查找第一个关键字小于R[0].key时将R[0].key的记录R[j]
j–;
if(i
{
R[i]=R[j];
i++;
}
while (i
//从左到右扫描查找第一个关键字大于R[0].key的记录R[i]
i++;
if(i
{
R[j]=R[i];
j–;
}
}
R[i]=R[0];//将基准记录R[O]送入最终(指排好序时)应放置的位置
return i; //返回基准记录R[O]最终放置的位置
}
void QuickSort(RecordType R[], int s, int t)
{ //进行快速排序
int i;
if(s
{
i=Partition(R,s,t);//i为基准记录的位置并由此将表分为R[s]~R[i - 1]和R[i + 1]~R[t]两部分
QuickSort(R,s,i-1);//对表R[s]~R[i-1]进行快速排序
QuickSort(R,i+1,t);//对表R[i+1]~R[t]进行快速排序
}
}
void Speediness()
{
int i=1,j,x;
RecordType R[MAXSIZE];//定义记录类型数组R
printf(“输入所需要排序的数据直到输入-1结束:\n”);
scanf("%d",&x);
while(x!=-1)
{
R[i].key=x;
scanf("%d",&x);
i++;
}
printf(“输出表中各记录的关键字:\n”);
for(j=1;j
printf("%4d",R[j].key);
QuickSort(R,1,i-1); //进行快速排序
printf("\n输入快速排序后的结果:\n");
for (j=1;j
printf("%4d", R[j].key);
printf("\n");
}
//选择排序
void SelectSort(RecordType R[], int n)
{
int i,j,k;
for (i=1;i
{
k=i; //假设关键字最小的记录为第i个记录
for(j=i+1;j<=n;j++)//从第i个记录开始的n-i+1个无序记录中选出关键字最小的记录
if(R[j].key
k=j; //保存最小关键字记录的存放位置
if (i!=k) //将找到的最小关键字记录与第i个记录交换
{
R[0]=R[k];
R[k]=R[i];
R[i]=R[0];
}
}
}
void Select()
{
int i=1,j,x;
RecordType R[MAXSIZE]; //定义记录类型数组R
printf(“输入需要排序的数据直到输入-1结束:\n”);
scanf("%d", &x);
while(x!=-1)
{
R[i].key = x;
scanf("%d", &x);
i++;
}
printf(“输出表中各记录的关键字:\n”);
for (j = 1; j < i; j++)
printf("%4d", R[j].key);
printf("\n排序:\n");
SelectSort(R,i-1); //进行选择排序
printf("\n输出选择排序后的结果 : \n");
for (j = 1; j < i; j++)
printf("%4d", R[j].key);
printf("\n");
}
//堆排序
void HeapAdjust(RecordType R[], int s, int t)//基于大根堆的堆排序
{ /对R[s]~R[t]除R[s]外均满足堆的定义, 即只对Rs进行调整,
使R[s]为根的完全二叉树成为一个堆/
int i,j;
R[0]=R[s]; //R[s]暂存于R[0]
i=s;
for(j=2i;j<=t;j=2j)//沿关键字较大的孩子向下调整, 先假定为左孩子
{
if(j
j = j + 1;//右孩子结点的关键字大则沿右孩子向下调整
if(R[0].key>R[j].key)//即已满足堆的定义, 故不再向下调整
break;
R[i]=R[j];//将关键字大的孩子结点R[j]调整至双亲结点R[i]
i=j; //定位于孩子结点继续向下调整
}
R[i]=R[0];//找到满足堆定义的R[0](即R[s]放置位置i, 将R[s]调整于此
}
void HeapSort(RecordType R[], int n)
{ //对R[1]~R[n]这n个记录进行堆排序
int i;
for(i=n/2;i>0;i–)
//将完全二叉树非终端结点按R[n/2,R[n/2-1,…, R[1]的顺序建立初始堆
HeapAdjust(R,i,n);
for(i=n;i>1;i–) //对初始堆进行n-1趟堆排序
{
R[0] = R[1]; //堆顶的R[1]与堆底的R[i]交换
R[1] = R[i];
R[i] = R[0];
HeapAdjust(R, 1, i - 1);//将未排序的前i-1个的点重新调整为堆
}
}
void Pile()
{
int i = 1,j,x;
RecordType R[MAXSIZE]; //定义记录类型数组R
printf(“输入需要排序的数据直到结束输入-1:\n”);
scanf("%d",&x);
while(x!=-1)
{
R[i].key=x;
scanf("%d",&x);
i++;
}
printf(“输出表中各记录的关键字:\n”);
for(j=1;j
printf("%4d",R[j].key);
printf("\nSort:\n");
HeapSort(R,i-1); //进行堆排序
printf("\n输出堆排序后的结果:\n");
for(j=1;j
printf("%4d",R[j].key);
printf("\n");
}
int main()
{
int select; //选择
//首界面
{
printf("\n数据结构排序实践\n");
printf(" 1、插入排序\n");
printf(" 2、折半插入排序\n");
printf(" 3、冒泡排序\n");
printf(" 4、快速排序\n");
printf(" 5、选择排序\n");
printf(" 6、堆排序\n");
printf("***请选择(1-6)😊;
scanf("%d",&select);
getchar();
switch (select)
{
case 1:Interposition(); //插入排序
break;
case 2:Binary_insert(); //折半插入排序
break;
case 3:Bubbing(); //冒泡排序
break;
case 4:Speediness(); //快速排序
break;
case 5:Select(); //选择排序
break;
case 6:Pile(); //堆排序
break;
}
}
}

四、代码测试

1、测试数据

选项1:输入关键字8 9 5 6 4 2 3 19

选项2:输入关键字5 9 3 4 6 12 21 36 19 41

选项3:输入关键字5 3 6 1 2 9 19 21 12 23

选项4:输入关键字5 9 7 6 1 2 4 3 12 133 21

选项4:输入关键字5 12 2 3 4 1 6 9 8 7

选项4:输入关键字5 2 1 4 3 6 9 8 7 12 21 13


###2、测试结果


五、课程设计总结

虽然这次课程是那么短暂的俩周时间,我感觉到这些天我的所学胜过我这一学期所学,这次任务原则上是设计,其实就是一次大的作业,是让我对课本知识的巩固和对基本概念的熟悉和应用,使我做事的耐心和仔细程度得以提高。课程设计是培训学生运用本专业所学的理论知识和专业知识来分析解决实际问题的重要环节,是对所学知识的复习和巩固。因此,我们必须认真、谨慎、踏实、一步一步的完成设计。此次设计让我明白了一个很深刻的道理:团队精神固然很重要,但人往往还是要靠自己的努力,自己亲身去经历,这样自己的心里才会踏实, 学到的东西才会更多。


目录
相关文章
|
12天前
|
存储 算法 C语言
通义灵码在考研C语言和数据结构中的应用实践 1-5
通义灵码在考研C语言和数据结构中的应用实践,体验通义灵码的强大思路。《趣学C语言和数据结构100例》精选了五个经典问题及其解决方案,包括求最大公约数和最小公倍数、统计字符类型、求特殊数列和、计算阶乘和双阶乘、以及求斐波那契数列的前20项和。通过这些实例,帮助读者掌握C语言的基本语法和常用算法,提升编程能力。
|
1天前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
10 3
|
1天前
|
存储 算法 C语言
C语言数据结构(2)
【10月更文挑战第21天】
|
12天前
|
存储 算法 C语言
【趣学C语言和数据结构100例】
《趣学C语言和数据结构100例》精选5个编程问题,涵盖求最大公约数与最小公倍数、字符统计、特殊序列求和及阶乘计算等,通过实例讲解C语言基础与算法思维,适合初学者实践学习。
|
22天前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
18 2
|
2月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
287 8
|
2月前
|
C语言
数据结构基础详解(C语言):图的基本概念_无向图_有向图_子图_生成树_生成森林_完全图
本文介绍了图的基本概念,包括图的定义、无向图与有向图、简单图与多重图等,并解释了顶点度、路径、连通性等相关术语。此外还讨论了子图、生成树、带权图及几种特殊形态的图,如完全图和树等。通过这些概念,读者可以更好地理解图论的基础知识。
|
2月前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
2月前
|
存储 算法 C语言
C语言手撕数据结构代码_顺序表_静态存储_动态存储
本文介绍了基于静态和动态存储的顺序表操作实现,涵盖创建、删除、插入、合并、求交集与差集、逆置及循环移动等常见操作。通过详细的C语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
19天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
30 3