链表的插入、删除

/********************************************************************
 * 版本 :1.0.0
 * 功能 :实现链表的插入、删除、输出
 * 完成日期 :2013-9-17
 * 作者 :Vincent
 * 说明 :在实现的链表中,头结点head不存储数据,但是在链表中,头结点
 *        也可以存储数据,不存储数据可以方便操作,但浪费空间。
 *******************************************************************/
#include <iostream>
using namespace std;


struct List{
//在链表中存储的数据
int data;
//指向下一个节点
List *next;
};


//向链表中插入一个节点
bool insertNode(List *head, int pos, int data);
//从链表中删除一个节点
bool deleteNode(List *head, int pos);
//输出链表
void outList(List *head);
//删除链表
bool deleteList(List *&head);


int main()
{
//申请一个头结点,头结点不存储数据,所以数据区可以不初始化
//见文件顶部说明
List *head = new List;
//头结点的next初始化为NULL
head->next = NULL;
//输出初始的链表
cout<<"初始化的链表:";
outList(head);
//向链表中插入数据1,2和3
insertNode(head,0,1);
insertNode(head,1,2);
insertNode(head,1,3);
//输出插入数据之后的链表
cout<<"插入数据之后的链表:";
outList(head);
//从链表中删除第二个数据
deleteNode(head,1);
//输出删除数据之后的链表
cout<<"删除链表第二个数据:";
outList(head);
//最后删除链表
deleteList(head);
return 0;
}


/************************************************************************
 * 函数名称 : insertNode
 * 函数作用 : 向链表中插入一个数据节点
 * 输入参数 : head -- 链表的头节点 pos -- 插入的位置 data -- 插入的数据
 * 输出参数 : 无
 * 返回值   : 插入成功返回true,否则返回false
 * 其他说明 : 无
 ***********************************************************************/
bool insertNode(List *head, int pos, int data)
{
//如果链表不存在
if(head == NULL)
{
return false;
}
//插入位置的前一个节点
List *prv = head;


//向后搜索要插入的位置
for(int i = 0;i < pos;i++)
{
//插入位置的前一个节点向后移动
prv = prv->next;


//如果在搜索到位置之前到达了链表尾部
if(prv == NULL)
return false;
}


//申请一个新的节点空间
List *node = new List;
//为节点的数据空间赋值
node->data = data;
//将插入节点的next设为要插入位置的前一个节点的next,如图示:
//链表:head--->node--->node--->node--->prv--->node--->node--->NULL
//                                              ↑
//                          要插入的节点  node---
node->next = prv->next;
//将插入位置的前一个节点的next设为要插入的节点,如图示:
//链表:head--->node--->node--->node--->prv    node--->node--->NULL
//                                      ↓      ↑
//                        要插入的节点   ->node--
prv->next = node;
return true;
}


/************************************************************************
 * 函数名称 : deleteNode
 * 函数作用 : 删除链表中一个节点
 * 输入参数 : head -- 链表的头节点 pos -- 删除的位置
 * 输出参数 : 无
 * 返回值   : 删除成功返回true,否则返回false
 * 其他说明 : 无
 ***********************************************************************/
bool deleteNode(List *head, int pos)
{
//如果链表不存在
if(head == NULL)
{
return false;
}


//删除位置的前一个节点
List *prv = head;


//向后搜索要删除的位置
for(int i = 0;i < pos;i++)
{
//删除位置的前一个节点向后移动
prv = prv->next;


//如果在搜索到位置之前到达了链表尾部
if(prv == NULL)
return false;
}

//找到删除节点node
List *node = prv->next;
//将要删除的前一个节点的next设为删掉节点的next,如图示:
//                                          将要删除的节点
//                                              ↓
//链表:head--->node--->node--->node--->prv    node--->node--->node--->NULL
//                                      ↓              ↑
//                                      -----------------
prv->next = node->next;
//如果将要删除的节点不为空
if(NULL != node)
{
//释放节点空间
delete node;
}
return true;
}


/************************************************************************
 * 函数名称 : outList
 * 函数作用 : 输出链表数据
 * 输入参数 : head -- 链表的头节点
 * 输出参数 : 无
 * 返回值   : 插入成功返回true,否则返回false
 * 其他说明 : 无
 ***********************************************************************/
void outList(List *head)
{
//如果链表不存在
if(head == NULL)
{
return;
}


//从链表第一个有数据的节点开始
List *tmp = head->next;
while(tmp !=NULL)
{
//输出每一个数据
cout<<tmp->data<<"-->";
tmp = tmp->next;
}
//输出NULL代表到达链尾
cout<<"NULL"<<endl;
}


/************************************************************************
 * 函数名称 : outList
 * 函数作用 : 输出链表数据
 * 输入参数 : head -- 链表的头节点
 * 输出参数 : 无
 * 返回值   : 插入成功返回true,否则返回false
 * 其他说明 : 无
 ***********************************************************************/
bool deleteList(List *&head)
{
//如果链表不存在
if(head == NULL)
{
return false;
}


//搜索链表,逐个删除链表中的节点
//逐个删除时,要被删除的节点
List *prv = head;
//逐个删除时,要被删除的节点的下一个节点
List *next = prv->next;
//遍历链表,并删除节点
while(next != NULL)
{
//删除一个节点
delete prv;
//将要删除的结点后移
prv = next;
next = prv->next;
}
//将头结点赋值为NULL

head = NULL;

delete prv;

return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值