【数据结构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;//结点(数据域+指针域) 注:LinkList相当于LNode*
void Input_E(ElemType &e)
{
    cout<<"name"<<endl;
    cin>>e.name;
    cout<<"score"<<endl;
    cin>>e.score;
}
void Output_E(ElemType e)
{
    cout<<e.name<<"\t"<<e.score<<endl;
}
void InitList(LinkList &L)//建立一个空链表L
{
    //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;//第几个结点
    //找到第i-1个结点
    while(p&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(!p||i<1) //超出链表范围(太大) 或者 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;
}
//获取链表L的第i个元素,并将这个元素赋给e
bool GetElem_L(LinkList L,int i,ElemType &e)
{
    LNode *p = L;
    int j = 0;
    while(p&&j<i)
    {
        p=p->next;
        j++;
    }
    if(!p||i<1) //超出链表范围(太大) 或者 i<1(非法值 注意这种情况!)
    {
        cout<<"i错误 获取元素失败\n";
        return false;
    }
    e = p->data;
    return true;
}
bool ListDelete_L(LinkList &L,int i, ElemType &e)//删除链表L的第i个节点
{
    LNode *p = L;
    int j = 0;//第几个结点
    //找到第i-1个结点
    while(p&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(!p||i<1) //超出链表范围(太大) 或者 i<1(非法值 注意这种情况!)
    {
        cout<<"i不在合理范围内,程序结束"<<endl;
        return false;
    }
    //删除结点为q
    LNode *q = p->next;
    e=q->data;
    //删除
    p->next = q->next;
    free(q);
    return true;
}
bool ListTraverse_L(LinkList L, void visit(ElemType))//以visit方法访问链表每个结点
{
    cout<<"**********Traverse L begin*******"<<endl;
    LNode *p=L->next;
    while(p)
    {
        visit(p->data);
        p=p->next;
    }
    cout<<"**********Traverse L end*********"<<endl;
}
void CreateList_L(LinkList &L,int n) //建立一个长度为n的单链表L---尾插法
{
    ElemType e;
    for(int i=1; i<=n; i++)
    {
        cout<<"输入结点"<<i<<"的:"<<endl;
        Input_E(e);
        ListInsert_L(L,i,e);
    }
}
int main()
{
    LinkList L;
    InitList(L);//建立空表L
    CreateList_L(L,3);//构建一个有三个结点单链表
    ListTraverse_L(L,Output_E);//输出单链表

    /*在L的第2个结点前插入一个结点,并输出L*/
    ElemType e;
    strcpy(e.name,"森森");
    e.score=100;
    ListInsert_L(L,2,e);
    cout<<"第2个结点前插入后:\n";
    ListTraverse_L(L,Output_E);

    /*获取第3个元素赋给e,并输出e*/
    if(GetElem_L(L,3,e))
    {
        cout<<"第3个元素为:\n";
        Output_E(e);
    }

    /*删除第2个元素给e,然后输出e,再输出L*/
    ListDelete_L(L,2,e);
    cout<<"删除结点为:\n";
    Output_E(e);
    cout<<"删除第2个元素后:\n";
    ListTraverse_L(L,Output_E);
    return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值