求助!大神能帮我在单链表里添加一个逆置功能么
程序如下面:/*单链表的创建及 增删改查*/ #include <iostream>
using namespace std;
struct ChainNode //结构体构造链表的指针域和数据域
{
int data; //节点数据
ChainNode *link; //节点指针
};
//////////////创建n个节点 并返回链表头指针///////////
ChainNode* CreatNode(int n)
{
int ncount = 0; //计数节点个数
ChainNode *pNew,*pCur; //新建节点和当前节点
ChainNode *head = NULL; //保存第一个节点指针的附属节点 及头指针开始为空
if (n<1) //没有节点 返回头节点
{
return head;
}
pNew = new ChainNode; //创建新节点并输入整形数据
cout<<"请输入数据:";
cin>>pNew->data;
while (1) //将节点添加到链表
{
if (NULL == head) //添加第一个节点
{
head = pNew; //头指针指向第一个节点
}
else //添加后面的节点
{
pCur->link = pNew; //当前指针指向新建节点
}
pCur = pNew; //当前节点有移动到新建节点
ncount++; //节点数量加1
if (ncount>=n) //创建完要求的节点后,退出
{
break;
}
pNew = new ChainNode; //再次创建节点,完成n个节点
cout<<"请输入数据:";
cin>>pNew->data;
}
pCur->link = NULL; //最后的节点指向空
return head; //返回头指针
}
//////////////输出链表头节点///////////////////////
void OutList(ChainNode *head) //参数为头指针 从头指针开始
{
cout<<"链表元素输出如下:"<<endl;
ChainNode *pCur = head; //建立一个新节点指向头节点
while (pCur != NULL) //没有指向空节点,则链表没结束 输出链表元素
{
cout<<pCur->data<<" ";
pCur = pCur->link; //当前节点指向下一个节点 可以遍历链表
}
cout<<endl;
}
/* 实现节点数据 插入(增),删除,搜索节点数据(查)*/
//////////// 获取链表节点的长度 //////////////////////////////
int GetList_Length(ChainNode *head)
{
int listLen=0; //用于保存链表的长度
ChainNode *pCur = head; //当前指针指向头指针 PCur用于遍历链表
while (NULL != pCur) //未到最后节点 统计节点个数
{
listLen++;
pCur = pCur->link; //当前节点指向下一个节点 可以遍历链表
}
return listLen; //返回链表节点的个数
}
////////////在链表最后添加n个节点///////////
ChainNode* AddNode(ChainNode* head, int n)
{
int len = GetList_Length(head); //获取链表开始时的总长度
ChainNode *pNew,*pCur; //新添加节点和当前节点
pCur = head;
// 如果当前节点为空,则提示 不为空则在有的链表节点后插入n个节点
//并将当前最后一个节点的指针指向新添加第一个节点, 最后一个添加的节点指向空
if (NULL == pCur->link)
{
cout<<"当前链表为空!添加失败"<<endl;
}
else
{
while (NULL != pCur->link) //找到最后一个节点
{
pCur = pCur->link;
}
pNew = new ChainNode; // 新建一个节点
cout<<"请输入数据:";
cin>>pNew->data;
int ncount = 0; //插入n个节点 ncount 计数
while (1)
{
pCur->link = pNew; //当前指针指向新建节点
pCur = pNew; //当前节点有移动到新建节点
ncount++; //节点数量加1
if (ncount>=n) //创建完要求的节点后,退出
{
break;
}
pNew = new ChainNode; //再次创建节点,完成n个节点
cout<<"请输入数据:";
cin>>pNew->data;
}
pCur->link = NULL; //最后的节点指向空
}
return head; //返回头指针
}
////////////在链表中插入1节点/////////////////
ChainNode* InsertNode(ChainNode* head, unsigned num)//在第num个节点之前插入一个节点
{
int len = GetList_Length(head); //获取链表开始时的总长度
if (num<1 || num>len) //不存在第num个元素,溢出返回头head
{
cout<<"不存在这个节点!"<<endl;
return head;
}
ChainNode *pCur; //当前节点
pCur = head; //当前节点指针指向头指针
ChainNode* inser = new ChainNode;
cout<<"输入要插入的节点的数据:";
cin>>inser->data;
//插链表的四种情况:1. 在空链表中插入 2.插入的节点是第一个节点
//3.链表第一个节点和最后一个节点中插入一个节点4. 最后一个节点中插入一个节点
if (NULL == pCur) //在空链表中插入
{
pCur = inser;
inser->link = NULL;
}
if (1 == num) //及插入的节点是第一个节点 这里head 返回的第一个节点,所有插入的还是第二个节点
{
pCur = pCur->link;
head->link = inser;
inser->link = pCur;
}
else if (num>1 && num<=len) //在链表第一个节点和最后一个节点中插入一个节点
{
int ncount=0; //找到第num节点的前一个节点 ncount为节点计数
ChainNode* temp; //保存第num-1个节点
while (ncount != num-1)
{
ncount++;
temp = pCur;
pCur = pCur->link; //移动节点
}
//在第num前一个节点插入inser 首先将第num-1个节点指向inser ,再将inser指向第num个节点
temp->link = inser;
inser->link = pCur;
}
else if (len == num) //在最后一个节点中插入一个节点 调用添加函数
{
AddNode(head, 1);
}
return head; //返回头指针
}
////////////在链表中删除1节点/////////////////
ChainNode* DeleteNode(ChainNode* head, unsigned num) //删除第num个节点
{
int len = GetList_Length(head); //获取链表开始时的总长度
if (num<1 || num>len) //不存在第num个元素,溢出返回头head
{
cout<<"不存在这个节点!"<<endl;
return head;
}
ChainNode *pCur; //新添加节点和当前节点
pCur = head; //当前节点指针指向头指针
//这里只考虑删除链表中间的元素 首先定位到第num节点的前一个节点,然后删除下一个节点
int ncount = 0; //找到第num节点的前一个节点 ncount为节点计数
ChainNode* temp; //保存第num-1个节点 但当前节点已经指向了第num个节点
while (ncount != num-1)
{
ncount++;
temp = pCur;
pCur = pCur->link; //移动节点
}
//将第num-1个节点和第num节点的后一个节点连接,再释放第num个节点
temp->link = pCur->link;
delete pCur;
return head;
}
////////////在链表中查询节点数据/////////////////
ChainNode* SearchNode(ChainNode* head, int data) //data为要查询的数据 输出所有的data
{
ChainNode *pCur; //当前节点
pCur = head; //当前节点指针指向头指针
bool flag = false; //标志是否找到
int len = GetList_Length(head); //获取链表开始时的总长度
int ncount = 0; //节点计数
while (1)
{
ncount++;
if ( pCur->data == data ) //找到则打印
{
cout<<data<<"存在链表的第"<<ncount<<"个节点"<<endl;
flag = true;
}
pCur = pCur->link; //指针向下一个节点移动
if (len == ncount)
{
break; //搜索完毕,退出
}
}
if (false == flag) //如果全部搜索完毕,,没找到data 则提示
{
cout<<"在链表中没有找到"<<data<<endl;
}
return head;
}
int main()
{
int num;
//创建num个节点并显示
cout<<"输入要创建的链表节点个数:";
cin>>num;
ChainNode *head = CreatNode(num);
OutList(head);
//在已有节点后增加addnum个元素
int addnum;
cout<<"输入要添加的元素个数:";
cin>>addnum;
AddNode(head,addnum);
OutList(head);
//在链表中第inser个位置插入一个元素
int inser;
cout<<"输入要插入节点的第几个位置:";
cin>>inser;
InsertNode(head, inser);
OutList(head);
//删除第delnum个节点
int delnum;
cout<<"输入要删除节点的第几个位置:";
cin>>delnum;
DeleteNode(head, delnum);
OutList(head);
//在链表中搜索节点元素
int searchnum;
cout<<"输入要查找的数据元素:";
cin>>searchnum;
SearchNode(head, searchnum);
system("pause");
return 0;
}