第三周项目4-顺序表应用
2016-09-20 11:36
288 查看
问题描述及代码:
[cpp] view plain copy
1. /*
2. *烟台大学计控学院
3. *作 者:陈晓琳
4. *完成日期:2016年9月20日
5. *问题描述:定义一个采用顺序结构存储的线性表,设计算法完成下面的工作:
6. 1、删除元素在[x, y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1);
7. 2、将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1)。
8. */
1.删除元素在[x, y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1);
(1) list.h的代码
[cpp] view plain copy
1. #include<stdio.h>
2. #include<malloc.h>
3. #define MaxSize 50
4. typedef int ElemType;
5. typedef struct
6. {
7. ElemType data[MaxSize];
8. int length;
9. } SqList;
10. void CreateList(SqList *&L, ElemType a[], int n);//用数组创建线性表
11. void InitList(SqList *&L);//初始化线性表InitList(L)
12. void DestroyList(SqList *&L);//销毁线性表DestroyList(L)
13. bool ListEmpty(SqList *L);//判定是否为空表ListEmpty(L)
14. int ListLength(SqList *L);//求线性表的长度ListLength(L)
15. void DispList(SqList *L);//输出线性表DispList(L)
16. bool GetElem(SqList *L,int i,ElemType &e);//求某个数据元素值GetElem(L,i,e)
17. int LocateElem(SqList *L, ElemType e);//按元素值查找LocateElem(L,e)
18. bool ListInsert(SqList *&L,int i,ElemType e);//插入数据元素ListInsert(L,i,e)
19. bool ListDelete(SqList *&L,int i,ElemType &e);//删除数据元素ListDelete(L,i,e)
20. void delx2y(SqList *&L, ElemType x, ElemType y);
(2)list.cpp中的代码
[cpp] view plain copy
1. #include"list.h"
2. void delx2y(SqList *&L, ElemType x, ElemType y)
3. {
4. int k=0,i;//k记录非x的元素个数
5. ElemType t;
6. if(x>y)
7. {
8. t=x;
9. y=x;
10. y=t;
11. }
12. for(i=0;i<L->length;i++)
13. if(L->data[i]<x||L->data[i]>y)//复制不在[x,y]之间的数
14. {
15. L->data[k]=L->data[i];
16. k++;
17. }
18. L->length=k;
19. }
20.
21.
22.
23. //用数组创建线性表
24. void CreateList(SqList *&L, ElemType a[], int n)
25. {
26. int i;
27. L=(SqList *)malloc(sizeof(SqList));
28. for (i=0; i<n; i++)
29. L->data[i]=a[i];
30. L->length=n;
31. }
32.
33. //初始化线性表InitList(L)
34. void InitList(SqList *&L) //引用型指针
35. {
36. L=(SqList *)malloc(sizeof(SqList));
37. //分配存放线性表的空间
38. L->length=0;
39. }
40.
41. //销毁线性表DestroyList(L)
42. void DestroyList(SqList *&L)
43. {
44. free(L);
45. }
46.
47. //判定是否为空表ListEmpty(L)
48. bool ListEmpty(SqList *L)
49. {
50. return(L->length==0);
51. }
52.
53. //求线性表的长度ListLength(L)
54. int ListLength(SqList *L)
55. {
56. return(L->length);
57. }
58.
59. //输出线性表DispList(L)
60. void DispList(SqList *L)
61. {
62. int i;
63. if (ListEmpty(L)) return;
64. for (i=0; i<L->length; i++)
65. printf("%d ",L->data[i]);
66. printf("\n");
67. }
68.
69. //求某个数据元素值GetElem(L,i,e)
70. bool GetElem(SqList *L,int i,ElemType &e)
71. {
72. if (i<1 || i>L->length) return false;
73. e=L->data[i-1];
74. return true;
75. }
76.
77. //按元素值查找LocateElem(L,e)
78. int LocateElem(SqList *L, ElemType e)
79. {
80. int i=0;
81. while (i<L->length && L->data[i]!=e) i++;
82. if (i>=L->length) return 0;
83. else return i+1;
84. }
85.
86. //插入数据元素ListInsert(L,i,e)
87. bool ListInsert(SqList *&L,int i,ElemType e)
88. {
89. int j;
90. if (i<1 || i>L->length+1)
91. return false; //参数错误时返回false
92. i--; //将顺序表逻辑序号转化为物理序号
93. for (j=L->length; j>i; j--) //将data[i..n]元素后移一个位置
94. L->data[j]=L->data[j-1];
95. L->data[i]=e; //插入元素e
96. L->length++; //顺序表长度增1
97. return true; //成功插入返回true
98. }
99.
100. //删除数据元素ListDelete(L,i,e)
101. bool ListDelete(SqList *&L,int i,ElemType &e)
102. {
103. int j;
104. if (i<1 || i>L->length) //参数错误时返回false
105. return false;
106. i--; //将顺序表逻辑序号转化为物理序号
107. e=L->data[i];
108. for (j=i; j<L->length-1; j++) //将data[i..n-1]元素前移
109. L->data[j]=L->data[j+1];
110. L->length--; //顺序表长度减1
111. return true; //成功删除返回true
112. }
(3)main.cpp的代码
[cpp] view plain copy
1. #include"list.h"
2. int main()
3. {
4. SqList *sq;
5. ElemType a[10]= {5,8,7,0,2,4,9,6,7,3};
6. CreateList(sq, a, 10);
7. printf("删除前 ");
8. DispList(sq);
9.
10. delx2y(sq, 4, 7);
11.
12. printf("删除后 ");
13. DispList(sq);
14. return 0;
15. }
运行结果:
<img src="http://img.blog.csdn.net/20160918112614980?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
2、将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1)。
(1)move.cpp中的代码
[cpp] view plain copy
1. #include"list.h"
2. void move(SqList *&L)
3. {
4. int i=0,j=L->length-1;
5. ElemType tmp;
6. while (i<j)
7. {
8. while ((i<j) && (L->data[j]%2==0)) //从右往左,找到第一个奇数(偶数就忽略不管)
9. j--;
10. while ((i<j) && (L->data[i]%2==1)) //从左往右,找到第一个偶数(奇数就忽略不管)
11. i++;
12. if (i<j) //如果未到达“分界线”,将右边的奇数和左边的偶数交换
13. {
14. tmp=L->data[i];
15. L->data[i]=L->data[j];
16. L->data[j]=tmp;
17. }
18. } //待循环上去后,继续查找,并在必要时交换
19. }
(2)main.cpp的代码
[cpp] view plain copy
1. #include"list.h"
2. int main()
3. {
4. SqList *sq;
5. ElemType a[10]= {5,8,7,0,2,4,9,6,7,3};
6. CreateList(sq, a, 10);
7. printf("操作前 ");
8. DispList(sq);
9.
10. move(sq);
11.
12. printf("操作后 ");
13. DispList(sq);
14. return 0;
15. }
运行结果:
<img src="http://img.blog.csdn.net/20160918112618298?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
知识点总结:
利用程库的多文件组织让此程序变得不再复杂,建立新变量将x与y进行交换,最后将删除后的信息重新排序输出,这是删除数字
奇偶数排列则是从右到左和从左到右对奇偶数分别排列,最后当i<j时同样也是引入新变量将数组进行交换。
学习心得:
以后的学习路上还是要多多总结
[cpp] view plain copy
1. /*
2. *烟台大学计控学院
3. *作 者:陈晓琳
4. *完成日期:2016年9月20日
5. *问题描述:定义一个采用顺序结构存储的线性表,设计算法完成下面的工作:
6. 1、删除元素在[x, y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1);
7. 2、将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1)。
8. */
1.删除元素在[x, y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1);
(1) list.h的代码
[cpp] view plain copy
1. #include<stdio.h>
2. #include<malloc.h>
3. #define MaxSize 50
4. typedef int ElemType;
5. typedef struct
6. {
7. ElemType data[MaxSize];
8. int length;
9. } SqList;
10. void CreateList(SqList *&L, ElemType a[], int n);//用数组创建线性表
11. void InitList(SqList *&L);//初始化线性表InitList(L)
12. void DestroyList(SqList *&L);//销毁线性表DestroyList(L)
13. bool ListEmpty(SqList *L);//判定是否为空表ListEmpty(L)
14. int ListLength(SqList *L);//求线性表的长度ListLength(L)
15. void DispList(SqList *L);//输出线性表DispList(L)
16. bool GetElem(SqList *L,int i,ElemType &e);//求某个数据元素值GetElem(L,i,e)
17. int LocateElem(SqList *L, ElemType e);//按元素值查找LocateElem(L,e)
18. bool ListInsert(SqList *&L,int i,ElemType e);//插入数据元素ListInsert(L,i,e)
19. bool ListDelete(SqList *&L,int i,ElemType &e);//删除数据元素ListDelete(L,i,e)
20. void delx2y(SqList *&L, ElemType x, ElemType y);
(2)list.cpp中的代码
[cpp] view plain copy
1. #include"list.h"
2. void delx2y(SqList *&L, ElemType x, ElemType y)
3. {
4. int k=0,i;//k记录非x的元素个数
5. ElemType t;
6. if(x>y)
7. {
8. t=x;
9. y=x;
10. y=t;
11. }
12. for(i=0;i<L->length;i++)
13. if(L->data[i]<x||L->data[i]>y)//复制不在[x,y]之间的数
14. {
15. L->data[k]=L->data[i];
16. k++;
17. }
18. L->length=k;
19. }
20.
21.
22.
23. //用数组创建线性表
24. void CreateList(SqList *&L, ElemType a[], int n)
25. {
26. int i;
27. L=(SqList *)malloc(sizeof(SqList));
28. for (i=0; i<n; i++)
29. L->data[i]=a[i];
30. L->length=n;
31. }
32.
33. //初始化线性表InitList(L)
34. void InitList(SqList *&L) //引用型指针
35. {
36. L=(SqList *)malloc(sizeof(SqList));
37. //分配存放线性表的空间
38. L->length=0;
39. }
40.
41. //销毁线性表DestroyList(L)
42. void DestroyList(SqList *&L)
43. {
44. free(L);
45. }
46.
47. //判定是否为空表ListEmpty(L)
48. bool ListEmpty(SqList *L)
49. {
50. return(L->length==0);
51. }
52.
53. //求线性表的长度ListLength(L)
54. int ListLength(SqList *L)
55. {
56. return(L->length);
57. }
58.
59. //输出线性表DispList(L)
60. void DispList(SqList *L)
61. {
62. int i;
63. if (ListEmpty(L)) return;
64. for (i=0; i<L->length; i++)
65. printf("%d ",L->data[i]);
66. printf("\n");
67. }
68.
69. //求某个数据元素值GetElem(L,i,e)
70. bool GetElem(SqList *L,int i,ElemType &e)
71. {
72. if (i<1 || i>L->length) return false;
73. e=L->data[i-1];
74. return true;
75. }
76.
77. //按元素值查找LocateElem(L,e)
78. int LocateElem(SqList *L, ElemType e)
79. {
80. int i=0;
81. while (i<L->length && L->data[i]!=e) i++;
82. if (i>=L->length) return 0;
83. else return i+1;
84. }
85.
86. //插入数据元素ListInsert(L,i,e)
87. bool ListInsert(SqList *&L,int i,ElemType e)
88. {
89. int j;
90. if (i<1 || i>L->length+1)
91. return false; //参数错误时返回false
92. i--; //将顺序表逻辑序号转化为物理序号
93. for (j=L->length; j>i; j--) //将data[i..n]元素后移一个位置
94. L->data[j]=L->data[j-1];
95. L->data[i]=e; //插入元素e
96. L->length++; //顺序表长度增1
97. return true; //成功插入返回true
98. }
99.
100. //删除数据元素ListDelete(L,i,e)
101. bool ListDelete(SqList *&L,int i,ElemType &e)
102. {
103. int j;
104. if (i<1 || i>L->length) //参数错误时返回false
105. return false;
106. i--; //将顺序表逻辑序号转化为物理序号
107. e=L->data[i];
108. for (j=i; j<L->length-1; j++) //将data[i..n-1]元素前移
109. L->data[j]=L->data[j+1];
110. L->length--; //顺序表长度减1
111. return true; //成功删除返回true
112. }
(3)main.cpp的代码
[cpp] view plain copy
1. #include"list.h"
2. int main()
3. {
4. SqList *sq;
5. ElemType a[10]= {5,8,7,0,2,4,9,6,7,3};
6. CreateList(sq, a, 10);
7. printf("删除前 ");
8. DispList(sq);
9.
10. delx2y(sq, 4, 7);
11.
12. printf("删除后 ");
13. DispList(sq);
14. return 0;
15. }
运行结果:
<img src="http://img.blog.csdn.net/20160918112614980?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
2、将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1)。
(1)move.cpp中的代码
[cpp] view plain copy
1. #include"list.h"
2. void move(SqList *&L)
3. {
4. int i=0,j=L->length-1;
5. ElemType tmp;
6. while (i<j)
7. {
8. while ((i<j) && (L->data[j]%2==0)) //从右往左,找到第一个奇数(偶数就忽略不管)
9. j--;
10. while ((i<j) && (L->data[i]%2==1)) //从左往右,找到第一个偶数(奇数就忽略不管)
11. i++;
12. if (i<j) //如果未到达“分界线”,将右边的奇数和左边的偶数交换
13. {
14. tmp=L->data[i];
15. L->data[i]=L->data[j];
16. L->data[j]=tmp;
17. }
18. } //待循环上去后,继续查找,并在必要时交换
19. }
(2)main.cpp的代码
[cpp] view plain copy
1. #include"list.h"
2. int main()
3. {
4. SqList *sq;
5. ElemType a[10]= {5,8,7,0,2,4,9,6,7,3};
6. CreateList(sq, a, 10);
7. printf("操作前 ");
8. DispList(sq);
9.
10. move(sq);
11.
12. printf("操作后 ");
13. DispList(sq);
14. return 0;
15. }
运行结果:
<img src="http://img.blog.csdn.net/20160918112618298?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
知识点总结:
利用程库的多文件组织让此程序变得不再复杂,建立新变量将x与y进行交换,最后将删除后的信息重新排序输出,这是删除数字
奇偶数排列则是从右到左和从左到右对奇偶数分别排列,最后当i<j时同样也是引入新变量将数组进行交换。
学习心得:
以后的学习路上还是要多多总结
相关文章推荐
- 第三周—项目4 顺序表应用
- 第三周项目4—顺序表应用
- 第三周项目4--顺序表应用1
- 第三周-项目4 - 顺序表应用
- 第三周项目4-顺序表应用 将所有奇数移到偶数前面
- 第三周项目4—顺序表应用问题(1)
- 第三周【项目四-顺序表应用】
- 第三周 项目4-顺序表应用2
- 第三周 项目4-顺序表应用
- 第三周——【项目4 - 顺序表应用】
- 第三周项目4——顺序表应用问题2
- 第三周项目4--顺序表应用
- 第三周项目4--顺序表应用2
- 第三周—项目4 顺序表应用
- 第三周——【项目 - 顺序表应用】
- 第三周项目4(1)-顺序表应用 删除区间【x,y】内的元素
- 第三周项目4——顺序表应用1
- 第三周项目4 - 顺序表应用
- 第三周项目4-顺序表应用 删除【x,z】之间的元素
- 第三周 项目四 【顺序表应用 2】