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<stdio.h>
#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-1].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<i;j++)
printf("%4d",R[j].key);
printf("\n排序\n");
D_Insert(R,i-1); //進行直接插入排序
printf(“輸出直接插入排序后的結果:\n”);
for(j=1;j<i;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<i;j++)
printf("%4d",R[j].key);
printf("\n排序\n");
B_InsertSort(R,i-1); //進行折半插入排序
printf("\n輸出折半插入排序后的結果:\n");
for(j=1;j<i;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<n;i++) //進行n-1趟排序
{
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<i;j++)
printf("%4d",R[j].key);
BubbleSort(R,i-1); //進行冒泡排序
printf("\n輸出冒泡排序后的結果\n");
for(j=1;j<i;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<j) //從表(即序列R[i]~R[j])兩端交替向中間掃描
{
while (i<j&&R[j].key>=R[0].key)
//(從右向左掃描查找第一個關鍵字小于R[0].key時將R[0].key的記錄R[j]
j–;
if(i<j) //當i<j且R[j].key小于R[0].key時將R[j]交換到表的左端
{
R[i]=R[j];
i++;
}
while (i<j&&R[i].key<=R[0].key)
//從左到右掃描查找第一個關鍵字大于R[0].key的記錄R[i]
i++;
if(i<j) //當i<j且R[i].key大于R[0].key時將R[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<t)
{
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<i;j++)
printf("%4d",R[j].key);
QuickSort(R,1,i-1); //進行快速排序
printf("\n輸入快速排序后的結果:\n");
for (j=1;j<i;j++)
printf("%4d", R[j].key);
printf("\n");
}
//選擇排序
void SelectSort(RecordType R[], int n)
{
int i,j,k;
for (i=1;i<n;i++) //進行n-1趟選擇
{
k=i; //假設關鍵字最小的記錄為第i個記錄
for(j=i+1;j<=n;j++)//從第i個記錄開始的n-i+1個無序記錄中選出關鍵字最小的記錄
if(R[j].key<R[k].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<t&&R[j].key<R[j+1].key)
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<i;j++)
printf("%4d",R[j].key);
printf("\nSort:\n");
HeapSort(R,i-1); //進行堆排序
printf("\n輸出堆排序后的結果:\n");
for(j=1;j<i;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、測試結果
五、課程設計總結
雖然這次課程是那么短暫的倆周時間,我感覺到這些天我的所學勝過我這一學期所學,這次任務原則上是設計,其實就是一次大的作業,是讓我對課本知識的鞏固和對基本概念的熟悉和應用,使我做事的耐心和仔細程度得以提高。課程設計是培訓學生運用本專業所學的理論知識和專業知識來分析解決實際問題的重要環節,是對所學知識的復習和鞏固。因此,我們必須認真、謹慎、踏實、一步一步的完成設計。此次設計讓我明白了一個很深刻的道理:團隊精神固然很重要,但人往往還是要靠自己的努力,自己親身去經歷,這樣自己的心里才會踏實, 學到的東西才會更多。
總結
以上是生活随笔為你收集整理的C语言数据结构课程设计(可运行)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工作74:vue带参数跳转其他页面
- 下一篇: 工作76::一直报400