/********************************************************************
* 版本 :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
}
* 版本 :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;
}