线性表试题中的操作代码
参考资料:《算法与数据结构考研试题精析》《2018数据结构考研复习指导》,如果有误还请提出来~~~>W<
在指针p所指结点之前插入s所指结点:
两个结点交换
1 s->next=p->next 2 p->next=s 3 p->data<--->s->data
1 Q=P 2 while(p->next!=Q){ 3 P=P->next; 4 } 5 S->next=P->next; 6 P->next=S
带头结点的双向循环链表L为空表的条件是
1 L->prior=L->next=L
删除p所指结点的后继结点
1 q=p->next 2 p->next=q->next 3 free(q)
带头结点的单循环链表L仅有一个头结点的条件是
1 L->next->next=L&&L->next!=L
带头结点的双向循环链表L仅有一个头结点的条件是
1 L->next->next=L&&L->next!=L&&L->prior->prior=L
双向循环链表中,p所指的结点之后插入指针f所指的结点
1 f->next=p->next 2 f->prior=p 3 p->next->prior=f 4 p->next=f
链表合并,Lisa放入Listb尾部
1 typedef struct node{ 2 dataType data; 3 struct node *link; 4 }*Linklist 5 void Solve(Linklist lista,Linklist listb){ 6 Linklist p; 7 for(p=lista;p->link;p=p->link); 8 p->link=listb 9 }
无头指针单链表,结点有数据域data,指针域next,表头指针h,使得链接方向逆转,h指向原来链表的最后一个节点
1 Inverse(&h){ 2 if(!h) return; 3 p=h->next; 4 pr=NULL; 5 while(p){ 6 h->next=pr;pr=h;h=p;p=p->next; 7 } 8 h->next=pr; 9 }
带头结点的单链表数据结点的逆序连接
void reverse(pointer h){ pointer p,q; p=h->next; h->next=null; while(p!=null){ q=p;p=p->next;q->next=h->next;h->next=q; } }
单链表中元素按插入排序,L为头结点指针
1 typedef struct node{ 2 dataType data; 3 struct node *next; 4 }*link,linknode 5 void Solve(link L){ 6 link p,q,r,u; 7 p=L->next;L->next=NULL; 8 while(p!=NULL){ 9 r=L;q=L->next; 10 while(p!=q&&q->data<=p-data){ 11 r=q;q=>next; 12 } 13 u=p->next;p->next=r->next;r->next=p;p=u; 14 } 15 }
双向循环链表结点,在指针p所指的结点之前插入s结点
1 s->pre=p->pre;s->next=p; 2 p->pre->next=s;p->pre=s;
无表头结点单链表逆置
(Londe *L){ p=L; q=NULL; while(p!=NULL){ r=p->next; p->next=q; q=p;p=r; } L=q; }
带有表头结点的单链表,只给出了list,查找链表中倒数第k位置的结点
1 while(p&&i<k){ 2 i++;p=p->link; 3 } 4 if(p==null){printf("")} 5 while(p){q=q->link;p=p->link;} 6 return 1;
两个增序的单链表,归为一个递减的单链表,并只能用原来的两个链表
1 p=la->next;q=lb->next; 2 la->next=null; 3 while(p&&q){ 4 if(p->data<=q->data){ 5 r=p->next; 6 p->next=la->next; 7 p=r; 8 } 9 }else{//*q链入结果表中} 10 if(p) q=p; 11 while(q!=null){ 12 r=q->next;q->next=la->next;la->next=q;q=r; 13 }
两个整数序列A=a1,a2,a3...,am 和B=b1,b2,b3,...bn已经存在单链表中,判断B是否是A的子序列
1 while(p&&q){ 2 if(p->data==q->data) {p=p->next;q=q->next} 3 else{pre=pre->next;p=pre;q=B} 4 } 5 if(q==null) return 1; 6 else return 0;
带头结点的单链表逆置
1 while(p!=null){ 2 r=p->next; 3 p->next=head->next; 4 head->next=p; 5 p=r; 6 }
循环链表逆置
1 while(p!=la){ 2 r=p->next;p->next=la->next; 3 la->next=p;p=r; 4 }
删除重复结点,单链表有data和next两个域
1 while(pre!=null){ 2 m=pre->data;q=pre;p=pre->next; 3 while(p!=null){ 4 if(p->data==m){u=p;p=p->next;free(u)} 5 else {q->next=p;q=p;p=p->next} 6 } 7 q->next=p; 8 pre=pre->next; 9 }
指针P所指结点与其后继结点,HEAD是该链表头指针,P指向该链表的某一结点
1 pre=HEAD;q=HEAD->next; 2 while(q!=null&&q!=P){ 3 pre=q;q=q->next; 4 } 5 if(P->next==null){P无后继结点} 6 else{ 7 q=P->next; 8 pre->next=q; 9 P->next=q->next; 10 q->next=P; 11 }
ha为单向链表,hb为单向循环链表,合并成一个,且算法复杂度与链表长度无关
q=hb->next; hb->next=ha->next; ha->next=q->next; free(q);
线性表顺序LA,LB元素按非递减有序,将LB合并到LA中,LA保持非递减有序,最大限度的避免移动元素
1 k=m+n-1;i=m-1;j=n-1; 2 while(i>=0&&j>=0){ 3 if(LA[i]>=LB[j]) LA[k--]=LA[i--];else LA[k--]=LB[j--]; 4 } 5 while(j>=0) LA[k--]=LB[j--];
线性表n顺序存储,时间复杂度O(n),空间复杂度O(1),删除元素值是item的元素
1 while(i<j){ 2 while(i<j&&A[i]!=item) i++; 3 while(i<j&&A[j]==item) j--; 4 if(i<j) A[i++]=A[j--]; 5 } 6 要求相对顺序不变 7 i=-1;i=0; 8 while(i<n){ 9 if(A[i]==item) i++;else A[++j]=A[i++]; 10 }
将链表数据最小的结点移到链表最前面,不得申请新结点
1 p=list->list;pre=list; 2 q=p; 3 while(p->link){ 4 if(p->link->data<q->data){pre=p;q=p->link} 5 p=p->link; 6 } 7 if(q!=list->link){ 8 pre->link=q->link;q->link=list->link; 9 list->link=q; 10 }
带头表结点的双向循环链表是否对称相等
1 struct Node{ 2 elem data; 3 Node *Link,*Rlink; 4 } 5 while(p!=q&&p->Rlink!=q){ 6 if(p->data==q->data){p=p->Rlink;q=q->Llink} 7 else{cout<<""} 8 } 9 if(p==q){cout<<""} 10 else if(p->data==q->data){cout<<""}