实验题目: 单链表的操作
实验目的:
(1)掌握线性表的链式存储结构
(2)掌握单链表及其基本操作的实现。
实验要求:
(1)编程实现单链表的以下基本操作:建立单链表,查找单链表,插入单链表,删除单链表。
(2)采用单链表结构编程实现:两个有序单链表的归并运算。
实验代码:
#include<iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
int InitList(LinkList &L);
void CreateList(LinkList &L);
int GetElem(LinkList &L,int i);
int LocateElem(LinkList L,int e);
int ListDelete(LinkList &L,int i);
int ListInsert(LinkList &L,int i,int e);
void ShowList(LinkList &L);
void MergeList(LinkList &LA,LinkList &LB,LinkList &LC);
int main()
{
LinkList L;
InitList(L);
int state;
cout<<"===========单链表操作==============="<<endl;
cout<<"1.CreateList 2.LocateElem 3.GetElem "<<endl;
cout<<"4.ListDelete 5.ListInsert 6.ShowList"<<endl;
cout<<"7.MergeList "<<endl;
cout<<"===================================="<<endl;
cout<<"input number to choose function:";
cin>>state;
while(state)
{
switch (state)
{
case 1:CreateList(L); break;
case 2:
int n;cout<<"pealse input num tho locate:";cin>>n;LocateElem(L,n); break;
case 3:
int n1;cout<<"pealse input site to get:";cin>>n1;GetElem(L,n1); break;
case 4:
int n2;cout<<"pealse input site to delete:";cin>>n2;ListDelete(L,n2); break;
case 5:
int n3;cout<<"pealse input site:";cin>>n3;
int n4;cout<<"pealse input elem:";cin>>n4;
ListInsert(L,n3,n4); break;
case 6:ShowList(L); break;
case 7:
LinkList LA;
cout<<"LA:";
InitList(LA);
CreateList(LA);
LinkList LB;
cout<<"LB:";
InitList(LB);
CreateList(LB);
LinkList LC;
InitList(LC);
MergeList(LA,LB,LC);
cout<<"Merge result:";
ShowList(LC);
}
cout<<"===========单链表操作==============="<<endl;
cout<<"1.CreateList 2.LocateElem 3.GetElem "<<endl;
cout<<"4.ListDelete 5.ListInsert 6.ShowList"<<endl;
cout<<"7.MergeList "<<endl;
cout<<"===================================="<<endl;
cout<<"input number to choose function:";
cin>>state;
}
return 0;
}
int InitList(LinkList &L)
{
L=new LNode;
L->next=NULL;
cout<<"init list succeed"<<endl;
return 0;
}
void CreateList(LinkList &L)
{
L=new LNode;
L->next=NULL;
LinkList r=L;
int n;
cout<<"pealse input the number of elems:";
cin>>n;
int *arr=new int[n];
cout<<"pealse input elem:";
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
for(int i=0;i<n;i++)
{
LinkList p=new LNode;
p->data=arr[i];
p->next=NULL;
r->next=p;
r=p;
}
}
int GetElem(LinkList &L,int i)
{
LinkList p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
{
cout<<"can't get elem"<<endl;
return 1;
}
cout<<"get elem:"<<p->data<<endl;
}
int LocateElem(LinkList L,int e)
{
LinkList p=L->next;
int j=0;
while(p&&p->data!=e)
{
p=p->next;
j++;
}
if(p->data==e)
{
cout<<"find elem locate in "<<j+1<<endl;
return 0;
}
else
{
cout<<"no elem"<<endl;
return 1;
}
}
int ListInsert(LinkList &L,int i,int e)
{
LinkList p=L;
int j=0;
while(p&&(j<i-1))
{
p=p->next;
++j;
}
if(!p||j>i-1)
{
cout<<"can't insert elem"<<endl;
return 1;
}
else
{
LinkList s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
cout<<"insert succeed"<<endl;
return 0;
}
}
int ListDelete(LinkList &L,int i)
{
LinkList p=L;
int j=0;
while((p->next)&&(j<i-1))
{
p=p->next;
++j;
}
if(!(p->next)||(j>i-1))
{
cout<<"can't delete elem"<<endl;
return 1;
}
else
{
LinkList q=p->next;
p->next=q->next;
delete q;
cout<<"delete succeed"<<endl;
return 0;
}
}
void ShowList(LinkList &L)
{
LinkList p=L->next;
cout<<"LinkList:";
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
void MergeList(LinkList &LA,LinkList &LB,LinkList &LC)
{
LinkList pa=LA->next;
LinkList pb=LB->next;
LC=LA;
LinkList pc=LC;
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
delete LB;
}