您的位置:首页 > 其它

第三周项目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时同样也是引入新变量将数组进行交换。  

学习心得:  

以后的学习路上还是要多多总结
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: