顺序表习题
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define LIST_INIT_SIZE 5
typedef int ElemType;
typedef struct
{
ElemType *pbase;
int length;
int maxsize
}SqList;
void init(SqList *L);
void CreateList(SqList *L,ElemType *a,int n);
bool DeleteMin(SqList *L);
void ShowList(SqList *L);
void ReverseList(SqList *L);
void DeleteElem(SqList *L,ElemType x);
void DeleteElem2(SqList *L,ElemType x);
bool DeleteElems(SqList *L,ElemType s,ElemType t);
bool DeleteSqElems(SqList *L,ElemType s,ElemType t);
bool DeleteSqElems2(SqList *L,ElemType s,ElemType t);
void DeleteRepeat(SqList *L);
int main()
{
SqList L;
ElemType min;
init(&L);
ElemType a[] = {1,1,2,2,2,3,3,3,4,4,5};
CreateList(&L,a,11);
ShowList(&L);
DeleteRepeat(&L);
ShowList(&L);
}
void init(SqList *L)
{
L->length = 0;
L->maxsize = LIST_INIT_SIZE;
L->pbase = (ElemType *)malloc(sizeof(ElemType)*L->maxsize);
if(!L->pbase)
{
printf("malloc fail");
exit(0);
}
}
void CreateList(SqList *L,ElemType *a,int n)
{
int i;
for(i = 0; i<n; i++)
L->pbase[i] = a[i];
L->length = n;
}
void ShowList(SqList *L)
{
int i;
for(i = 0; i<L->length; i++)
printf("%d",L->pbase[i]);
printf("\n");
}
/* ex2.1 删除最小元素*/
bool DeleteMin(SqList *L)
{
if(L->length == 0)
return false;
ElemType min = L->pbase[0];
int i,pos = 0;
for(i = 1; i < L->length; i++)
{
if(L->pbase[i]<min)
{
min = L->pbase[i];
pos = i;
}
}
L->pbase[pos] = L->pbase[L->length-1];
L->length = L->length-1;
return true;
}
/* ex2.2 逆置顺序表*/
void ReverseList(SqList *L)
{
int i,j;
ElemType temp;
i = 0;
j = L->length-1;
for(; i<(L->length)/2;i++,j--)
{
temp = L->pbase[j];
L->pbase[j] = L->pbase[i];
L->pbase[i] = temp;
}
}
/* ex2.3 删除所有值为x的元素 法一*/
void DeleteElem(SqList *L,ElemType x)
{
int i, k;
k = 0; //k:不等于x的元素个数
for(i = 0; i<L->length; i++)
{
if(L->pbase[i] != x)
{
L->pbase[k] = L->pbase[i];
k++;
}
}
L->length = k;
}
/* ex2.3 删除所有值为x的元素
法二:i,j从两端遍历,如果左端元素等于x,右端元素不等于x,则把右端元素移动到左端*/
void DeleteElem2(SqList *L,ElemType x)
{
int i,j;
i = 0;
j = L->length-1;
while(i<=j)
{
if(L->pbase[i] == x)
{
if(L->pbase[j]!=x)
{
L->pbase[i] = L->pbase[j];
j--;
i++;
}
else
j--;
L->length--;
}
else
i++;
}
}
/* ex2.4 删除有序表中值位于s和t之间的元素 */
bool DeleteElems(SqList *L,ElemType s,ElemType t)
{
if(s>=t || L->length == 0)
return false;
int i,k;
k = 0;
for(i = 0; i<L->length; i++)
{
if(L->pbase[i] <= s)
{
k++;
}
else if(L->pbase[i] >= t)
{
L->pbase[k] = L->pbase[i];
k++;
}
}
L->length = k;
return true;
}
/* ex2.5 删除顺序表中值位于s和t之间的元素
法一顺序表次序会改变*/
bool DeleteSqElems(SqList *L,ElemType s,ElemType t)
{
if(s>=t || L->length == 0)
return false;
int i,j;
i = 0;
j = L->length-1;
while(i<=j)
{
if(L->pbase[i]>=s && L->pbase[i]<=t)
{
if(L->pbase[j]<s || L->pbase[j]>t)
{
L->pbase[i] = L->pbase[j];
i++;
}
j--;
L->length--;
}
else
i++;
}
return true;
}
/* ex2.5 删除顺序表中值位于s和t之间的元素
法二顺序表次序不会改变 记录位于s和t之间的元素个数,前移k个元素*/
bool DeleteSqElems2(SqList *L,ElemType s,ElemType t)
{
if(s>=t || L->length == 0)
return false;
int i,k;
k = 0;
for(i = 0; i<L->length; i++)
if(L->pbase[i]>=s && L->pbase[i]<=t)
k++;
else
L->pbase[i-k] = L->pbase[i];
L->length -=k;
return true;
}
/*ex2.6 删除有序顺序表中所有重复的元素*/
void DeleteRepeat(SqList *L)
{
int i,k; //i遍历顺序表,k存储第一个不同的元素的位置
k = 0;
for(i = 1; i<L->length; i++)
{
if(L->pbase[i] != L->pbase[k])
{
k++;
L->pbase[k] = L->pbase[i];
}
}
L->length = k+1;
}