#define MAXSIZE 100
typedef struct{
ElemType elem[MAXSIZE];
int last;
}SeqList;
在C语言数据结构中,关于数据元素的类型定义均用“ ElemType e;”来表示,其中e是表示数据元素的变量,而ElemType则是它的类型,ElemType的含义就是“数据元素的类型”,是一个抽象的概念,是表示我们所要使用的数据元素应有的类型。
ElemType是数据结构上为了说明问题而用的一个词。它是element type(“元素的类型”)的简化体。因为数据结构是讨论抽象的数据结构和算法,一种结构中元素的类型不一定是整型、字符型、浮点型或者用户自定义类型,为了不重复说明,使用过程用 “elemtype” 代表所有可能的数据类型,简单明了的概括整体。
在算法中,除特别说明外,规定ElemType的默认是int型。
int Locate(SeqList L ,ElemType e)
{
i=0;
while((i<L.last)&&(L.elem[i]!=e)){
i++;
}
if(i<=L.last)
return (i+1);
else
return (-1);
}
其实是移动部分的代码
int InsList(SeqList *L,int i,ElemType e)
{
int k;
if((i<1)||(i>L->last+2))
{
printf("插入位置i值不合法");
return (ERROR);
}
if(L->last>=maxsize-1)
{
printf("表已满无法插入");
return (ERROR);
}
for(k=L->last;k>=i-1;k--)
{
L->elem[k+1]=L->elem[k];
}
L->elem[i-1]=e;
L->last++;
return (OK);
}
#include<stdio.h>
int Locate(SeqList *L ,int i,ElemType *e)
{
int k;
while((i<1)||(i>L->last+1)) {
printf("删除位置不合法!");
return(error);
}
*e=L->elem[i-1]
for(k=i; k<=L->last; k++) {
L->elem[k-1]=L->elem[k];
L->last--;
return (ok);
}
}
void merge(SeqList *LA,SeqList *LB,SeqList *LC) {
int i,j,k,l;
i=0;
j=0;
k=0;
while(i<=LA->last&&j<=LB->last) {
if(LA->elem[i]<=LB->elem[j]) {
LC->elem[k]=LA->elem[i];
i++;
k++;
} else {
LC->elem[k]=LB->elem[j];
j++;
k++;
}
}
while(i<=LA->last) {
LC->elem[k]=LA->elem[i];
i++;
k++;
}
while(i<=LA->last) {
LC->elem[k]=LB->elem[j];
j++;
k++;
}
LC->last=LA->last+LB->last+1;
}
已知顺序表 L 中的数据元素类型为 int。设计算法将其调整为左右两部分,左边的元素(即排在前面的)均为奇数,右边所有元素(即排在后面的)均为偶数,并要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。
【问题分析】
初见此题,可能会想到额外申请 1 个顺序表空间,之后依次从顺序表 L 中选
择奇数放入新表前部分,选择偶数放在新表的后半部分。但是题目要求空间复杂度为 O(1),很显然上述方法是不可行的。既然要求空间复杂度为 O(1),说明只能借助 1 个辅助空间。
分析题目要求,其实只需要将位于表左半部分的偶数与位于表右半部分的奇数通过一个辅助变量进行交换即可,为此可以设置两个位置指示器 i 和 j,i 初值为 0,j 初值为 L->last。
当L->elem[i]为偶数,L->elem[j]为奇数时,则将 L->elem[i] 与 L->elem[j]交换;否则,L->elem[i]为奇数,i++, L->elem[j]为偶数,j++。这样既可以保证算法的时间复杂度为 O(n),亦可保证空间复杂度为 O(1)。
【算法描述】
adjustsqlist(seqlist *l){
int i=0,j=l->last,t;
while(i<j){
while(l->elem[i]%2!=0)
i++;
while(l->elem[j]%2==0)
j--;
if(i<j){
t=l->elem[i];
l->elem[i]=l->elem[j];
l->elem[j]=t;
}
}
}