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;
}


 

相关文章推荐

将两个有序链表合并成一个有序链表

问题定义:         写一个函数SortedMerge函数,该函数有两个参数,都是递增的链表,函数的功能就是合并这两个递增的链表为一个递增的链表,SortedMerge的返回值是新的链表。新链...
  • lalor
  • lalor
  • 2012年04月05日 21:02
  • 45901

算法题:合并两个有序的链表

题目:已知有两个有序的单链表,其头指针分别为head1和head2,实现将这两个链表合并的函数: Node* ListMerge(Node *head1,Node *head2) ...
  • JXH_123
  • JXH_123
  • 2014年08月04日 16:50
  • 13038

单链表排序之选择排序(赞)

单链表排序是单链表的常见编程任务之一,也是面试中经常出现的题目。单链表排序的关键是交换算法,需要额外考虑。选择排序是比较直观的排序算法之一,这里就使用选择排序实现单链表的排序。 如果需要对选择排序复...

数据结构基本操作(复制而来)

C语言实现顺序表的基本操作 Sqlist1.h #include #include #include #define TRUE 1 #define FALSE 0 ...

c++两有序单链表的合并算法

  • 2011年11月10日 20:36
  • 2KB
  • 下载

合并有序单链表

  • 2017年07月13日 16:23
  • 1.63MB
  • 下载

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

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

关于有序单链表的详细设计

  • 2010年01月08日 12:51
  • 86KB
  • 下载

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

已知线性表中元素以值递增有序排列,并以单链表作为存储结构 设计一个算法,删除表中值相同的多余元素 使得操作后表中所用元素值均不同,同时释放被删除的结点空间...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:3.两个有序单链表合并为一个有序的单链表
举报原因:
原因补充:

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