使用顺序表存储元素并且删除一定的元素,传统的遍历的方法的时间复杂度为O(n^2);使用快速检索的方法使得时间复杂度为O(n);
采用快速检索的思想,用两个变量i和k记录顺序表中被处理的两端元素的下标,边检索边增加i和减少j,当遇到不相等的i处数值时,将j处的与之交换,直到i>=j,为止,由于移动每个元素一次使得复杂度为O(n);
采用快速检索的思想,用两个变量i和k记录顺序表中被处理的两端元素的下标,边检索边增加i和减少j,当遇到不相等的i处数值时,将j处的与之交换,直到i>=j,为止,由于移动每个元素一次使得复杂度为O(n);
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct Seqlist
{
char element[MAX];
int n;
}*PSeqlist;
int delx_seq(PSeqlist p,char q)//删除表中所有值为p的元素,不过会破坏表的顺序
{
int i = 0,j = p->n-1,count = 0;
while(i < j)
{
if(p->element[i] == q)
{
while((p->element[j] == q) &&(j != i))
{
j--;
count++;
}
if(j == i)
{
p->n = p->n-count-1;
}
else
{
p->element[i] = p->element[j];
count++;
j--;
}
}
i++;
}
p->n = p->n-count;
if(p->element[i] == q)
{
p->n--;
count++;
}
return count;
}
PSeqlist creatNulllist(int n)
{
PSeqlist palist;
palist = (PSeqlist)malloc(sizeof(struct Seqlist));
if(palist != NULL) palist->n = n;
else printf("Out of space!\n");
return palist;
}
int main()
{
int n,i;
char p;
PSeqlist palist;
printf("Input the number of element:\n");
scanf(" %d",&n);
palist = creatNulllist(n);
printf("Input the element:\n");
for(i = 0;i < n;i++)
{
scanf(" %c",&(palist->element[i]));
}
printf("The element you want to delete:\n");
scanf(" %c",&p);
printf("The num of %c have been delete is %d",p,delx_seq(palist,p));
return 0;
}