zoukankan      html  css  js  c++  java
  • 线性表试题中的操作代码

    参考资料:《算法与数据结构考研试题精析》《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<<""}
  • 相关阅读:
    .NET逻辑分层架构总结
    ASP.NET MVC 4 的JS/CSS打包压缩功能-------过滤文件
    c#实现浏览器端大文件分块上传
    fckeditor如何能实现直接粘贴把图片上传到服务器中?
    web编辑器直接粘贴图片实现
    富文本编辑器直接粘贴图片实现
    百度ueditor编辑器直接粘贴图片实现
    百度编辑器直接粘贴图片实现
    fckeditor直接粘贴图片实现
    wangEditor直接粘贴图片实现
  • 原文地址:https://www.cnblogs.com/yinghualuowu/p/7701426.html
Copyright © 2011-2022 走看看