逆向输出采用了栈的思想,从而用递归实现。
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
typedef struct LNode{
char data;
struct LNode *next;
}LNode,*LinkList;//创建链表结构体
LinkList List_HeadInsert(LinkList &L,int n){ //头插法创建链表
LNode *s;char x;
L=(LinkList)malloc(sizeof(LNode));//创建头节点
L->next=NULL;
L->data='0';//初始化头节点
int i=0;
while(i<n){
cin>>x;
s=(LNode*)malloc(sizeof(LNode));//创建节点
s->data=x;//将x的值赋给节点
s->next=L->next;
L->next=s;//插入到链表头部
i++;
}
return L;
}
LinkList DEL_x(LinkList &L,char x){//删除节点x
LNode *pre=L,*p=L->next,*q;//创建指针pre指向p的前节点,p指向L,便于删除p指向的节点,q指针用来释放空间
while(p!=NULL){
if(p->data==x){
q=p;
p=p->next;
pre->next=p;//删除节点p
free(q);//释放
}
else{
pre=p;
p=p->next;
}
}
return L;
}
void L_print(LinkList &L){//正向输出节点
LNode *p=L;
while(p->next!=NULL){
cout<<p->next->data<<" ";
p=p->next;
}
}
void R_print(LinkList &L){//逆向输出节点
if(L->next!=NULL){
R_print(L->next);
}
if(L!=NULL){
cout<<L->data<<" ";
}
}
int main(){
LNode *L;
int n;
cin>>n;
List_HeadInsert(L,n);//调用函数创建列表
char x;
cin>>x;
DEL_x(L,x);
L_print(L);//删除x节点后正向输出
cout<<endl;
L=L->next;//放过头节点
R_print(L);//逆向输出
cout<<endl;
}
运行结果如下:
记住放过头节点,不然会有个随机数值。
争取在死亡那天前面让他们瞧瞧你!