这篇博客和我的上一篇目的是一样的,都是用栈去实现链表的逆置操作,而如果链表一个节点中的元素有多个,那么上一篇的工作量就要大大增加,所以我又写了一个交换节点的链表逆置操作,这样就算有多个元素,也不会影响代码量。
具体代码如下:
#include <iostream>
using namespace std;
#define OK 1
#define MAX 100
typedef int Elemtype;
typedef int status;
typedef struct LNode{//链表结构体
Elemtype a;
struct LNode *next;
}LNode,*LinkList;
typedef struct{//顺序栈结构体
LNode *top;
LNode *base;
int length;
}Sqstack;
status Initlist(LinkList &L);//初始化链表
status Pushlist(LinkList &L,int n);//为链表输入元素
status Init(Sqstack &B);//初始化顺序栈
status Pust(Sqstack &B,LinkList L);//链表的元素入栈
status Pop(Sqstack &B,LinkList &L);//出栈把元素再赋到链表中
status Traverlist(LinkList &L);//遍历输出链表中的元素
int main()
{
LinkList L;
Sqstack B;
int n;
Initlist(L);
cout<<"请输入链表中的数的个数:";
cin>>n;
cout<<"请以此输入链表中的值:";
Pushlist(L,n);
Init(B);
Pust(B,L);
Pop(B,L);
cout<<"此链表逆置为:";
Traverlist(L);
cout<<endl;
}
status Initlist(LinkList &L)
{
L=new LNode;
L->next=NULL;
return OK;
}
status Pushlist(LinkList &L,int n)
{
LinkList p,r;
int i;
r=L;
for(i=0;i<n;i++)
{
p=new LNode;
cin>>p->a;
p->next=NULL;
r->next=p;
r=p;
}
return OK;
}
status Init(Sqstack &B)
{
B.top=new LNode[MAX];
B.base=B.top;
B.length=MAX;
return OK;
}
status Pust(Sqstack &B,LinkList L)
{
LinkList p;
p=L->next;
while(p)
{
*B.top++=*p;
p=p->next;
}
return OK;
}
status Pop(Sqstack &B,LinkList &L)
{
LinkList p,r;
r=L;
while(B.top!=B.base)
{
p=--B.top;
r->next=p;
p->next=NULL;
r=p;
}
return OK;
}
status Traverlist(LinkList &L)
{
LinkList p;
p=L->next;
while(p)
{
cout<<p->a<<" ";
p=p->next;
}
}