1.定义一个采用顺序结构存储的线性表,设计算法完成下面的工作: 将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1)。要求:1、在main函数中验证:原始数组为{1,2,3,4,5,6,7,8,9,10},将其奇偶交换后再将数组中的元素打印出来。2、将主要的奇偶交换代码以及运行结果截图
2.删除元素在[x, y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1);要求:1、在main函数中验证:原始数组为{1,2,3,4,5,6,7,8,9,10},删除[1,5]区间内的数据,再将删除后数组中的元素打印出来。2、将主要的删除代码以及运行结果截图
代码:
/*定义一个采用顺序结构存储的线性表,设计算法完成下面的工作:
删除元素在[x, y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1);
*/
//顺序表结构体定义
#include<stdio.h>
#define MAXSIZE 100
#include <malloc.h>
typedef struct{
int Data[MAXSIZE];
int Last;
}List;
//1.创建空表
List *MakeEmpty( )
{ List *PtrL;
PtrL = (List*)malloc(sizeof(List));
PtrL->Last = -1;
return PtrL;
}
//2.查找元素x
int Find( int X, List *PtrL )
{ int i = 0;
while(i <= PtrL->Last && PtrL->Data[i]!= X)
i++;
if (i > PtrL->Last) return -1; /* 如果没找到,返回-1 */
else return i; /* 找到后返回的是存储位置 */
}
//3.插入元素x,插入位置为第i个结点位置
void Insert( int X, int i, List *PtrL )
{ int j;
if ( PtrL->Last == MAXSIZE-1 ){ /* 表空间已满,不能插入*/
printf("表满");
return;
}
if ( i < 1 || i > PtrL->Last+2) { /*检查插入位置的合法性*/
printf("位置不合法");
return;
}
for ( j = PtrL->Last; j >= i-1; j-- )
PtrL->Data[j+1] = PtrL->Data[j]; /*将 ai~ an倒序向后移动*/
PtrL->Data[i-1] = X; /*新元素插入*/
PtrL->Last++; /*Last仍指向最后元素*/
return;
}
//4.删除第i个结点
void Delete( int i, List *PtrL )
{ int j;
if( i < 1 || i > PtrL->Last+1 ) { /*检查空表及删除位置的合法性*/
printf ("不存在第%d个元素", i );
return ;
}
for ( j = i; j <= PtrL->Last; j++ )
PtrL->Data[j-1] = PtrL->Data[j]; /*将 ai+1~ an顺序向前移动*/
PtrL->Last--; /*Last仍指向最后元素*/
return;
}
//5.打印顺序表中的元素值
void Display( List *PtrL )
{ int i;
for ( i=0;i<= PtrL->Last; i++)
printf("%d ",PtrL->Data[i]);
printf("\n");
}
void Delete_x2y(int x,int y, List *PtrL )
{
int j=0;
for (int i=0;i<= PtrL->Last; i++){
if(PtrL->Data[i]<x||PtrL->Data[i]>y){
PtrL->Data[j++]=PtrL->Data[i];;
};
}
PtrL->Last=j-1;
}
void Adjust(List *Ptrl){
int p=0,q=Ptrl->Last,temp;
while(p<q){
while(Ptrl->Data[p]%2==1){
p++;
}
while(Ptrl->Data[q]%2==0){
q--;
}
if(p<q){
temp=Ptrl->Data[p];
Ptrl->Data[p]=Ptrl->Data[q];
Ptrl->Data[q]=temp;
}
}
}
int main()
{
int x=1,y=5;
int i;
//新建空的顺序表
List *L=MakeEmpty();
// 插入元素i,插入位置为第i个结点位置 ,共插入1....10个结点
for(i=1;i<=10;i++){
Insert(i, i, L);
}
printf("原数组:\n");
Display(L);
//删除[1,5]区间内的数据
printf("删除[1,5]区间内的数据:\n");
Delete_x2y(x,y,L);
Display(L);
// Adjust(L);
// printf("奇偶交换后的数组:\n");
// Display(L);
return 0;
}