有关单链表的知识

非匿名结构体指针类型的定义:

typedef int ElemType;
typedef int Status;
typedef struct LNode {
    ElemType data;//数据域
    struct LNode* next;//指针域,用自己定义自己(嵌套定义)
}LNode, * LinkList;//LinList为指向结构体Lnode的指针类型

初始化单链表:

LinkList InitList()
{
     LinkList L = new LNode;//头节点,通过new一份内存空间,生成头节点
    L->next = NULL;//头节点的指针域置空
    ListEmpty(L);//判断是否new成功
    return L;//用一个L接受初始化的表头

}

单链表的尾插法:

void InputList(LinkList& L)
{
    LNode* p = L;//相当于尾指针
    int n;
    cout << "请输入链表节点数:";
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        
        cout << "单链表的数域";
    
        LNode* code = new LNode;
        code->next = NULL;//尾插法

        cin>>code->data;
        p->next = code;
        p = code;//尾指针指向新的尾节点
    }

打印链表函数:

void print(LinkList L)
{
    LNode* p = L->next;//即不打印头节点,因为头节点数据域是空
    while (p)//通过判断p值来确定是否继续,当p值为空是,将退出循环
    {
        cout << p->data << endl;
        p = p->next;
    }
}

求表长

int ListLength(LinkList L)
{
    LinkList p;//用LNode*p也ok
    p = L->next;
    int cout = 0;
    while (p)
    {
        cout++;
        p = p->next;
    }
    return cout;
}

单链表的取值算法:

Status GetElem_L(LinkList L, int i)
{
    LinkList p;
    p = L->next;
    int j = 1;//初始化
    while (p && j < i)//像后面扫描,当扫面到位置i时,可以直接输出数据
    {
        p = p->next;
        j++;
        
            
    }
    if (!p || j > i)//判断扫描结果是否合理
        return 0;
    else
        return p->data;
    return 0;
    

}

查找操作:

LNode* LocateElem_L(LinkList L, ElemType e)
{
    LNode* p;
    p = L->next;
    while (p && p->data != e)//获得地址
    {
        p = p->next;
    }
    return p;
}
//按置查找,根据指定数据获取该元素的位置序号
int LocateElem_L2(LinkList L, ElemType e)
{
    LNode* p;
    int j = 1;
    p = L->next;
    while (p && p->data != e)//按照数据域查找,操作,并获得该位置i
    {
        p = p->next;
        j++;
    }
    if (p)
        return j;
    else
        cout << "该元素不存在" << endl;
        return 0;
}

//插入节点算法
Status ListInsert_L(LinkList& L, int i, ElemType e)
{
    LNode* p=L;
    int j = 0;
    while (p && j < i - 1)//寻找第i的位置,并确定p的地址
    {
        p = p-> next;
        ++j;
    }
    if (!p || j > i - 1)
        return 0;
    LNode* s;
    s = new LNode;
    s->data = e;
    s->next = p->next;//更改节点,使s插入到p里面
    p->next = s;
    return 1;
}

删除节点的算法

Status ListDelete(LinkList& L, int i, ElemType& e)
{
    LNode* q = new LNode;
    LNode* p = L;
    int j = 0;
    while (p->next && j < i - 1)
    {
        p = p->next;
        ++j;
    }
    if (!(p->next) || j > i - 1)
        return 0;
    q = p->next;
    p->next = q->next;
    e = q->data;
    delete q;
    return 1;
}

单链表的合并

void MergeList(LinkList& L1, LinkList& L2)
{
    int L1_len = ListLength(L1);
    int L2_len = ListLength(L2);
    for (int i = 1; i <= L2_len; i++)
    {
        int e=GetElem_L(L2, i);//判断元素是否存在
        if (!(LocateElem_L2(L1, e)))
        {
            ListInsert_L(L1,++L1_len, e);//通过判断位置的改变来进行改变插入的位置
        }

    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值