第三周项目四
来源:互联网 发布:淘宝号交易平台 编辑:程序博客网 时间:2024/05/16 10:34
问题及代码
/*Copyright(c)2015,烟台大学计算机学院 *All right reserved. *文件名称:线性表删除元素.cpp *作者:李浩 *完成日期;2015年9月15日 *版本号;v1.0 * *问题描述: 定义一个采用顺序结构存储的线性表,设计算法完成下面的工作: 删除元素在[x, y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1);
将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1)。 *输入描述:删除前的信息 *程序输出:删除后的信息*/#include <stdio.h>#include <malloc.h>#define MaxSize 50typedef 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//用数组创建线性表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){ 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}void delx2y(SqList *&L, ElemType x, ElemType y){ int k=0,i; ElemType t; if(x>y) { t=x; x=y; y=t; } for (i=0; i<L->length; i++) if (L->data[i]<x || L->data[i]>y ) { L->data[k]=L->data[i]; k++; } L->length=k;}int main(){ SqList *sq; ElemType a[10]= {5,8,7,0,2,4,9,6,7,3}; CreateList(sq, a, 10); printf("删除前 "); DispList(sq); delx2y(sq, 4, 7); printf("删除后 "); DispList(sq); return 0;}<p>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))</p><p> i++; if (i<j) { tmp=L->data[i]; L->data[i]=L->data[j]; L->data[j]=tmp; } } }</p><p> </p><p>int main(){ SqList *sq; ElemType a[10]= {5,8,7,0,2,4,9,6,7,3}; CreateList(sq, a, 10); printf("操作前 "); DispList(sq);</p><p> move(sq);</p><p> printf("操作后 "); DispList(sq); return 0;}</p>
运行结果
知识点总结
利用之前多函数文件总结的算法表(在此全部合为一个函数)让此程序变得不再复杂,建立新变量将x与y进行交换,最后将删除后的信息重新排序输出,这是删除数字
奇偶数排列则是从右到左和从左到右对奇偶数分别排列,最后当i<j时同样也是引入新变量将数组进行交换。
学习心得
此程序运用了指针引用的方式将信息进行成功交换,在日后的编程中一定要将三种传值方法运用熟练,避免发生错误。
对不奇偶数排列同时进行才能缩短时间,降低时间复杂度。
0 0
- 第三周项目四
- 第三周项目四
- 第三周项目四
- 第三周项目四
- 第三周项目四
- 第三周项目四
- 第三周项目四
- 第三周项目四
- 第三周项目四
- 第三周项目四-百钱买百鸡
- 第三周项目四-换分币
- 第三周项目训练四
- 第三周项目四(1)
- 第三周项目四2
- 第三周 项目四:长方柱类
- 第三周项目四:长方柱体
- 第三周项目四长方体类
- 长方体类(第三周 项目四)
- 关于opencv的实用性
- Win32 线程知识点梳理二
- Android Monkey之script脚本
- C#创建windows服务搭配定时器Timer使用实例
- Android应用开发环境配置-使用eclipse进行开发
- 第三周项目四
- cocoaPods安装和使用 (四)
- JSTL函数标签库 fn标签
- PHP5 mysqli 教程
- 剑指 offer:变态跳水台
- android post和get请求 && 子线程获取UI线程的值
- 帧缓存FBO(2)
- [python] Python小知识点汇总
- 黑马程序员android 对话框