#include "StdAfx.h"
#include "LList.h"
CLList::CLList(void)
{
phead=NULL;
ptail=NULL;
NumberOfNode=0;
}
CLList::~CLList(void)
{
}
void CLList::InsertNode(int InsertItem)
{
CNode* NewNode=new CNode;
NewNode->Item=InsertItem;
if (GetNumberOfNode()==0)//链表还没有创建
{
phead=ptail=NewNode;
NewNode->prenode=NULL;
NewNode->nextnode=NULL;
SetNumberOfNode(1);
return;
}
if (GetNumberOfNode()==1)
{
if (InsertItem<=phead->Item)//该元素应该插入到链表首
{
NewNode->nextnode=phead;
NewNode->prenode=NULL;
phead->prenode=NewNode;
phead=phead->prenode;
}
else//该元素应该插入到链表末
{
NewNode->nextnode=NULL;
NewNode->prenode=ptail;
ptail->nextnode=NewNode;
ptail=ptail->nextnode;
}
SetNumberOfNode(GetNumberOfNode()+1);
return;
}
//链表中至少有两个元素的情况
CNode* ptemp;//用于记录当前的指针位置
ptemp=phead;//初始化为链表头
while (ptemp!=ptail)
{
if (InsertItem<=ptemp->Item)
{
if (ptemp==phead)//插入链表头
{
NewNode->nextnode=phead;
NewNode->prenode=NULL;
phead->prenode=NewNode;
phead=phead->prenode;
}
else//插入链表中间
{
NewNode->nextnode=ptemp;
NewNode->prenode=ptemp->prenode;
ptemp->prenode->nextnode=NewNode;
ptemp->prenode=NewNode;
}
break;
}
ptemp=ptemp->nextnode;
}
if (ptemp==ptail)
{
if (InsertItem<=ptemp->Item)//插入最后一个元素之前
{
NewNode->nextnode=ptemp;
NewNode->prenode=ptemp->prenode;
ptemp->prenode->nextnode=NewNode;
ptemp->prenode=NewNode;
}
else//插入链表末
{
NewNode->nextnode=NULL;
NewNode->prenode=ptail;
ptail->nextnode=NewNode;
ptail=ptail->nextnode;
}
}
SetNumberOfNode(GetNumberOfNode()+1);
NewNode=NULL;
return;
}
void CLList::DeleteNode(int DeleteItem)
{
if (GetNumberOfNode()==0)
{
cout<<"链表中没有元素!"<<endl;
getchar();
return;
}
CNode* ptemp=phead;
while(ptemp!=ptail)
{
if (ptemp->Item==DeleteItem)
{
if (ptemp==phead)//删除头节点
{
phead=phead->nextnode;
phead->nextnode->prenode=NULL;
ptemp->nextnode=NULL;
free(ptemp);
ptemp=NULL;
}
else//删除中间节点
{
ptemp->prenode->nextnode=ptemp->nextnode;
ptemp->nextnode->prenode=ptemp->prenode;
ptemp->prenode=NULL;
ptemp->nextnode=NULL;
free(ptemp);
ptemp=NULL;
}
SetNumberOfNode(GetNumberOfNode()-1);
break;
}
ptemp=ptemp->nextnode;
}
if (ptemp==ptail)
{
if (ptemp->Item==DeleteItem)//删除末节点
{
ptemp->prenode->nextnode=NULL;
ptail=ptemp->prenode;
ptemp->prenode=NULL;
free(ptemp);
ptemp=NULL;
SetNumberOfNode(GetNumberOfNode()-1);
}
else
{
cout<<"您要删除的元素不存在!!"<<endl;
getchar();
}
}
return;
}
void CLList::ShowList()
{
if (GetNumberOfNode()==0)
{
cout<<"链表为空!!"<<endl;
getchar();
return;
}
CNode* ptemp=phead;
while(ptemp!=ptail)
{
cout<<ptemp->Item<<" ";
ptemp=ptemp->nextnode;
}
cout<<ptemp->Item<<endl;
cout<<"链表中共有"<<GetNumberOfNode()<<"个元素!"<<endl;
}
用C++实现双向链表
5星 · 超过95%的资源 需积分: 50 8 浏览量
2008-11-14
23:13:19
上传
评论 3
收藏 3KB RAR 举报
he0_0yan
- 粉丝: 0
- 资源: 7
最新资源
- 台达DOP系列触摸屏与DVP系列PLC通信电缆连接手册-20160122.pdf
- 计算机二级考试心得体会
- 织梦同步WAP插件(V1.4)
- linux之centos7打包与压缩命令详解
- (资源包名是松下不必介意实际是台达)台达PLC例程源码板式家具封边机
- (资源包名是松下不必介意实际是台达)台达PLC例程源码PLS交替输出(单按钮启停)
- (资源包名是松下不必介意实际是台达)台达PLC例程源码PLF指令(车库红绿灯控制)
- 织梦DedeCMS文章归档插件UTF-8和GBK版本
- (资源包名是松下不必介意实际是台达)台达PLC例程源码PLC与6台VFD-B的通讯
- doublescreen,MAXhub会议系统软件
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论4