链表实现数据元素逆置是一个很常用的实例,在顺序表实现输入数据逆置那篇博客需要额外的一个逆置函数,在主函数中实现逆置还需要调用逆置函数。这一篇就全部用链表的知识来实现就地逆置并且输出逆置后的数据元素。
先要构建一个带头结点的单链表,再来重新定义结点类型,在主函数中实现就地逆置的代码为:
<span style="font-size:18px;">#include <iostream>
using namespace std;
#include <malloc.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode//定义链表的结点类型
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
int main()
{
LinkList L,q;
L=(LinkList)malloc(sizeof(LNode));//申请的头结点
L->next=NULL;
LinkList p=L;
cout<<"请输入链表的10个数据元素:";
for(int i=0;i<10;i++)
{
LinkList s=(LinkList)malloc(sizeof(LNode));//申请新的结点
cin>>s->data;//输入结点的数据元素
p->next=s;
p=s;
}
p->next=NULL;
p=L->next;
cout<<"链表顺序输出:";
while(p)//实现链表的顺序输出
{
cout<<p->data<<",";
p=p->next;
}
cout<<endl;
q=L->next;
L->next=NULL;
while(q)//实现链表就地逆置
{
p=q->next;
q->next=L->next;
L->next=q;
q=p;
}
p=L->next;
cout<<"逆置后输出:";
while(p)//就地逆置链表输出
{
cout<<p->data<<",";
p=p->next;
}
cout<<endl;
return 0;
}</span>
如果向链表输入的十个数据元素为:0 1 2 3 4 5 6 7 8 9
输出的结果为:
这样的输入感觉挺麻烦的,那么就来用产生随机数的方法来实现输入数据元素,并且把建立的逆置单链表实现独立算法与主函数区别开来。完整的代码为:
<span style="font-size:18px;">#include <iostream>
using namespace std;
#include <malloc.h>
#include <stdlib.h>
#include <ctime>
typedef int ElemType;
typedef struct LNode//定义链表的结点类型
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
int main()
{
srand(time(0));//实现每时每刻的随机种子
LinkList L,q;
L=(LinkList)malloc(sizeof(LNode));//申请的头结点
L->next=NULL;
LinkList p=L;
for(int i=0;i<10;i++)
{
LinkList s=(LinkList)malloc(sizeof(LNode));//申请新的结点
s->data=rand()%100+1;//将产生的10个随机数赋值结点的数据元素
p->next=s;
p=s;
}
p->next=NULL;
p=L->next;
cout<<"链表顺序输出:";
while(p)//实现链表的顺序输出
{
cout<<p->data<<",";
p=p->next;
}
cout<<endl;
q=L->next;
L->next=NULL;
while(q)//实现链表就地逆置
{
p=q->next;
q->next=L->next;
L->next=q;
q=p;
}
p=L->next;
cout<<"逆置后输出:";
while(p)//就地逆置链表输出
{
cout<<p->data<<",";
p=p->next;
}
cout<<endl;
return 0;
}
</span>
点击程序运行的两次结果为