//逆置不带头结点的单循环链表,有尾指针 void invert(LinkList &head){ LNode *p,*a,*r; p=head->next; q=p->next; p->next=head; while(p!=head){ r=q->next; q->next=p; p=q; q=r; } }
//设计一个高效的算法 将递增有序La和Lb 合并成La(并集) 仍非递减有序 O(n) 不新建结点 //链表 LNode *MergeTwoList(LinkList &La,LinkList &Lb){ LNode *p=La->next,*q=Lb->next; LNode *r=La; La->next=null; while(p!=null && q!=null){ if(p->data<q->data){ //尾插法 r->next=p; r=p; p=p->next; }else if(p->data>q->data){ r->next=q; r=q; q=q->next; }else{ r->next=p; r=p; p=p->next; LNode *h=q; q=q->next; free(h); } } if(p!=null) r->next=p; if(q!=null) r->next=q; }
//顺序表 //设计一个高效的算法 将非递减有序La和Lb 合并成La(并集) 仍递减有序 O(n) void MergeTwoList(Sqlist &La,Sqlist Lb){ int i=La.length-1,j=Lb.length-1; int k=La.length+Lb.length; while(i>=0 && j>=0){ if(La.data[i]>=Lb.data[j]){ La.data[k--]=La.data[i--]; }else{ La.data[k--]=Lb.data[j--]; } } while(j>0) La.data[k--]=Lb.data[j--]; }
//递增数组a[m]和又n个整数的递减数组b[n],将a和b归并为递增有序数组 O(m+n) void merge(int a[],int b[],int n,int m){ int i,j,k; for(i=0,j=n-1;i<m && j>-1;k++){ if(a[i]<b[j]){ c[k]=a[i++]; }else{ c[k]=b[j--]; } } while(i<m) c[k++]=a[i++]; while(j>-1) c[k++]=b[j--]; }
//有一个单链表La分解成两个单链表,一个单链表存大于等于0的结点 //另一个单链表存小于0的结点 void DisCreate(LinkList &La){ LNode *r,*p; LNode *b=(LNode *)malloc(sizeof(LNode)); LNode *c=(LNode *)malloc(sizeof(LNode)); b->next=null; c->next=null; p=La->next; while(p!=null){ r=p->next; if(p->data>=0){ p->next=b->next; b->next=p; }else{ p->next=c->next; c->next=p; } p=r; } }
//用单链表表示集合 设计一个算法求两个集合的差 A-B=元素在A中不在b中 void difference(LinkList &A,LinkList &B,LinkList &C){ LNode *p=A->next; LNode *q,*s,*r; C=(LNode*)malloc(sizeof(LNode)); r=C;//尾插 while(p!=null){ q=B->next; while(q!=null && p->data!=q->data){ q=q->next; } if(q==null){ s=(LNode *)malloc(sizeof(LNode)); s->data=p->data; r->next=s; r=s; } p=p->next; } r->next=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]); } } } }