线性表试题中的操作代码

参考资料:《算法与数据结构考研试题精析》《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<<""}

 

posted @ 2017-10-20 20:41  樱花落舞  阅读(709)  评论(6编辑  收藏  举报