大体思路:
1. 建立非递减的链表
2. 将递减的链表逆转
3. 通过有序表的合并求出非递增链表
#include <bits/stdc++.h>
using namespace std;
typedef struct Del
{
int data;
struct Del *next;
}LNode,*LinkList;
void LocateList(LinkList L,int a,int &i);
void Listinset(LinkList &H,int i,int e);
void CreatList(LinkList &L);
void mergelist(LinkList &LA,LinkList &LB,LinkList &LC);
void re(LinkList &L);
int main()
{
LinkList LA;
LinkList LB;
LinkList LC;
CreatList(LA);
re(LA);
CreatList(LB);
re(LB);
mergelist(LA,LB,LC);
LC=LC->next;
while(LC)
{
cout<<LC->data<<' ';
LC=LC->next;
}
cout<<endl;
return 0;
}
void LocateList(LinkList L,int a,int &i)
{ //查找第1个大于a的节点位置i
LNode *p;
int t=1;
p=L->next;
while(p)
{
if(p->data>=a)
{
i=t;
break;
}
p=p->next;
t++;
}
if(!p) i=t;//当链表为空或查找失败
}
void Listinset(LinkList &H,int i,int e)
{ //将e插入指定位置
LNode *s;
LNode *p;
s=new LNode;
s->data=e;
p=H;
for(int j=0;j<i-1;j++)
p=p->next;
s->next=p->next;
p->next=s;
}
void CreatList(LinkList &L) //引用传递,直接对实参进行操作
{// 非递减有序链表创建
int n,e,i;
L=new LNode;
L->next=NULL;
while(cin>>n&&n!=0) //接收到0时退出循环
{
e=n;
LocateList(L,e,i);
Listinset(L,i,e);
}
}
void mergelist(LinkList &LA,LinkList &LB,LinkList &LC)
{// 非递减链表的合并
LNode *pa;
LNode *pb;
LNode *pc;
pa=LA->next;
pb=LB->next;
LC=LA;
pc=LC;
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
else
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
}
pc->next=pa?pa:pb;
delete LB; //释放链表LB的头节点
}
void re(LinkList &L) //链表的逆转
{
LNode *p;
LNode *q;
LNode *pr;
p=L->next;
q=NULL;
L->next=NULL;
while(p)
{
pr = p->next;
p->next = q;
q = p;
p = pr;
}
L->next = q;
}