单链表基本操作的实现——初始化、取值、查找、插入、删除

本文详细介绍了使用C++编程语言实现单链表的基本操作,包括初始化链表、前插法和后插法创建链表、插入元素、删除元素、查找元素以及输出链表内容。代码示例涵盖了链表的常见功能,有助于理解数据结构中的链表概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>

using namespace std;
typedef int ElemType;
typedef struct LNode
{
    ElemType date;//结点的数据域
    struct LNode *next;//结点的指针域
} LNode,*LinkList; //LNode现在等价于struct LNode,LinkList为指向结构体LNode的指针类型
//单链表的初始化
void  InitList(LinkList &L)
{
    //构建一个空的单链表L
    L=new LNode;//生成新的结点作为头结点,用头指针L指向头结点
    L->next=NULL;//头结点的指针域置空
    cout<<"单链表构建成功!"<<endl;
}
//前插法创建单链表
void CreateList_H(LinkList &L,int n)
{
    //逆位序输入n个元素的值,建立带头结点的单链表L
    L=new LNode;//先建立一个带头结点的单链表
    L->next=NULL;
    cout<<"带头结点的单链表构建成功!"<<endl;
    cout<<"请逆位序输入"<<n<<"个元素";
    for(int i=0; i<n; ++i)
    {
        LinkList p=new LNode;//生成一个新结点*p
        cout<<"请输入第"<<i+1<<"个元素的值:";
        cin>>p->date;//输入元素值赋给新结点*p的数据域
        p->next=L->next;//把首元结点的地址赋值给新结点的数据域
        L->next=p;//把新结点的地址赋值给头结点
    }
}
//后插法创建单链表
void CreatList_R(LinkList &L,int n)
{
    //正位序输入n个元素的值,建立带头结点的空链表
    L = new LNode;//先建立一个带头结点的空链表
    L->next = NULL;
    LinkList r=L;//尾指针r指向头结点
    cout<<"带头结点的单链表构建成功!"<<endl;
    cout<<"请正序输入"<<n<<"个元素"<<endl;
    for(int i=0; i<n; i++)
    {
        LinkList p=new LNode;//生成新结点
        cout<<"请输入第"<<i+1<<"个元素的值:";
        cin>>p->date;//输入元素的值赋给*p的指针域
        p->next=NULL;//因为是尾插法,新结点的指针域为空
        r->next=p;//把p结点的地址给当前的尾结点
        r=p;//插入的结点为新的尾结点
    }
}
//单链表的插入
void ListInsert(LinkList &L,ElemType e)
{
    LinkList s=new LNode;//生成一个新结点*s
    s->date=e;//将结点的数据域置为e
    s->next=L->next;//将结点的指针域指向插入结点的后一结点,这里是首元结点
    L->next=s;//将头结点指针域修改为指向插入的结点*s
}

void ListInsert(LinkList &L,int i,ElemType e)
{
    //在带头结点的单链表L中dii个位置插入值为e的新结点
    LinkList p=L;//p指针指向头结点
    int j=0;
    while(p&&(j<i-1))
    {
        p=p->next;
        ++j;//查找第i-1个结点,p指向该结点
    }
    if(!p||j>i-1) //i>n+1或者i<1
    {
        cout<<"ERROR"<<endl;
    }
    LinkList s=new LNode;//生成一个新结点*s
    s->date=e;//将结点的数据域置为e
    s->next=p->next;//将新结点*s的指针域指向结点a(i)
    p->next=s;//将结点*p的指针域指向结点*s
    cout<<"插入成功!"<<endl;
}
//取值
int GetElem(LinkList L,int i,ElemType &e)
{
//在带头结点的单链表L中根据序号i获取元素的值,用e返回L中第i个数据元素的值
    LinkList p=L->next;//初始化,p指向首元结点
    int j=1;//计数器初值赋为1
    while(p&&j<i)//顺链域扫描,直到p为空或p指向第i元素
    {
        p=p->next;//p指向下一结点
        ++j;//计数器j相应加1
    }
    if(!p||j>i)//i值不合法i>n或i<=0
    {
        cout<<"ERROR"<<endl;
    }
    e=p->date;//取第i个结点的数据域
    cout<<"取值成功!"<<endl;
    return e;
}

//求单链表长度
int ListLength(LinkList &L)//返回值类型为int
{
    LinkList p=L;//p指针指向头结点
    int i=0;//用于计数,初值为0
    while(p->next!=NULL)//只要结点指针域不为空
    {
        i++;
        p=p->next;//p指向下一结点
    }
    return i;
}

