递归实现不带头节点的单链表

#include<iostream>
#include <malloc.h>
#include <stdlib.h>


typedef int ElemType;
using namespace std; 
typedef struct LNode
{
 ElemType data;
 struct LNode *next;
}LinkNode;

//初始化
void InitList(LinkNode *&L)
{
 L=new LinkNode;
 L->next=NULL;
}
//尾插法--------插入 
bool ListInsert(LinkNode *&L1,int i,ElemType e)
{
 int j=0;
 LinkNode *s=L1,*r; 
 if(i<=0)
 return false;
 while(j<i-1&&s!=NULL)
 {
 j++;
 s=s->next;
 }
 if(s==NULL)
 return false;
 else
 {
 r= new LinkNode;
 r->data=e;
 r->next=s->next;
 s->next=r;

 return true;
 }
 
}


//释放表
void DestoryList(LinkNode *&L)
{
    LinkNode *T;
    if(L==NULL)
        return ;
    DestoryList(L->next);
    free(L);

}
//结点数
int Lenghth(LinkNode *L)
{
    if(L==NULL)
        return 0;
    return ( Lenghth(L->next)+1);
}
//正向输出所有节点值
void Dis(LinkNode *L)
{
    if(L==NULL)
        return ;
    cout<<L->data<<"    ";
    Dis(L->next);
}
//反向输出所有节点值
void fanDis(LinkNode *L)
{
    if(L==NULL)
        return ;
    fanDis(L->next);
    cout<<L->data<<"    ";
}
//删除值为X的数据结点(测试值为:8.4)
void Dele(LinkNode *&L,ElemType e,int  onlyall)    //onlyall超重要的
{
    LinkNode *sa;
    if(L==NULL)
        return ;
    if(L->data==e)
    {
        sa=L;
        L=L->next;
        free( sa);
        if(onlyall==1)
            Dele(L,e,onlyall);

    }
    else
        Dele(L->next,e,onlyall);
}

//最大值
ElemType  MAX(LinkNode *L)
{
    ElemType e;
    if(L->next==NULL)
        return L->data;
    e=MAX(L->next);
    if(e>L->data)
        return e;
    else
        return L->data;
}
//最小值
ElemType MIN(LinkNode  *L)
{
    ElemType e;
    if(L->next==NULL)
        return L->data;
    e=MIN(L->next );
    if(e>L->data)
        return L->data;
    else
        return e;
}


int main()
{
 LinkNode *L;
 ElemType z,temp;
 ElemType o[7]={13,15,8,4,8,3,4 };
 cout<<"初始化L:"<<endl;
 InitList(L);
 cout<<"尾插法插元素7个:";
 L->data=o[0];
 for(int i=1;i<=6;i++)
 {
 ListInsert(L,i,o[i]);
 }

 cout<<"正向输出:";
 Dis(L);
 cout<<endl;
 cout<<"反向输出:";
 fanDis(L);
 cout<<endl;
 cout<<"结点数:"<<Lenghth(L)<<endl;
 
 cout<<"你想删除哪个位置的元素(仅一个元素):";
 cin>>temp;
 Dele(L,temp,0);
 Dis(L);
 cout<<endl;
 cout<<"你想删除哪个元素的位置(所有一样的):";
 cin>>z; 
 Dele(L,z,1);
 cout<<"线性表为:";
 Dis(L);
 cout<<endl;
 cout<<"最大值:"<<MAX(L)<<endl;
 cout<<"最小值:"<<MIN(L)<<endl;
 cout<<"销毁over";
 DestoryList(L);
 return 0;

 

 

}

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值