版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_39286218/article/details/80164169
任务和代码:
main.cpp
/*
*All rights reserved
*文件名称:main.c
*作者: Osseyda
完成日期:2018.5.2
*版本号:v2.
*
*问题描述:顺序表的应用
*问题输出:1.程序的多文件组织形式 ; 2.要求算法的时间复杂度为O(n)
*/
#include "list.h"
#include <stdio.h>
int main()
{
SqList *sq;
InitList(sq);
ElemType x[7]= {5,8,7,2,5,4,9};
ElemType e1, e2;
/*创建线性表并显示*/
CreateList(sq, x, 7);
printf("创建线性表:");
DispList(sq);
printf("\n");
/*删除某个值对应的所有元素*/
delnode1(sq,5);
printf("删除值为5的所有元素后的线性表:");
DispList(sq);
printf("\n");
/*判断线性表是否为空,不为空则打印长度*/
if(ListEmpty(sq))
printf("该线性表为空");
else
printf("该线性表不为空且长为%d",ListLength(sq));
printf("\n\n");
/*指定位置插入元素并打印新的线性表*/
ListInsert(sq,2,3);
printf("在第2个元素位置添加元素3:");
DispList(sq);
printf("\n");
/*读指定位置的元素值并打印*/
if(GetElem(sq,4,e1))
printf("4号位置对应的元素: %d",e1);
else
printf("位置不在线性表长度之内");
printf("\n\n");
/*读指定元素位置并打印*/
if(LocateElem(sq,11))
printf("元素值11对应的位置为: %d",LocateElem(sq,7));
else
printf("元素值11对应元素不在此线性表内");
printf("\n\n");
/*删除指定位置的元素并打印新的线性表*/
ListDelete(sq,5,e2);
printf("删除5号位置元素后的新线性表:");
DispList(sq);
printf("\n");
/*销毁线性表*/
DestroyList(sq);
/*合并线性表*/
SqList *sq1, *sq2, *sq0;
InitList(sq1);
ElemType x1[6]= {5,8,7,2,4,9};
CreateList(sq1, x1, 6);
InitList(sq2);
ElemType x2[6]= {3,8,5,1,4,8};
CreateList(sq2, x2, 6);
unionList(sq1, sq2, sq0);
printf("合并后的线性表:");
DispList(sq0);
printf("\n");
/*以表中首元素分离所有元素*/
move1(sq0);
printf("以表中首元素分离所有元素后的线性表:");
DispList(sq0);
printf("\n");
/*将所在奇数移到所有偶数的前面*/
sortOdd(sq0);
printf("奇数在前偶数在后的线性表:");
DispList(sq0);
printf("\n");
/*删除元素在[x, y]之间的所有元素*/
delnodes(sq0, 4, 8);
printf("删除元素在[4, 8]之间的所有元素后的线性表:");
DispList(sq0);
return 0;
}
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 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)
void unionList(SqList *LA, SqList *LB, SqList *&LC);//合并线性表unionList(LA,LB,LC)
void delnode1(SqList *&L, ElemType x);//删除某个值的所有元素delnode1(L,x)
void move1(SqList *&L);//以首元素的大小分离所有元素move1(L)
void delnodes(SqList *&L, ElemType e1, ElemType e2);//保存两元素间的元素delnodes(L,e1,e2)
void sortOdd(SqList *&L);//奇数在前偶数在后排列元素sortOdd(L)
#endif
list.cpp
#include <stdio.h>
#include <malloc.h>
#include "list.h"
//1.用数组创建线性表
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;
}
//2.初始化线性表
void InitList(SqList *&L) //引用型指针
{
L=(SqList *)malloc(sizeof(SqList));
//分配存放线性表的空间
L->length=0;
}
//3.销毁线性表DestroyList(L)
void DestroyList(SqList *&L)
{
free(L);
}
//4.判定是否为空表ListEmpty(L)
bool ListEmpty(SqList *L)
{
return(L->length==0);
}
//求线性表的长度ListLength(L)
int ListLength(SqList *L)
{
return(L->length);
}
//5.输出线性表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");
}
//6.求某个数据元素值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;
}
//7.按元素值查找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;
}
//8.插入数据元素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
}
//9.删除指定位置的元素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
}
//10.线性表的合并
void unionList(SqList *LA, SqList *LB, SqList *&LC){
int lena, i;
ElemType e;
InitList(LC);
for(i=1; i<=ListLength(LA); i++){
GetElem(LA,i,e);
ListInsert(LC,i,e);
}
lena=ListLength(LA);
for(i=1; i<ListLength(LB); i++){
GetElem(LB,i,e);
if(!LocateElem(LA,e))
ListInsert(LC,++lena,e);
}
}
//11.删除指定值的元素
void delnode1(SqList *&L, ElemType x){
int k=0, i;
for(i=0; i<L->length; i++){
if(L->data[i]!=x){
L->data[k]=L->data[i];
k++;
}
}
L->length=k;
}
//12.根据指定元素按其大小分离表中所有元素
void move1(SqList *&L){
int i=0, j=L->length-1;
ElemType pivot=L->data[0];
ElemType tmp;
while(i<j){
while(L->data[j]>pivot)
j--;
while(L->data[i]<=pivot)
i++;
if(i<j){
tmp=L->data[i];
L->data[i]=L->data[j];
L->data[j]=tmp;
}
}
tmp=L->data[0];
L->data[0]=L->data[j];
L->data[j]=tmp;
}
//13.删除元素在[x, y]之间的所有元素
void delnodes(SqList *&L, ElemType e1, ElemType e2){
int i, k=0;
for(i=0; i<L->length; i++){
if(L->data[i]>=e1 && L->data[i]<=e2){
L->data[k]=L->data[i];
k++;
}
}
L->length=k;
}
//14.将所在奇数移到所有偶数的前面
void sortOdd(SqList *&L){
int i,j=0,k=0;
ElemType a[L->length];
for(i=0; i<L->length; i++){
if(L->data[i]%2==0){
a[j]=L->data[i];
j++;
}
else{
L->data[k]=L->data[i];
k++;
}
}
for(j=0; j<L->length-k; j++){
L->data[k]=a[j];
k++;
}
}
运行结果:
知识点总结:
1. 线性表在调用函数返回后要保证不被释放,线性表的函数参数要设置成指针的引用:Sqlist *&L
2.线性表基本运算的实现
3.分离元素的算法思想
4.尝试从时间复杂度的角度设计算法
心得:
暂别之后,我胡汉三又回来啦 ^_^ , CSND界面优化的好多,手却生疏了好多 - -|||
扫描二维码关注公众号,回复:
5921731 查看本文章