顺序表的应用"/>
第三周项目四(2)—顺序表的应用
*Copyright(c)2017,烟台大学计算机与控制工程学院
*All rights reservrd.
*作者:刘文平
*完成时间:2017年9月14日
*版本号:v1.0
*问题描述:将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1)。
*问题输入:给出一组数
*问题输出:见截图
list.h
#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED#define MaxSize 50
typedef int ElemType;
typedef struct
{ElemType data[MaxSize];int length;
} SqList;
void unionList(SqList *LA, SqList *LB, SqList *&LC);
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 <stdio.h>
#include <malloc.h>
#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)
{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; //参数错误时返回falsei--; //将顺序表逻辑序号转化为物理序号for (j=L->length; j>i; j--) //将data[i..n]元素后移一个位置L->data[j]=L->data[j-1];L->data[i]=e; //插入元素eL->length++; //顺序表长度增1return true; //成功插入返回true
}//删除数据元素ListDelete(L,i,e)
bool ListDelete(SqList *&L,int i,ElemType &e)
{int j;if (i<1 || i>L->length) //参数错误时返回falsereturn 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--; //顺序表长度减1return true; //成功删除返回true
}
mian.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[10]= {5,8,7,0,2,4,9,6,7,3};CreateList(sq, a, 10);printf("操作前 ");DispList(sq);move(sq);printf("操作后 ");DispList(sq);return 0;
}
知识点总结: 线性表元素的查找及变换。学习心得:要学会使用算法库,使编码更有效率。
更多推荐
第三周项目四(2)—顺序表的应用
发布评论