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、测试结果


五、课程设计总结

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


目录
相关文章
|
18天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
94 9
|
17天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
59 16
|
17天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
66 8
|
20天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
48 4
|
21天前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
54 3
|
21天前
|
存储 算法 C语言
C语言数据结构(2)
【10月更文挑战第21天】
|
20天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
39 0
|
9天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
19 1
|
12天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
15天前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。