数据结构:单链表头插法、尾插法、按值查找、按位查找、按位插入、删除、表长函数实现

数据结构定义

typedef struct Lnode{
    elemtype data;
    struct Lnode* next;
}Lnode,*Linklist;

初始化头结点

bool initlinklist(Linklist &l)
{
    l=(Lnode*)malloc(sizeof(Lnode));
    l->next=NULL;
    return true;
}

判断链表是否为空

bool listempty(Linklist &l)
{
    if(l->next==NULL)
        return true;
    else
        return false;
}

带头结点的按位序插入

bool listinsert(Linklist &l,elemtype e,int i)
{
    if(i<1)
    {
        return false;
    }
    Lnode*p=l;///指向当前扫描节点
    int j=0;///指向第几个

    while(p!=NULL && j<i-1) ///找到第i-1个节点
    {
        p=p->next;
        j++;
    }

    if(p==NULL) return false;/*当循环因为p==null跳出,说明链表已经遍历结束了,但是还没有找到第i-1个节点。*/
    /*j=n-1跳出*/

    Lnode *s=(Lnode*)malloc(sizeof(Lnode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return true;

}

头插法

Linklist list_headinsert(Linklist &l)
{
    elemtype x;
    cin>>x;
    while(x!=0)
    {
            Lnode* s=(Lnode*)malloc(sizeof(Lnode));
            s->data=x;
            s->next=l->next;
            l->next=s;
            cin>>x;
    }
    return l;
}

尾插法

Linklist list_tailinsert(Linklist &l)
{
    elemtype x;
    cin>>x;
    Linklist p=l;///指向最后一个节点
    while(x!=0)
    {
        Lnode *s =(Lnode*)malloc(sizeof(Lnode));
        s->data=x;
        p->next=s;
        p=s;
        cin>>x;
    }
    p->next=NULL;///表尾设置为NULL

    return l;
}

按值查找,返回节点

Lnode *locateelem(Linklist l,elemtype e)
{
    Linklist p=l->next;
    while(p!=NULL&&p->data!=e)
    {
        p=p->next;
    }
    return p;
}

按位查找,返回节点

Lnode *getelem(Linklist l,int i)
{
    if(i==0) return l;
    int j=1;///计数
    Linklist p=l->next;

    if(i<1) return NULL;

    while(j<i&&p!=NULL)
    {
        p=p->next;
        j++;
    }
    return p;
}

将新节点插入到第i个位置

借助前面的按位查找函数

Linklist insertlist(Linklist &l,int i,elemtype e)
{
    Lnode *s=(Lnode*)malloc(sizeof(Lnode));
    s->data=e;
    s->next=NULL;
    Linklist p=getelem(l,i-1);
    s->next=p->next;
    p->next=s;
}

删除第i个节点

Linklist deletenode(Linklist &l,int i)
{
    Linklist p=getelem(l,i-1);///删除节点的前驱节点
    Linklist q=p->next;///q指向删除节点
    p->next=q->next;
    free(q);

}

遍历输出

bool output(Linklist l)
{
    Linklist p=l->next;
    while(p!=NULL)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
    return true;
}

求链表长度

int listlen(Linklist l)
{
    Linklist p=l->next;
    int sum=0;
    while(p!=NULL)
    {
        p=p->next;
        sum++;
    }
    return sum;
}

主函数测试各个功能

int main()
{
    Linklist l;
    Linklist l2;
    initlinklist(l);///初始化表头
    initlinklist(l2);///初始化表头
    cout<<"*****表是否为空******"<<endl;
    cout<<listempty(l)<<endl;
    cout<<"*****头插法输入1 2 3 4 5 6 7 8 9 0******"<<endl;
    l=list_headinsert(l);///头插法,输入0结束
    output(l);
    cout<<"*****在第1个位置插入55******"<<endl;
    listinsert(l,55,1);
    output(l);
    cout<<"*****尾插法输入1 2 3 4 5 6 7 8 9 0******"<<endl;
    l2=list_tailinsert(l2);///尾插法,输入0结束
    output(l2);

    cout<<"*****求l的表长******"<<endl;
    cout<<listlen(l)<<endl;/*求表长*/

    cout<<"*****按值查找5,输出查找结果******"<<endl;
    Lnode *p=locateelem(l,5);
    cout<<p->data<<endl;

    cout<<"*****将10插到第四个位置******"<<endl;
    insertlist(l,4,10);
    output(l);

    cout<<"*****删除第五个节点******"<<endl;
    deletenode(l,5);
    output(l);
    return 0;
}

测试结果:
在这里插入图片描述

完整代码

#include<bits/stdc++.h>
#include<iostream>
#define elemtype int
using namespace std;
typedef struct Lnode{
    elemtype data;
    struct Lnode* next;
}Lnode,*Linklist;

/*初始化头结点*/
bool initlinklist(Linklist &l)
{
    l=(Lnode*)malloc(sizeof(Lnode));
    l->next=NULL;
    return true;
}

/*判断链表是否为空*/
bool listempty(Linklist &l)
{
    if(l->next==NULL)
        return true;
    else
        return false;
}
/*带头结点按位序插入*/
bool listinsert(Linklist &l,elemtype e,int i)
{
    if(i<1)
    {
        return false;
    }
    Lnode*p=l;///指向当前扫描节点
    int j=0;///指向第几个

    while(p!=NULL && j<i-1) ///找到第i-1个节点
    {
        p=p->next;
        j++;
    }

    if(p==NULL) return false;/*当循环因为p==null跳出,说明链表已经遍历结束了,但是还没有找到第i-1个节点。*/
    /*j=n-1跳出*/

    Lnode *s=(Lnode*)malloc(sizeof(Lnode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return true;

}
/*头插法*/
Linklist list_headinsert(Linklist &l)
{
    elemtype x;
    cin>>x;
    while(x!=0)
    {
            Lnode* s=(Lnode*)malloc(sizeof(Lnode));
            s->data=x;
            s->next=l->next;
            l->next=s;
            cin>>x;
    }
    return l;
}
/*尾插法*/
Linklist list_tailinsert(Linklist &l)
{
    elemtype x;
    cin>>x;
    Linklist p=l;///指向最后一个节点
    while(x!=0)
    {
        Lnode *s =(Lnode*)malloc(sizeof(Lnode));
        s->data=x;
        p->next=s;
        p=s;
        cin>>x;
    }
    p->next=NULL;///表尾设置为NULL

    return l;
}
/*按值查找*/
Lnode *locateelem(Linklist l,elemtype e)
{
    Linklist p=l->next;
    while(p!=NULL&&p->data!=e)
    {
        p=p->next;
    }
    return p;
}
/*按位查找*/
Lnode *getelem(Linklist l,int i)
{
    if(i==0) return l;
    int j=1;///计数
    Linklist p=l->next;

    if(i<1) return NULL;

    while(j<i&&p!=NULL)
    {
        p=p->next;
        j++;
    }
    return p;
}
/*将新节点插入到第i个位置*/
Linklist insertlist(Linklist &l,int i,elemtype e)
{
    Lnode *s=(Lnode*)malloc(sizeof(Lnode));
    s->data=e;
    s->next=NULL;
    Linklist p=getelem(l,i-1);
    s->next=p->next;
    p->next=s;
}
/*删除第i个节点*/
Linklist deletenode(Linklist &l,int i)
{
    Linklist p=getelem(l,i-1);///删除节点的前驱节点
    Linklist q=p->next;///q指向删除节点
    p->next=q->next;
    free(q);

}
/*遍历输出*/
bool output(Linklist l)
{
    Linklist p=l->next;
    while(p!=NULL)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
    return true;
}
/*求链表的长度*/
int listlen(Linklist l)
{
    Linklist p=l->next;
    int sum=0;
    while(p!=NULL)
    {
        p=p->next;
        sum++;
    }
    return sum;
}
int main()
{
    Linklist l;
    Linklist l2;
    initlinklist(l);///初始化表头
    initlinklist(l2);///初始化表头
    cout<<"*****表是否为空******"<<endl;
    cout<<listempty(l)<<endl;
    cout<<"*****头插法输入1 2 3 4 5 6 7 8 9 0******"<<endl;
    l=list_headinsert(l);///头插法,输入0结束
    output(l);
    cout<<"*****在第1个位置插入55******"<<endl;
    listinsert(l,55,1);
    output(l);
    cout<<"*****尾插法输入1 2 3 4 5 6 7 8 9 0******"<<endl;
    l2=list_tailinsert(l2);///尾插法,输入0结束
    output(l2);

    cout<<"*****求l的表长******"<<endl;
    cout<<listlen(l)<<endl;/*求表长*/

    cout<<"*****按值查找5,输出查找结果******"<<endl;
    Lnode *p=locateelem(l,5);
    cout<<p->data<<endl;

    cout<<"*****将10插到第四个位置******"<<endl;
    insertlist(l,4,10);
    output(l);

    cout<<"*****删除第五个节点******"<<endl;
    deletenode(l,5);
    output(l);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值