//删除
void DeleteElem(LinkList &L, ElemType e)
{
    LinkList p = L;//p指向头结点
    LinkList q  = NULL;
    while(p->next != NULL)
    {
        if(p->next->date == e) //从首元结点开始比对
        {
            q = p->next;//临时保存被删结点的地址以备释放
            p->next = p->next->next;//改变删除结点前驱结点的指针域
            break;
        }
        p = p->next;//p指向下一结点
    }
    if(q != NULL)
    {
        delete q;//释放删除结点的空间
    }


}
//删除第i个元素
void deleteIndex(LinkList &L, int i)
{
    LinkList p = L;
    LinkList q = NULL;
    int num = 0;
    while(p->next != NULL)
    {
        num++;
        if( num ==  i)
        {
            q = p->next;
            p->next = p->next->next;
            break;
        }
        p = p->next;
    }

    if(q != NULL)
    {
        delete q;
    }

}

//删除
void ListDelete(LinkList &L,int i)
{
    //在带头结点的单链表L中,删除第i个元素
    LinkList p = L;//p指向头结点
    LinkList q = NULL;
    int j = 0;
    while((p->next)&&(j<i-1))//查找第i-1个结点,p指向该结点
    {
        p=p->next;
        ++j;
    }
    if(!(p->next)||(j>i-1)) //当i>n或n<1时,删除位置不合理
    {
        cout<<"ERROR"<<endl;
    }
    q=p->next;//临时保存被删除结点的地址以备释放
    p->next=q->next;//改变删除结点前驱结点的指针域
    delete q;//释放删除结点的空间
    cout<<"删除成功!"<<endl;
}

//查找数据是否存在
bool SearchList(LinkList &L,ElemType e)
{
    LinkList p=L->next;//让p指向首元结点
    while(p!=NULL)//p不为空时
    {
        if(p->date==e)//p结点的数据域与需要查询的数据进行比对
        {
            return true;//如果相等,返回true
        }
        p=p->next;//p指向下一节点
    }
    return false;
}

//查找位值
ElemType SearchIndex(LinkList &L,int index)
{
    LinkList p=L;//p指针指向头结点
    int i=0;//i用于比对是否到达指定位置index
    while (p->next!=NULL)//p指向的结点指针域不为空
    {
        p=p->next;//p指向下一结点
        i++;
        if(i==index)//到指定位置
        {
            return p->date;//返回此时p所指结点的数据
        }
    }
    return -1;//查找失败
}
//输出
void OutputList(LinkList &L)
{
    cout<<"- - - - -"<<endl;
    LinkList p=L->next;//指向首元结点
    for(int i=1; p!=NULL; i++)
    {
        cout<<"第"<<i<<"个元素的值为:"<<p->date<<endl;//输出当前结点数据
        p=p->next;//P指向下一结点
    }
    cout<<"- - - - -"<<endl;
}
int main()
{
    LinkList L=NULL;
//    InitList(L);
//    for(int i=1; i<=10; i++)
//    {
//        ListInsert(L,i*10);
//    }


//    CreateList_H(L,3);
    CreatList_R(L,3);
    OutputList(L);


    cout<<"线性表长度为:"<<ListLength(L)<<endl;
//查找
//查找元素是否存在
//    int e;
//    cout<<"输入需查找元素值e:";
//    cin>>e;
//    cout<<"查找元素"<<e<<"的结果为:"<<SearchList(L,e)<<endl;
//查找位值
//    int index;
//    cout<<"输入查找的位值:";
//    cin>>index;
//    cout<<"查找位值"<<index<<"的结果为"<<SearchIndex(L, index)<<endl;

//取值
//    int i;
//    cout<<"输入需取元素的位置i:";
//    cin>>i;
//    int e=GetElem(L,i,e);
//    cout<<"第i个位置元素是:"<<e<<endl;

//插入
//    int i;
//    cout<<"输入插入位置i:";
//    cin>>i;
//    int e;
//    cout<<"输入插入数值e:";
//    cin>>e;
//    ListInsert(L,i,e);
//    OutputList(L);

//删除元素
    int e;
    cout<<"输入需要删除的值:";
    cin>>e;
    DeleteElem(L, e);

//删除第i个元素
//    int i;
//    cout<<"输入需要删除元素的序号:";
//    cin>>i;
//    ListDelete(L,i);
//    deleteIndex(L,i);
    OutputList(L);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值