链表的实现

#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
bool InitList(LinkList &L,int n)//这个函数是从表尾构建链表的方式
{//下面我自己写了一个从表头建立链表的函数
int i;
LinkList p;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
cout<<"Please input the "<<i<<" number:"<<endl;
cin>>p->data;
p->next=L->next;//将p插入到表头中
L->next=p;
}
return 1;
}
void TInitList(LinkList &L,int n)
{//这里比上面的函数多用了一个指针来指向链表的表尾,实际的实现基本一致
int i;
LinkList p,q;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
p=(LinkList)malloc(sizeof(LNode));
p=L;
for(i=1;i<=n;i++)
{
q=(LinkList)malloc(sizeof(LNode));
cout<<"Please input the "<<i<<" number:"<<endl;
cin>>q->data;
p->next=q;
p=q;
p->next=NULL;
}
}
void PrintList(LinkList &L)
{
LinkList p;
p=L->next;
while(p)
{
cout<<p->data<<"  ";
p=p->next;
}
cout<<endl;
}
bool InsertList(LinkList &L,int i,ElemType elem)
{
int j;
LinkList p,q;
p=L;j=0;
while(p && j<i-1)
{
p=p->next;
++j;
}
if(p || j>i-1) return 0;
q=(LinkList)malloc(sizeof(LNode));
q->data=elem;
q->next=p->next;//插入新的节点;
p->next=q;
return 1;
}
void UnionList(LinkList &La,LinkList &Lb,LinkList &Lc)//将链表La和Lb归并到Lc
{
LinkList pa,pb,pc;
pa=La->next;
pb=Lb->next;
pc=Lc=La;//将链表La的头指针作为新的链表的指针,这也是和线性表的差别,不用在建立新表的时候申请新的空间
while(pa && pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;//这里的pc指向了下一个节点,如果不懂的话可以换成pc=pc->next
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
pc->next=pa?pa:pb;//插入剩下的节点
free(Lb);//这里Lb成为唯一没有使用到节点,故可以直接删除掉,回收内存
}
}
int main()
{
LinkList La,Lb,Lc;
int num;
cout<<"Please input the mount that you want to input:"<<endl;
cin>>num;
InitList(La,num);
PrintList(La);
cout<<"Please input the mount that you want to input:"<<endl;
cin>>num;
TInitList(Lb,num);
PrintList(Lb);
UnionList(La,Lb,Lc);
PrintList(Lc);
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值