第3周项目4-顺序表应用问题(2)
来源:互联网 发布:js修改字体颜色 编辑:程序博客网 时间:2024/06/07 02:50
问题及代码:
/* *Copyright (c)2016,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:项目4.cbp *作 者:陈光辉 *完成日期:2016年9月18日 *版 本 号:v1.0 * *问题描述:将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1)。 *输入描述:无 *程序输出:输出调整后的线性表 */
list.h
- #ifndef LIST_H_INCLUDED
- #define LIST_H_INCLUDED
- #define MaxSize 50
- #include <stdio.h>
- #include <malloc.h>
- typedef int ElemType;
- typedef struct
- {
- ElemType data[MaxSize];
- int length;
- } SqList;
- void CreateList(SqList *&L, ElemType a[], int n);//用数组创建线性表
- void InitList(SqList *&L);//初始化线性表InitList(L)
- void DestroyList(SqList *&L);//销毁线性表DestroyList(L)
- bool ListEmpty(SqList *L);//判定是否为空表ListEmpty(L)
- int ListLength(SqList *L);//求线性表的长度ListLength(L)
- void DispList(SqList *L);//输出线性表DispList(L)
- bool GetElem(SqList *L,int i,ElemType &e);//求某个数据元素值GetElem(L,i,e)
- int LocateElem(SqList *L, ElemType e);//按元素值查找LocateElem(L,e)
- bool ListInsert(SqList *&L,int i,ElemType e);//插入数据元素ListInsert(L,i,e)
- bool ListDelete(SqList *&L,int i,ElemType &e);//删除数据元素ListDelete(L,i,e)#endif // LIST_H_INCLUDED
- #endif
- 功能函数文件list.cpp代码:
- #include "list.h"
- //用数组创建线性表
- void CreateList(SqList *&L, ElemType a[], int n)
- {
- int i;
- L=(SqList *)malloc(sizeof(SqList));
- for (i=0; i<n; i++)
- L->data[i]=a[i];
- L->length=n;
- }
- //初始化线性表InitList(L)
- void InitList(SqList *&L) //引用型指针
- {
- L=(SqList *)malloc(sizeof(SqList));
- //分配存放线性表的空间
- L->length=0;
- }
- //销毁线性表DestroyList(L)
- void DestroyList(SqList *&L)
- {
- L=(SqList *)malloc(sizeof(SqList));
- free(L);
- }
- //判定是否为空表ListEmpty(L)
- bool ListEmpty(SqList *L)
- {
- return(L->length==0);
- }
- //求线性表的长度ListLength(L)
- int ListLength(SqList *L)
- {
- return(L->length);
- }
- //输出线性表DispList(L)
- void DispList(SqList *L)
- {
- int i;
- if (ListEmpty(L)) return;
- for (i=0; i<L->length; i++)
- printf("%d ",L->data[i]);
- printf("\n");
- }
- //求某个数据元素值GetElem(L,i,e)
- bool GetElem(SqList *L,int i,ElemType &e)
- {
- if (i<1 || i>L->length) return false;
- e=L->data[i-1];
- return true;
- }
- //按元素值查找LocateElem(L,e)
- int LocateElem(SqList *L, ElemType e)
- {
- int i=0;
- while (i<L->length && L->data[i]!=e) i++;
- if (i>=L->length) return 0;
- else return i+1;
- }
- //插入数据元素ListInsert(L,i,e)
- bool ListInsert(SqList *&L,int i,ElemType e)
- {
- int j;
- if (i<1 || i>L->length+1)
- return false; //参数错误时返回false
- i--; //将顺序表逻辑序号转化为物理序号
- for (j=L->length; j>i; j--) //将data[i..n]元素后移一个位置
- L->data[j]=L->data[j-1];
- L->data[i]=e; //插入元素e
- L->length++; //顺序表长度增1
- return true; //成功插入返回true
- }
- //删除数据元素ListDelete(L,i,e)
- bool ListDelete(SqList *&L,int i,ElemType &e)
- {
- int j;
- if (i<1 || i>L->length) //参数错误时返回false
- return false;
- i--; //将顺序表逻辑序号转化为物理序号
- e=L->data[i];
- for (j=i; j<L->length-1; j++) //将data[i..n-1]元素前移
- L->data[j]=L->data[j+1];
- L->length--; //顺序表长度减1
- return true; //成功删除返回true
- }
- 测试文件main.cpp代码:
- #include "list.h"
- #include <stdio.h>
- //移动结束后,奇数居左,偶数居右
- void move(SqList *&L)
- {
- int i=0,j=L->length-1;
- ElemType tmp;
- while (i<j)
- {
- while ((i<j) && (L->data[j]%2==0)) //从右往左,找到第一个奇数(偶数就忽略不管)
- j--;
- while ((i<j) && (L->data[i]%2==1)) //从左往右,找到第一个偶数(奇数就忽略不管)
- i++;
- if (i<j) //如果未到达“分界线”,将右边的奇数和左边的偶数交换
- {
- tmp=L->data[i];
- L->data[i]=L->data[j];
- L->data[j]=tmp;
- }
- } //待循环上去后,继续查找,并在必要时交换
- }
- //用main写测试代码
- int main()
- {
- SqList *sq;
- ElemType a[12]= {2,0,1,4,5,8,5,0,6,1,1,4};
- CreateList(sq, a, 12);
- printf("操作前 ");
- DispList(sq);
- move(sq);
- printf("操作后 ");
- DispList(sq);
- return 0;
- }
知识点总结:
对move函数的实现是这个程序的关键,考察了我们对具体问题的求解方法。
学习心得:
“分界线”的理解刚刚开始是困难的,但是我还是在纸上模拟程序运行结果,这个方法有助于我理解了程序。
0 0
- 第3周项目4-顺序表应用问题(2)
- 第3周项目4-顺序表应用问题(2)
- 第3周SHH数据结构—【项目4-顺序表应用问题(2)】
- 第3周项目4 顺序表应用问题(2)
- 第3周项目4—顺序表应用问题(2)
- 第3周项目4-顺序表应用问题(2)
- 第3周项目4-顺序表应用问题(2)
- 第3周【项目4-顺序表应用问题(2) 】
- 第3周项目4-顺序表应用问题(2)
- 第3周项目4- 顺序表应用(2)
- 第3周 项目4-顺序表应用(2)
- 第3周项目4 顺序表应用(2)
- 第3周 项目4 - 顺序表应用(2)
- 第3周项目4-顺序表应用(2)
- 第3周项目4 顺序表应用(2)
- 第3周项目4-顺序表应用问题(1)
- 第3周SHH数据结构—【项目4-顺序表应用问题(1)】
- 第3周项目4 顺序表应用问题(1)
- 【C++自学之旅】MFC计算器设计
- Leetcode第五周周赛
- 复用代码,接口扩展(自定义poupwindow)
- android中子线程访问UI组件
- 黑客教程:自建钓鱼网站入侵Gmail账户
- 第3周项目4-顺序表应用问题(2)
- 以此纪念我的第一个博客
- Android root-tools
- Is Subsequence
- 如何在shell脚本里传递一个变量给awk
- Android KeyboardListener键盘
- 南海实验中学模拟赛1(学生出题)解题报告
- Java基础学习总结(63)——Java集合总结
- 工具推荐 10款用过都说好的移动界面原型设计工具