C++单链表实验
实验目的:
1. 熟练掌握链式存储结构的特点;
2. 熟练掌握单链表的基本操作算法,包括插入、删除、按值或按序号查找、输出、创建等;
3. 能灵活使用链表解决具体的问题;
实验内容:
1.定义单链表类,封装单链表的基本操作算法;
2.在主函数中定义单链表类对象,并调用成员函数,验证单链表的所有基本操作。
实现代码:
#include
#include <malloc.h>
#include <math.h>
using namespace std;
typedef struct node //结点类型
{
int data;//数据域
node* next;//指针域
}node;
class LinkList//单链表类的定义
{
public:
LinkList(int N=0)
{
CreateList(N);
len=GetLength();
}
node* head;//头结点指针
int len;//元素个数
public:
void CreateList(int n);
int GetLength();
void PrintList();
int SearchNode(int data);
bool InsertNode(int pos,int data);
bool DeleteNode(int pos);
void Reverse();
bool IsLoop();
void SelfASOrder();
void ASCMerge(LinkList& L);
void DESCMerge(LinkList& L);
private:
void QuikSort(node* start,node* end);
};
void LinkList::CreateList(int n)//根据输入创建单链表
{
head = new node;
head->data=0;
head->next=NULL;
node *p,*q;
int temp;
q=head;
while(n–)
{
cin>>temp;
p=new node;
p->data=temp;
p->next=NULL;
q->next=p;
q=p;
p=NULL;
}
q=NULL;
delete q;
}
void LinkList::PrintList()//打印单链表的每一个元素
{
len=GetLength();
int l=len;
node* p=head->next;
while(l--)
{
cout<<p->data<<" ";
p=p->next;
}
p=NULL;
delete p;
cout<<endl;
}
int LinkList::GetLength()//获取单链表的长度
{
int l=0;
node* p=head;
while((p->next)!=NULL)
{
l++;
p=p->next;
}
return l;
}
int LinkList::SearchNode(int data)//查找某个元素在单链表中的位置
{
int locate=0;
node *p=head->next;
while(len–)
{
if(p->data==data)
{ locate=10-len;
break;
}
p=p->next;
}
return locate;
}
bool LinkList::InsertNode(int pos,int data)//插入节点
{
len=GetLength();
if(pos>len)//插入位置超出范围
return false;
node* p=head->next;
if(0==pos)
{
p=head;
node* q = new node;
q->data=data;
q->next=p->next;
p->next=q;
p=NULL;
q=NULL;
delete p;
delete q;
len++;
return true;
}
else
{
pos=pos-1;
while(pos--)
{
p=p->next;
}
node* q = new node;
q->data=data;
q->next=p->next;
p->next=q;
p=NULL;
q=NULL;
delete p;
delete q;
len++;
return true;
}
}
bool LinkList::DeleteNode(int pos)
{
len=GetLength();
if(pos>=len)
return false;
node* p=head;
pos=pos-1;
while(pos–)
{
p=p->next;
}
node* q=p->next;
p->next=p->next->next;
delete q;
q=NULL;
len++;
return true;
}
void LinkList::Reverse()
{
node *p,q,r;
if(head->nextNULL)
{
return;
}
p=head->next;
q=p->next;
p->next=NULL;
while(q!=NULL)
{
r=q->next;
q->next=p;
p=q;
q=r;
}
head->next=p;
}
bool LinkList::IsLoop()
{
node p=head->next;
node q=head->next->next;
while((q!=NULL)&&(p!=q))
{
p=p->next;
q=q->next->next;
}
if(pq)
return true;
else
return false;
}
void LinkList::SelfASOrder()//升序排列,采用快速排序的方法
{
node start,end;
int len=GetLength();
start=head->next;
end=start;
while((end->next)!=NULL)
end=end->next;
QuikSort(start,end);
}
void LinkList::QuikSort(node start,nodeend)
{
if(start==end)
return;
int Len=0;
node* st=start;
node* en=end;
while(st!=en)
{
st=st->next;
Len++;
}
double x=Len/2.0;
double xL=floor(x);
double xU=ceil(x);
double HalfLen=x;
int L=xL;
int U=xU;
node* mid=start;
node* midl=start;
while(U--)
{
mid=mid->next;
}
while(L--)
{
midl=midl->next;
}
node* s=start;
node* m=mid;
int flag=0;
for(int i=0;i<xL+1;++i)
{
flag=midl-start+1;
if((s->data)>(m->data))
{
s->data^=m->data;//交换
m->data^=(s->data);
s->data^=(m->data);
}
s=s->next;
m=m->next;
}
QuikSort(start,midl);
QuikSort(mid,end);
}
void LinkList::ASCMerge(LinkList& L)
{
this->SelfASOrder();
L.SelfASOrder();
node* q=(L.head)->next;
node* p=head->next;
int position=0;
while((p!=NULL)&&(q!=NULL))
{
if(q->datadata)
{
InsertNode(position,q->data);
q=q->next;
position++;
}
else
{
p=p->next;
position++;
}
}
position=GetLength();
while(q!=NULL)
{
InsertNode(position,q->data);
q=q->next;
position++;
}
}
void LinkList::DESCMerge(LinkList& L)
{
ASCMerge(L);
Reverse();
}
int main()
{
LinkList L(10);
cout<<“输入L1:”<<endl;
LinkList L1(15);
L.PrintList();
cout<<endl<<“查找数据:”<<endl;
int DataSearch=0;
cin>>DataSearch;
cout<<L.SearchNode(DataSearch)<<endl;
cout<<“插入数据:”<<endl;
int DataInsert=0;
cin>>DataInsert;
cout<<“插入数据位置:”<<endl;
int PosInsert=0;
cin>>PosInsert;
if(L.InsertNode(PosInsert,DataInsert))
{
cout<<“插入成功! 新的数据:”;
L.PrintList();
}
else
cout<<“插入失败!”<<endl;
cout<<“删除数据位置:”<<endl;
int PosDel=0;
cin>>PosDel;
if(L.DeleteNode(PosDel))
{
cout<<“删除成功! 新的数据:”;
L.PrintList();
}
else
{
cout<<“删除失败!”<<endl;
}
L.Reverse();
cout<<“新数据逆序:”;
L.PrintList();
L.SelfASOrder();
cout<<“数据排序:”;
L.PrintList();
LinkList L2;
L2=L;
L2.ASCMerge(L1);
cout<<“数据合并:”<<endl;
L2.PrintList();
LinkList L3;
L3=L;
L3.DESCMerge(L1);
cout<<“合并后数据从大到小排序:”<<endl;
L3.PrintList();
return 0;
}
测试结果:
说明:必须测试所有基本操作的算法,截图运行结果。
1.创建单链表及查找数据
2.插入数据
3.删除数据
4.数据逆序
5.数据排序
6.数据合并
7.合并后排序
遇到的问题及解决方法:
单链表的封装方法,主要是老师PPT上面,借鉴并采用以下封装方法。
public:
void CreateList(int n);
int GetLength();
void PrintList();
int SearchNode(int data);
bool InsertNode(int pos,int data);
bool DeleteNode(int pos);
void Reverse();
bool IsLoop();
void SelfASOrder();
void ASCMerge(LinkList& L);
void DESCMerge(LinkList& L);
其次就是算法设计的步骤,思路不清楚。在网上借鉴思维导图的方式更深的理解算法。并借鉴完成所有基础操作的算法设计。思维导图有效帮助我解决了算法设计中出现的一些困难问题。