单链表应用------根据两个升序单链表,生成一个降序单链表(头插法)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30780133/article/details/82823424

2018/9/28  17:19    数据结构笔记(一)

数据结构中一种特别重要的结构就是链表,和链表有关的应用有很多,很多语言的容器api的底层实现就是链表,所以掌握链表也是一名计算机级专业的学生必备,下面我们就来看看一下单链表的小应用-----------将两个升序单链表,合并为一个降序单链表(不拆分升序链表),这里将会涉及的知识有:

      1.单链表创建以及插入

      2.头插法创建一个新链表

 生成一个降序单链表很简单,只需要从第一个节点比较两个升序链表的元素,将较小的节点用头插法加入到新链表中。

头插法:

图示

头插法图示
​​​​

   所以只需要用头插法就能自动降序排列

    代码实现

   

/**将两个升序单链表,合并为一个降序单链表
* @param list1  已升序的单链表头结点
* @param list2  已升序的单链表头结点 
**/
void combineLinkedList(LinkedList * list1, LinkedList * list2){
    LinkedList * list3 = (LinkedList*)malloc(sizeof(LinkedList));
    Node * node1 = list1->next;
    Node * node2 = list2->next;
    list3->next = NULL;
    while(node1 &&node2){
        if(node1->element.id > node2->element.id){
              //创建一个新节点
              Node * node3 = (Node*)malloc(sizeof(Node));
              node3->element = node2->element;
              //使用头插法插入节点     
              node3->next = list3->next;
              list3 ->next = node3;
              node2 = node2->next;
              list3->length++;
        }else if(node1->element.id < node2->element.id){
              Node * node3 = (Node*)malloc(sizeof(Node));
              node3->element = node1->element;
              node3->next = list3->next;
              list3 ->next = node3;
              node1 = node1->next;
              list3->length++;
        }else{
              Node * node3 = (Node*)malloc(sizeof(Node));
              node3->element = node2->element;
              node3->next = list3->next;
              list3->next = node3;
              node1 = node1->next;
              node2 = node2->next;
              list3->length++;
        }
    }
    //将剩余的节点也复制到新链表中 
    if(node1){
       while(node1){
            Node * node3 = (Node*)malloc(sizeof(Node));
            node3->element = node1->element;
            node3->next = list3->next;
            list3 ->next = node3;
            node1 = node1->next;
            list3->length++;
       }
    }else if(node2){
        while(node2){
            Node * node3 = (Node*)malloc(sizeof(Node));
            node3->element = node2->element;
            node3->next = list3->next;
            list3 ->next = node3;
            node2 = node2->next;
            list3->length++;
       }
    }
    //打印单链表
    printfLinkedList(list3);
}

  这是所用的链表的数据结构代码

/**
定义链表的结点,包含数据域和指针域
**/
typedef struct Node{
   ElemebtType element;   //数据域
   struct Node * next;    //指针域
}Node;
/**
定义头结点,里面包含链表的长度
**/
typedef struct LinkedList{
    Node * next;
    int length;
}LinkedList;

/**
* 初始化链表
* @param linkedList 头结点
* @param
* @return
*/
void InitLinkedList(LinkedList * linkedList, ElemebtType * Array, int length);
/**
向链表中插入数据
**/
void insertLinkedlist(LinkedList * linkedlist, int pos, ElemebtType element);
/**
打印数据
**/
void printfLinkedList(LinkedList * Linkedlist);
/**
根据下标获取元素
**/
void getElement(LinkedList * Linkedlist, int index);
/**
根据下标删除某个元素
**/
ElemebtType DeleteLinkedElement(LinkedList * linkedList, int index);
/**在尾节点后添加一个元素**/
void addElement(LinkedList * linkedList, ElemebtType element);

第二种:合并后两个升序链表为降序链表--不生成新的节点

void combineNewLinkedList(LinkedList * list1, LinkedList * list2){
    Node * node1 = list1->next;
    Node * node2 = list2->next;
    Node * node3;
    //创建一个新链表,将list1设置为其头结点
    LinkedList * list3 = list1;
    list3->next = NULL;
    while(node1 && node2){
         if(node1->element.id > node2->element.id){
                //直接赋值节点
                node3 = node2;
                node2 = node2->next;
                list3->length++;
         }else if(node1->element.id < node2->element.id){
                node3 = node1;
                node1 = node1->next;
                list3->length++;
         }else{
                node3 = node1;
                node1 = node1->next;
                node2 = node2->next;
                list3->length++;
         }
          //头插法
          node3->next = list3->next;
          list3->next = node3;
    }
    /**拼接剩余的节点**/
    if(!node1){
       node1 = node2;
    }
    while(node1){
        node3 = node1;
        node1 = node1->next;
        node3->next = list3->next;
        list3->next = node3;
        list3->length++;
    }
    printfLinkedList(list3);
}

猜你喜欢

转载自blog.csdn.net/qq_30780133/article/details/82823424