1:结点定义
typedef struct LNode {
int data; //结点的数据域
struct LNode *next; //结点的指针域
}LNode, *LinkList; //LinkList为指向结构体LNode的指针类型
2:构造一个新的结点
bool InitList_L(LinkList &LNew,int nData = 0)//构造一个新的结点
{
LNew = new LNode; //生成新结点
if (nullptr == LNode) //生成结点失败
{
return false;
}
LNew->data = nData;
LNew->next = nullptr; //结点的指针域置空
return true;
}
3:前插法创建n个元素的单链表(将新结点插入到头结点之后)
void CreateList_H(LinkList &LHead,int n)//前插法创建n个元素的单链表(将新结点插入到头结点之后)
{
LinkList LNew; //定义一个指针变量
InitList_L(LHead);//先建立一个带头结点的空链表
int nData = 0;
while(n--)//前插法创建单链表...
{
nData++;
InitList_L(LNew,nData); //生成新结点LNew,值为n
LNew->next = LHead->next;
LHead->next = LNew; //将新结点LNew插入到头结点之后
}
}
4:尾插法创建n个元素的单链表(将新结点插入到尾结点之后)
void CreateList_R(LinkList &LHead, int n)//尾插法创建n个元素的单链表(将新结点插入到尾结点之后)
{
LinkList LNew, rTemp;
InitList_L(LHead);//先建立一个带头结点的空链表
rTemp = LHead; //尾指针r指向头结点
int nData = 0;
while(n--)//尾插法创建单链表...
{
nData++;
InitList_L(LNew,nData);//生成新结点
rTemp->next = LNew;//将新结点LNew插入尾结点*rTemp之后
rTemp = LNew;//rTemp指向新的尾结点LNew
}
}
5:单链表的取值(在带头结点的单链表LLink中查找第nIndex个元素,用nData记录L中第nIndex个数据元素的值)
//单链表的取值(在带头结点的单链表LLink中查找第nIndex个元素,用nData记录L中第nIndex个数据元素的值)
bool GetElem_L(LinkList LLink, int nIndex, int &nData)
{
if (nIndex <= 0)//nIndex值不合法i<=0
{
return false;
}
LinkList p = LLink->next;//p指向第一个结点(去掉头结点)
int j = 1; //j为计数器
while (j < nIndex && nullptr != p) //顺链域向后扫描,直到p指向第i个元素或p为空
{
p = p->next; //p指向下一个结点
j++; //计数器j相应加1
}
if (nullptr == p)//i值不合法i>n(扫到了末尾)
{
return false;
}
nData = p->data; //取第i个结点的数据域
return true;
}
6:按值查找(在带头结点的单链表LLink中查找值为nData的元素)
//按值查找(在带头结点的单链表LLink中查找值为nData的元素)
bool LocateElem_L(LinkList LLink, int nData)
{
LinkList p = LLink->next;
//顺链域向后扫描,直到p为空或p所指结点的数据域等于nData
while (nullptr != p && p->data != nData)
{
p = p->next; //p指向下一个结点
}
return (nullptr != p); //查找失败p为NULL
}
7:单链表的插入(在带头结点的单链表LLink中第nIndex个位置插入值为nData的新结点)
//单链表的插入(在带头结点的单链表LLink中第nIndex个位置插入值为nData的新结点)
bool ListInsert_L(LinkList &LLink, int nIndex, int nData)/
{
if (nIndex < 1)//nIndex<1
{
return false;
}
LinkList p = LLink;
int j = 0;
while (nullptr != p && j < nIndex - 1) //查找第nIndex-1个结点,p指向该结点
{
p = p->next;
j++;
}
if (nullptr == p)//i>n+1
{
return false;
}
LinkList LNew;
InitList_L(LNew,nData); //生成新结点
LNew->next = p->next; //将新结点的指针域指向结点ai
p->next = LNew; //将结点p的指针域指向结点s
return true;
}
8:单链表的删除(在带头结点的单链表LLink中,删除第nIndex个位置)
//单链表的删除(在带头结点的单链表LLink中,删除第nIndex个位置)
bool ListDelete_L(LinkList &LLink, int nIndex)
{
if (nIndex < 1)//当nIndex<1时,删除位置不合理
{
return false;
}
LinkList p = LLink;
int j = 0;
while((nullptr != p->next)&&(j < nIndex -1)) //查找第i-1个结点,p指向该结点
{
p = p->next;
j++;
}
if (nullptr == p->next)//当nIndex>n删除位置不合理
{
return false;
}
LinkList q = p->next; //临时保存被删结点的地址以备释放空间
p->next = q->next; //改变删除结点前驱结点的指针域
delete q; //释放被删除结点的空间
return true;
}
9:单链表的输出
//单链表的输出
void Listprint_L(LinkList LLink)
{
LinkList p = LLink->next;
while (nullptr != p)
{
cout<<p->data<<"\t";
p = p->next;
}
cout<<endl;
}
10:链表合并
LinkList LALink, LBLink, LcLink;
CreateList_R(LALink);//创建链表非递减LALink
CreateList_R(LBLink);//创建非递减链表LBLink
InitList_L(LcLink);//创建空链表LcLink
//链表LALink和链表LBLink合并后放入LcLink中
void mergelinklist(LinkList LALink, LinkList LBLink, LinkList &LcLink)
{
LinkList p = LALink->next; //p指向LALink的第一个元素
LinkList q = LBLink->next; //q指向LBLink的第一个元素
while(nullptr != p && nullptr != q)
{
if(p->data <= q->data)//把p指向的结点串起来
{
LcLink->next = p;
LcLink = p;
p = p->next;//p后移一个结点
}
else //把q指向的结点串起来
{
LcLink->next = q;
LcLink = q;
q = q->next;
}
}
LcLink->next = p ? p : q;//相当于if(p) r->next=p; else r->next=q;
}
delete LALink, LBLink, LcLink;
11:中间结点
//中间结点
LinkList findmiddle(LinkList LLink)
{
LinkList p = LLink; //p为快指针,初始时指向L
LinkList q = LLink; //q为慢指针,初始时指向L
while(nullptr != p && nullptr != p->next)
{
p = p->next->next;//p为快指针一次走两步;
q = q->next; //q为慢指针一次走一步
}
return q;//返回中间结点指针
}