//顺序表中,删除所有元素值为k的元素 O(n) O(1)
void Delete(Sqlist &L,int k){
int num=0;
int i=0,j=0;
while(j<=L->length-1){
if(L->data[j]!=k){
L->data[i++]=L->data[j++];
}else{
j++;
num++;
}
}
L->length-=num;
}
//在双链表中的值为x的结点之后插入值为y的结点
int insert(LinkList &head,int x,int y){
LNode *p=head->next;
LNode *q=(LNode*)malloc(sizeof(LNode));
q->data=y;
while(p!=null && p->data!=x){
p=p->next;
}
if(p==null) return 0;
else{
if(p->next!=null){//不是尾节点
p->next->prior=q;
q->next=p->next;
p->next=q;
q->prior=p;
}else{
q->next=null;
p->next=q;
q->prior=p;
}
}
return 1;
}
//双链表 在x结点之前插入值为y的结点
int insert(LinkList &head,int x,int y){
LNode *p=head->next;
LNode *q=(LNode*)malloc(sizeof(LNode));
q->data=y;
while(p!=null && p->data!=x){
p=p->next;
}
if(p==null) return 0;
else{
p->prior->next=q;
q->prior=p->prior;
p->prior=q;
q->next=p;
}
return 1;
}
//双链表L,查找第一个值为x的结点,将其余后继交换
int swap(LinkList &L,int x){
LNode *p=L->next,*q;
while(p!=null && p->data!=x){
p=p->next;
}
if(p==null) return 0;
else{
q=p->next;
if(q!=null){
p->prior->next=q;
q->prior=p->prior;
p->next=q->next;
if(q->next!=null){
q->next->prior=p;
}
q->next=p;
p->prior=q;
}
}
}
//非有序的单链表中 设计一个算法 删除值域重复的点 分析时间复杂度 O(n^2)
void Delete(LinkList &L){
LNode *p=L->next;
LNode *q,*r,*t;
while(p!=null){
q=p;//前
r=q->next;//后
while(r!=null){
if(r->data==p->data){//r指向被删除结点
t=r->next;
q->next=t;
free(r);
r=t;
}else{
q=r;
r=r->next;
}
}
p=p->next;
}
}
//约瑟夫环
void Josephus(LinkList &L,int m){
LNode *p=L,*q=&L;
while(p && p->next){
for(int i=1;i<m;q=p,p=p->next){
i++;
}
visit(p->data);
q->next=p->next;
free(p);
p=q->next;
}
if(p){
visit(p->data);
free(p);
}
L=null;
}
//顺序表 将所有负数移动到所有正数之前 O(n)
void MoveNumber(int a[],int n){
int k,i=-1,j=n;
if(n>0){
while(i<j){
do i++;while(a[i]<0 && i>n);
do j--;while(a[j]>=0 && j>=0);
if(i<j){
swap(a[i],a[j]);
}
}
}
}