(链表)将两个递增的有序链表合并为一个递增的有序链表,结果链表仍使用原来的存储空间


//将两个递增的有序链表合并为一个递增的有序链表,结果链表仍使用原来的存储空间

 
#include<iostream>
 
using namespace std;
 
typedef int elem;
 
//建立链表空间 
 
typedef struct list
 
{
 
 elem data;
 
 struct list *next;
 
}node,*link;
 
//初始化链表
 
/*
 
1.生成新节点作为头节点,用头指针L指向头节点
 
2.头指针指针域置空*/ 
 
void initialize(link &L)
 
{
 
 L=new node;
 
 L->next=NULL;
 
 }
 
//前插法建立单链表
 
/*1.创建一个只有头节点的空链表
 
2.根据待创建链表包括的元素个数n,循环n次执行以下操作:
 
生成一个新节点*p 
 
输入元素值赋给新节点*p的数据域 
 
将新节点*p插入到头节点之后*/
 
void createlist_head(link &L)
 
{
 
 int n,e;
 
 node *p=NULL;
 
 initialize(L);
 
 cout<<"How many elements do you want to bulid in the list?"<<endl;
 
 cin>>n;
 
 L->data=n;
 
 cout<<"please input elements you want to iput:"<<endl;
 
 for(int i=0;i<n;i++)
 
 {
 
  p=new node;//*****
 
  if(p==NULL)
 
  {
 
   cout<<"no memory give you!"<<endl;
 
   exit(0);
 
  }
 
  cin>>e;
 
  p->data=e;//*****
 
   p->next=L->next;//*****
 
   L->next=p;//******
 
 }
 
  
 
 }
 
//用冒泡排序法对已经建立好的链表进行排序
 
/**/
 
void sort_Bubble(link &L)
 
{
 
 int flag=0,end=L->data,tem;
 
 
 
 while(end!=1)
 
 {
 
  node *p=NULL,*q=NULL;
 
  p=L->next;
 
  while(p)
 
  { 
 
   q=p;
 
   p=p->next;
 
   if(p)
 
   if(q->data>p->data)
 
   {
 
    tem=p->data;
 
    p->data=q->data;
 
    q->data=tem;
 
    flag=1;//只要有交换就变为1,否则,说明本来就是升序的。 
 
   }
 
  }
 
  if(flag==0)
 
   break; 
 
  end--;
 
 }
 
 
 
 
 
 
 
 } 
 
void show(link &L)
 
{
 
 node *p=L;
 
// cout<<"L("<<p->data<<"): ";
 
 p=p->next; 
 
 while(p)
 
 {
 
  cout<<p->data<<" ";
 
  p=p->next;
 
 }
 
 cout<<endl;
 
}
 
//合并两个增序链表,仍然用原来的空间 
 
void mergelist(link &L1,link &L2,link &L3)
 
{
 
 node *p1=L1->next,*p2=L2->next,*p3=NULL,*q=NULL;
 
 L3=p3=L1;
 
 while(p1&&p2)
 
 {
 
  if(p1->data<p2->data)
 
  {
 
   p3->next=p1;
 
   p3=p1;
 
   p1=p1->next;
 
  }
 
  else if(p1->data>p2->data)
 
  {
 
   p3->next=p2;
 
   p3=p2;
 
   p2=p2->next;
 
  }
 
  else
 
  {
 
   p3->next=p1;
 
   p3=p1;
 
  p3->next=p2;
 
   p1=p1->next;
 
   p2=p2->next;
 
  }
 
 }
 
 p3->next=p1?p1:p2;
 
 delete L2;
 
 
 
 }
 
int main()
 
{
 
 link L1,L2,L3;
 
 cout<<"make the first linked list"<<endl;
 
 createlist_head(L1);
 
 show(L1);
 
 sort_Bubble(L1);
 
 show(L1);
 
 cout<<"make the second linked list"<<endl;
 
 createlist_head(L2);
 
 show(L2);
 
 sort_Bubble(L2);
 
 show(L2);
 
 mergelist(L1,L2,L3);
 
 show(L3);
 
 } 
  • 22
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

try again!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值