鏈表的實現

#include
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章