数据结构-直接插入排序

迈不过友情╰ 2023-02-27 08:22 159阅读 0赞
  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<iostream>
  7. #define MaxSize 100
  8. #define ElemType int
  9. #define Status int
  10. using namespace std;
  11. //顺序表数据结构
  12. typedef struct
  13. {
  14. ElemType data[MaxSize];//顺序表元素
  15. int length; //顺序表当前长度
  16. }SqList;
  17. Status InitList(SqList &L)
  18. {
  19. memset(L.data,0,sizeof(L));//初始化数据为0
  20. L.length=0; //初始化长度为0
  21. return 0;
  22. }
  23. //创建顺序表函数 初始化前n个数据
  24. bool CreatList(SqList &L,int n)
  25. {
  26. if(n<0||n>MaxSize)false;//n非法
  27. for(int i=1;i<n+1;i++)//L[0]作为哨兵
  28. {
  29. scanf("%d",&L.data[i]);
  30. L.length++;
  31. }
  32. return true;
  33. }
  34. //插入函数 位置i插入数据 i及之后元素后移 1=<i<=length+1
  35. bool InsertList(SqList &L,int i,ElemType e)
  36. {
  37. if(i<1||i>L.length+1) //判断位置是否有效
  38. {
  39. printf("位置无效!!!\n");
  40. return false;
  41. }
  42. if(L.length+1>=MaxSize)//判断存储空间是否已满
  43. {
  44. printf("当前存储空间已满\n");
  45. return false;
  46. }
  47. for(int j=L.length+1;j>=i;j--)
  48. {
  49. L.data[j]=L.data[j-1];
  50. }
  51. L.data[i]=e;
  52. L.length++;
  53. return true;
  54. }
  55. int LocateElem(SqList L,ElemType e)
  56. {
  57. for(int i=1;i<L.length+1;i++)
  58. {
  59. if(L.data[i]==e)
  60. return i;
  61. }
  62. return 0;
  63. }
  64. void PrintList(SqList L)
  65. {
  66. printf("当前顺序表所有元素:");
  67. for(int i=1;i<L.length+1;i++)
  68. {
  69. printf("%d ",L.data[i]);
  70. }
  71. printf("\n");
  72. }
  73. //创建顺序表函数
  74. void Create(SqList &L)
  75. {
  76. int n;bool flag;
  77. printf("请输入要创建的顺序表长度(>1):");
  78. scanf("%d",&n);
  79. printf("请输入%d个数(空格隔开):",n);
  80. flag=CreatList(L,n);
  81. if(flag){
  82. printf("创建成功!\n");
  83. PrintList(L);
  84. }
  85. else printf("输入长度非法!\n");
  86. }
  87. void Insert(SqList &L)
  88. {
  89. int place;ElemType e;bool flag;
  90. printf("请输入要插入的位置(从1开始)及元素:\n");
  91. scanf("%d%d",&place,&e);
  92. flag=InsertList(L,place,e);
  93. if(flag)
  94. {
  95. printf("插入成功!!!\n");
  96. PrintList(L);
  97. }
  98. }
  99. //查找功能函数 调用LocateElem查找元素
  100. void Search(SqList L)
  101. {
  102. ElemType e;int flag;
  103. printf("请输入要查找的值:\n");
  104. scanf("%d",&e);
  105. flag=LocateElem(L,e);
  106. if(flag)
  107. {
  108. printf("该元素位置为:%d\n",flag);
  109. }
  110. else
  111. printf("未找到该元素!\n");
  112. }
  113. //直接插入排序 升序排序
  114. void InsertSort(SqList &L)
  115. {
  116. int temp;int i,j;
  117. for(int i=2;i<=L.length;i++)
  118. {
  119. if(L.data[i]<L.data[i-1])//比较有序表最后一个
  120. {
  121. L.data[0]=L.data[i];//放入哨兵中
  122. L.data[i]=L.data[i-1];
  123. for(j=i-2;L.data[0]<L.data[j];j--)//比较后移
  124. {
  125. L.data[j+1]=L.data[j];
  126. }
  127. L.data[j+1]=L.data[0];//哨兵入列
  128. }
  129. }
  130. PrintList(L);
  131. }
  132. //菜单
  133. void menu()
  134. {
  135. printf("********1.创建 2.直接插入排序*********\n");
  136. }
  137. int main()
  138. {
  139. SqList L;int choice;
  140. InitList(L);
  141. while(1)
  142. {
  143. menu();
  144. printf("请输入序号:\n");
  145. scanf("%d",&choice);
  146. if(7==choice) break;
  147. switch(choice)
  148. {
  149. case 1:Create(L);break;
  150. case 2:InsertSort(L);break;
  151. default:printf("输入错误!!!\n");
  152. }
  153. }
  154. return 0;
  155. }

发表评论

表情:
评论列表 (有 0 条评论,159人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数据结构--直接插入排序

    直接插入排序 概念 插入排序的基本思想是:在一个已排好序的记录子集的基础上,每一步将下一个待排序的记录有序地插入到已排好序的记录子集中,直到将所有待排记录全部插入为