3.两个有序单链表合并为一个有序的单链表

原创 2012年03月23日 15:24:37

单链表的基本操作   包括 :链表的创建(头插法,尾插法),链表的遍历,两个单调递增的链表合并为一个单调递增的链表,两个单调递增的链表合并为一个单调递减的链表

 

#include <cstdlib>
#include <iostream>
using namespace std;

//定义单链表的接点
typedef struct Node{
        int data;
        struct Node * next;
        }Nodes; 
//将两个单调递增链表合并成一个 单调递增链表
void merge(Node * a,Node * b,Node * &c){
     Node * p=a->next;//永远指向a的最小的接点
     Node * q=b->next; //永远指向b的最小的接点
     Node * r;//永远指向c的最后一个接点
     c=a; //使用a的头结点
     c->next=NULL;
     free(b);//释放b的头结点
     r=c;//当前c的最后一个接点 也是它的第一个接点
     
     while(p!=NULL && q!=NULL){
             if((p->data)>(q->data)){
                  r->next=q; q=q->next;
                  r=r->next;
                  }
             else{
                  r->next=p; p=p->next;
                  r=r->next;
                  }
             } 
      if(p!=NULL) r->next=p;//将a的剩余接点 添加到c的后面 
      if(q!=NULL) r->next=q;//将b的剩余接点 添加到c的后面 
     } 
     
//将两个单调递增的单链表合并成一个  单调递减的单链表
 void mergeDown(Node * a,Node * b,Node * &c){
     Node * p=a->next;//永远指向a的最小的接点
     Node * q=b->next; //永远指向b的最小的接点
     Node * r;//即将插入的接点 
     c=a; //使用a的头结点
     c->next=NULL;
     free(b);//释放b的头结点
     
     while(p!=NULL && q!=NULL){
             if((p->data)>(q->data)){
                  r=q; q=q->next;
                  r->next=c->next;
                  c->next=r; 
                  }
             else{
                  r=p; p=p->next;
                  r->next=c->next;
                  c->next=r;
                  }
             } 
      while(p!=NULL){//将a的剩余接点 添加到c的后面 
                   r=p; p=p->next;
                  r->next=c->next;
                  c->next=r;
                  }
      while(q!=NULL){//将b的剩余接点 添加到c的后面 
                  r=q;q=q->next;
                  r->next=c->next;
                  c->next=r;
                  }
     } 
//创建链表   尾插法 
void createList(Node * &node ,int data[],int length){
     Node * p;//指向最后一个接点 
     Node * q;//指向新创建的接点
     //创建头结点
     node=(Node *)malloc(sizeof(Node));
     node->next=NULL;
     
     p=node; 
     int i;
     for(i=1;i<=length;i++){
             q=(Node *)malloc(sizeof(Node));
             q->data=data[i];
             p->next=q;
             p=q;
           }     
            p->next=NULL;
     } 

//创建链表  头插法
void createListHead(Node * &node ,int data[],int length){
       Node * q;//指向新创建的接点
       
       //创建头结点
     node=(Node *)malloc(sizeof(Node));
     node->next=NULL;
     
      int i;
     for(i=length;i>=1;i--){
             q=(Node *)malloc(sizeof(Node));
             q->data=data[i];
             q->next=node->next;
             node->next=q;
           }     
     } 
 
//遍历单链表
void showList(Node * node){
     Node * p;//指向当前遍历的接点
     if(node!=NULL)
     p=node->next;
     while(p!=NULL){
             printf("%d-->",p->data);
             p=p->next;
             } 
     } 



int main(int argc, char *argv[])
{
    Node * node=NULL;
    Node * node2=NULL;
     Node * node3=NULL;
    int data[11];
     int data2[11];
    int i;
    for(i=1;i<=10;i++){
                  data[i]=i*i  ;         
                      }
    for(i=1;i<=10;i++){
                  data2[i]=i ;         
                      }
    int length=10;
    createList(node ,data,length);
    createListHead(node2 ,data2,length);
    showList(node);
    printf("\n");
    showList(node2);
    printf("\n");
    mergeDown(node,node2,node3); 
    showList(node3);
    
    system("PAUSE");
    return EXIT_SUCCESS;
}


 

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

两个无序单链合并成一个有序单链表

解题思路 两个无序链表先转换成两个有序单链表 两个有序单链表合并成一个有序单链表 代码:import java.util.*;//链表 class Node { int val; No...

已知线性表中元素以值递增有序排列,并以单链表作为存储结构,设计一个算法,删除表中值相同的多余元素

已知线性表中元素以值递增有序排列,并以单链表作为存储结构 设计一个算法,删除表中值相同的多余元素 使得操作后表中所用元素值均不同,同时释放被删除的结点空间

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

合并两个有序的单链表

public Node merge(Node head1 , Node head2){ if(head1 == null || head2 == null){ return head1 !=...

数据结构杂记——两个递增有序的单链表合并

两个递增有序的单链表合并 问题描述:已知两个单链表均已递增有序,试将他们合并成一个链表,保持其有序性。 问题分析:依次比对链表的data,按序排列即可 Linklist Combine_link...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)