单链表的实现.docx
《单链表的实现.docx》由会员分享,可在线阅读,更多相关《单链表的实现.docx(16页珍藏版)》请在冰豆网上搜索。
![单链表的实现.docx](https://file1.bdocx.com/fileroot1/2023-1/2/42194a26-8d40-47eb-9fe4-23e34bcac24f/42194a26-8d40-47eb-9fe4-23e34bcac24f1.gif)
单链表的实现
实验三:
单链表的实现
电信081王智杰0808140512
一、问题描述
实现单链表的顺序存储和插入、删除、查找、遍历、清空,并加上统计,建立,求最大值操作。
二、需求分析
1、简述程序的基本功能
构造、析构、插入、删除、取值、赋值、查找清空,统计,建立,最大值操作等操作
2、输入的形式和输入值的范围
输入数字0~9,选择功能
3:
输出的形式:
选1:
选2
选3
选4:
选5:
选6:
选7:
选8:
选9:
3、测试数据要求
可以输入一组数:
1,2,3,a,b,c
显示:
三、概要设计
1、抽象数据类型
template
classLinkList
LinkNode*first;
public:
LinkList()
LinkList(constT&x)
~LinkList(){makeEmpty();}
voidmakeEmpty();
intLength()const;
LinkNode*getHead()
intSearch(Tx);
LinkNode*Locate(inti);
boolgetData(inti,T&x)const;
voidsetData(inti,T&x);
boolInsert(inti,T&x);
boolRemove(inti,T&x);
boolIsEmpty()const
boolIsFull()const{returnfalse;}
voidSort();
voidinput(inti);
voidoutput();
LinkNode*max();
voidcreate(T
*a,intn);
LinkList
-*firstLinkNode
+Length()int
+*getHead()LinkNode
+Insert(inti,T&x)void
+makeEmpty()void
+Isempty()bool
+input(int)void
+output()void
+IncreaseSize()void
+*max()LinkNode
+*Locate(inti))LinkNode
+Sort()void
LinkNode
DataT
*next
流程图
四、详细设计(要求主要变量和语句加注释)
1、#include//LinkList.h
usingnamespacestd;
template
structLinkNode{//LinkNode结构体的定义
Tdata;
LinkNode*next;
LinkNode(LinkNode*ptr=NULL){next=ptr;}
LinkNode(constT&item,LinkNode*ptr=NULL)
{data=item;next=ptr;}
};
template//LinkList类的定义
classLinkList
{
protected:
LinkNode*first;
public:
LinkList(){first=newLinkNode;}
LinkList(constT&x)
{
first=newLinkNode(x);
LinkNode*newNode;
newNode->next=first;
first=newNode;}
~LinkList(){makeEmpty();}
voidmakeEmpty();
intLength()const;
LinkNode*getHead()const{returnfirst;}
intSearch(Tx);
LinkNode*Locate(inti);
boolgetData(inti,T&x)const;
voidsetData(inti,T&x);
boolInsert(inti,T&x);
boolRemove(inti,T&x);
boolIsEmpty()const
{returnfirst->link==NULL?
true:
false;}
boolIsFull()const{returnfalse;}
voidSort();
voidinput(inti);
voidoutput();
LinkNode*max();
voidcreate(T*a,intn);
voidtidyup();
};
template//LinkList类的实现
voidLinkList:
:
makeEmpty()
{LinkNode*q;
while(first->next!
=NULL)
{q=first->next;
first->next=q->next;
deleteq;
}
};
template
intLinkList:
:
Length()const
{LinkNode*p=first->next;intcount=0;
while(p!
=NULL)
{p=p->next;count++;}
returncount;
};
template
intLinkList:
:
Search(Tx)
{LinkNode*p=first->next;inti=0;
while(p!
=NULL)
{if(p->data==x)i++;
p=p->next;}
returni;
};
template
LinkNode*LinkList:
:
Locate(inti)
{if(i<0)returnNULL;
LinkNode*p=first;
intk=0;
while(p!
=NULL&&k
{p=p->next;k++;}
returnp;
};
template
boolLinkList:
:
getData(inti,T&x)const
{if(i<=0)returnNULL;
LinkNode*p=Locate(i);
if(p==NULL)returnfalse;
else{x=p->data;returntrue;}
};
template
voidLinkList:
:
setData(inti,T&x)
{if(i<=0)return;
LinkNode*p=Locate(i);
if(p==NULL)return;
elsep->data=x;
};
template
boolLinkList:
:
Insert(inti,T&x)
{LinkNode*p=Locate(i-1);
if(p==NULL)returnfalse;
LinkNode*newNode=newLinkNode(x);
newNode->next=p->next;
p->next=newNode;
returntrue;
};
template
boolLinkList:
:
Remove(inti,T&x)
{LinkNode*p=Locate(i-1);
if(p==NULL||p->next==NULL)returnfalse;
LinkNode*del=p->next;
p->next=del->next;
x=del->data;deletedel;
returntrue;
};
template
voidLinkList:
:
output()
{LinkNode*p=first->next;inti=1;
while(p!
=NULL)
{cout<<"第"<
"<data<p=p->next;
i++;
}
};
template
voidLinkList:
:
input(inti)
{
LinkNode*newNode,*last;Tval;
makeEmpty();last=first;
for(intj=1;j<=i;j++)
{cout<<"请输入第"<"<cin>>val;
newNode=newLinkNode(val);
last->next=newNode;
last=newNode;
}
};
template
LinkNode*LinkList:
:
max()
{LinkNode*max,*p;
p=first;max=p;
while(p->next!
=NULL)
{p=p->next;
if(max->data<=p->data)
{max=p;}
}
returnmax;
};
template
voidLinkList:
:
create(T*a,intn)
{intj;
LinkNode*newNode,*last;
makeEmpty();last=first;
/*cout<<"请输入数组的个数"<cin>>i;
chara[i];
for(intj=1;j<=i;j++)
{cout<<"请输入第"<"<cin>>val;
a[j-1]=val;
}*/
for(j=1;j<=n;j++)
{newNode=newLinkNode(a[j-1]);
last->next=newNode;
last=newNode;
}
cout<<"创建成功!
"<};
/*template
voidLinkList:
:
tidyup()
{LinkNode*newNode,*p,*del;
newNode=first->next;p=newNode->next;
while(p!
=NULL)
{if(newNode->data=p->data)
del=p->next;
p->next=del->next;
deletedel;
p=p->next;}*/
2、#include//LinkList.cpp
#include"LinkList.h"
intmain()
{inta,i;LinkListnewlist;charm;chard[5]={'a','b','c','d','e'};
while(a)
{cout<<"========================================="<cout<<"单链表"<cout<<"
(1)输入单链表数据"<cout<<"
(2)显示单链表数据"<cout<<"(3)定位"<cout<<"(4)最大值"<cout<<"(5)统计"<cout<<"(6)插入"<cout<<"(7)清空单链表"<cout<<"(8)数组创建单链表"<cout<<"(9)删除"<cout<<"PS:
1、必须先输入数据才能进行其他操作"<cout<<"2、只读取输入的第一个字符"<cout<<"========================================="<cin>>a;
switch(a)
{case1:
cout<<"请输入表中元素的个数:
"<cin>>i;
newlist.input(i);break;
case2:
if(newlist.Length()==0)cout<<"表为空,返回主菜单输入"<elsenewlist.output();break;
case3:
loop1:
cout<<"请输入要查找的位置:
"<cin>>i;
if(newlist.Locate(i)!
=NULL)
{cout<<"第"<data<elsecout<<"您输入的位置有误!
"<case4:
if(newlist.Length()==0)cout<<"表为空,返回主菜单输入"<elsecout<<"最大值是"<data<case5:
if(newlist.Length()==0)cout<<"表为空,返回主菜单输入"<else{cout<<"输入要统计的值"<cin>>m;
cout<<"共有";cout<case6:
if(newlist.Length()==0)cout<<"表为空,返回主菜单输入"<else{loop:
cout<<"请输入要插入的位置:
"<cin>>i;
cout<<"请输入要插入的数据:
"<cin>>m;
while(!
newlist.Insert(i,m))
{cout<<"插入失败请重新插入:
"<cout<<"插入成功!
"<case7:
newlist.makeEmpty();cout<<"清空成功!
"<case8:
newlist.create(d,5);break;
case9:
if(newlist.Length()==0)cout<<"表为空,返回主菜单输入"<else{cout<<"输入要删除的位置:
"<cin>>i;
if(newlist.Remove(i,m))cout<<"删除成功!
"<case0:
break;
default:
cout<<"没有该选项"<}
return0;}
五、调试分析
1、出现了链表的位置,和预定的位置有误,再分析流程之后,修改了几个参数后,得到解决。
2、修复了未输入链表,直接进行其他操作出现的BUG。
3、测试结果
列出几组输入和输出结果,输入集应多于需求分析的数据。
可以输入一组数:
1,2,3,a,b,c
显示:
定位操作:
求最大值:
统计元素
在第四个位置插入a
显示
用数组A[5]={‘a’‘b’‘c’‘d’‘e’}创建链表: