zoukankan      html  css  js  c++  java
  • 链表合并

    设有两个无头结点的单链表,头指针分别为hahb,链中有数据域data。链域next。两链表的数据都按递增序存放,现要求将hb表归到ha表中,且归并后ha仍递增序,归并中ha表中已有的数据若hb中也有,则hb中的数据不归并到ha中,hb的链表在算法中不同意破坏。


    #include<stdio.h> /// no have dead node  ha and hb >>ha
    #include<stdlib.h>
    typedef int ElemType;
    typedef struct LNode{
    	ElemType data;
    	struct LNode *next;
    }LNode,*LinkList;
    
    LinkList CreateLink(int n)  /// 创建表
    {
        LinkList h=(LinkList)malloc(sizeof(LNode)),q;
        scanf("%d",&h->data);
        h->next=NULL;
        q=h;
        for(int i=1;i<n;i++){
            LinkList p=(LinkList)malloc(sizeof(LNode));
            scanf("%d",&p->data);
            p->next=NULL;
    
            q->next=p;
            q=p;
        }
        return h;  /// 返回头指针
    }
    void print(LinkList h);
    LinkList MergeList(LinkList ha,LinkList hb)
    {
        LinkList p,hc,pc;
        p=(LinkList)malloc(sizeof(LNode));
        p->next=NULL;
    
        hc=pc=p;
        while(ha&&hb)
        {
            if(ha->data < hb->data){
                p=(LinkList)malloc(sizeof(LNode));
                p->next=NULL;
                p->data=ha->data;
    
                pc->next=p;pc=p;ha=ha->next;
            }
            else if(ha->data > hb->data){
                p=(LinkList)malloc(sizeof(LNode));
                p->next=NULL;
                p->data=hb->data;
    
                pc->next=p;pc=p;hb=hb->next;
            }
            else{
                /**
                p=(LinkList)malloc(sizeof(LNode));
                p->next=NULL;
                p->data=ha->data;
    
                pc->next=p;
                pc=p;
                ha=ha->next;
                */
                hb=hb->next; /// ha中有hb的元素,hb直接指向下一结点
            }
        }
        pc->next=ha?ha:hb;  ///  指向剩余的链表
    
        return hc->next;    /// 返回无头结点的指针
    }
    void print(LinkList h)
    {
    
        while(h!=NULL){
            printf("%d ",h->data);
            h=h->next;
        }
        printf("
    ");
    }
    
    int main()
    {
        int n,m;
        scanf("%d",&n);   ///ha
        LinkList ha=CreateLink(n);
    
        scanf("%d",&m);    ///hb
        LinkList hb=CreateLink(m);
    
        printf("
    Before MergeList
    ");
        print(ha);
        print(hb);
    
        ha=MergeList(ha,hb);
    
        printf("After MergeList
    ");
        print(ha);
        print(hb);
    
        return 0;
    }
    
    /**
    6
    1 5 7 9 34  75
    5
    0 4 5 5 76
    */
    




    实验结果,hb插入ha中,而且hb不变,ha仍然递增

  • 相关阅读:
    Elasticsearch重要文章之四:监控每个节点(ThreadPool部分)
    [翻译]Elasticsearch重要文章之四:监控每个节点(jvm部分)
    IDFA
    Python中eval函数的作用
    Android开发重点难点:RelativeLayout(相对布局)详解
    布局相关
    Nginx配置proxy_pass
    Docker部署Elasticsearch集群
    extends Thread 与 implements Runnable 的区别
    玩转 Redis缓存 集群高可用
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5150205.html
Copyright © 2011-2022 走看看