数据结构 链式线性表 创建 增删改查等相关基础操作 c++

  涉及操作:链表的初始化 链表的创建 链表插入元素  链表的删除  检测链表是否为空 遍历链表

 相关注释见代码,比较详细,不理解的评论私信告诉我哦

#include <iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
typedef struct        //结点数据域元素类型
{
    char name[8];
    float score;
}ElemType;
typedef struct LNode  //链式结点
{
    ElemType data;
    LNode *next;
}LNode,*LinkList;
void Inpute_E(ElemType &e)  //给ElemType对象赋初值
{
    cout<<"name"<<endl;
    cin>>e.name;
    cout<<"score"<<endl;
    cin>>e.score;
}
void Output_E(ElemType &e) //输出ElemType对象的值
{
    cout<<e.name<<"\t"<<e.score<<endl;
}
void InitList(LinkList &L)    //初始化链表
{
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
}
bool ListEmpty(LinkList L)  //检测链表是否为空
{
    return L->next==NULL;
}
bool ListInsert_L(LinkList &L,int i,ElemType e)  //在链表L的第i个结点前插入e
{
    LNode *p=L;
    int j=0;
    while(p&&j<i-1)  //将指针指向要处理的结点处
    {
        p=p->next;
        j++;
    }
    if(!p||j>i-1)   //判断之前指针的指向范围是否正确
    {
        cout<<"i不在合理范围内,程序结束"<<endl;
        return false;
    }
    LNode *s=(LNode*)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return true;
}
void CreateList_L(LinkList &L,int n)    //创建长度为n的链表并给链表赋值
{
    ElemType e;
    for(int i=1;i<=n;i++)
    {
        cout<<"输入节点"<<i<<"的名字和分数"<<endl;
        Inpute_E(e);
        ListInsert_L(L,i,e);
    }
}
void ListTraverse_L(LinkList L,void visit(ElemType&))   //遍历链表
{
    cout<<"**********Traverse L begins******"<<endl;
    LNode *p=L->next;
    while(p)
    {
        visit(p->data);
        p=p->next;
    }
    cout<<"**********Traverse L ends******"<<endl;

}
bool ListDelete_L(LinkList &L,int i,ElemType &e)  //删除链表L的第i个结点,并将该节点的值保存至e
{
    LNode *p=L;
    int j=0;
    while(p&&j<i-1)
    {

        p=p->next;
        j++;
    }
    if(!p||j>i-1)
    {
        cout<<"i不在合理范围内,程序结束"<<endl;
        return false;
    }
    LNode *pp;
    e=p->next->data;
    pp=p->next;

    p->next=p->next->next;
    free(pp);

    return true;


}
int main()
{
    LinkList L;
    InitList(L);//建立空表L
    CreateList_L(L,3);//构建一个有三个结点单链表
    ListTraverse_L(L,Output_E);//输出单链表
    cout<<"你实现的功能效果如下:"<<endl;
    ElemType e;
    strcpy(e.name,"溜溜");//字符数组在定义的时候可以直接赋值,但是不能定义完后用name=“a”这种方式赋值(可以用cin),因为定义时已经指向了空间,不能再指向“a”这个常量
    e.score=66;
    //Inpute_E(e);
    ListInsert_L(L,2,e);
    ListTraverse_L(L,Output_E);
    ListDelete_L(L,3,e);
    Output_E(e);
    return 0;
}

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值