数据结构与算法-线性表-单链表

数据结构中的线性表的第二种物理结构——链式存储结构,它的c++实现代码如下:

#ifndef DANLIANBIAO_H
#define DANLIANBIAO_H
#include<iostream>
using namespace std;
typedef int ElemType;
struct Lnode
{
    ElemType data;
    Lnode* next;
};
typedef Lnode* LinkList;
//单链表的初始化
bool InitList(LinkList& L)
{
    L = new Lnode;
    L->next = nullptr;
    return true;
}
//单链表的销毁
bool DestroyList(LinkList& L)
{
    while (L)
    {
        LinkList p = L->next;
        delete L;
        L = p;
    }
    return true;
}
//单链表的清空
bool ClearList(LinkList& L)
{
    LinkList p = L->next;
    while (p)
    {
        LinkList q = p->next;
        delete p;
        p = q;
    }
    L->next = nullptr;
    return true;
}
//判断单链表是否为空
bool IsEmpty(const LinkList& L)
{
    if (L->next)
    {
        return false;
    }
    else
    {
        return true;
    }
}
//求单链表L的表长
int ListLength_L(LinkList L)
{
    LinkList p;
    p = L->next;
    int i = 0;
    while (p) {
        i++;
        p = p->next;
    }
    return i;
}
//取值--取单链表中第i个元素的内容
bool GetElem_L(LinkList L, int i, ElemType& e)
{
    LinkList p = L->next;
    int j = 1;
    while (p && j < i)
    {
        p = p->next;
        ++j;
    }
    if (!p || j > i)
    {
        return false;
    }
    e = p->data;
    return true;
}

//按值查找1
//找到则返回L中值为e的数据元素的地址;查找失败返回null
LinkList LocateElem_L1(LinkList L, ElemType e)
{
    LinkList p = L->next;
    while (p && p->data != e)
    {
        p = p->next;
    }
    return p;
}
//按值查找2
//找到返回L中值为e的数据元素的位置序号,查找失败返回0
int LocateElem_L2(LinkList L, ElemType e)
{
    LinkList p = L->next;
    int j = 1;
    while (p && p->data != e)
    {
        p = p->next;
        j++;
    }
    if (p) return j;
    else return 0;
}

//插入--在第i个结点前插入值为e的新结点
bool ListInsert_L(LinkList& L, int i, ElemType e)
{
    LinkList p = L;
    int j = 0;
    while (p && j < i - 1) 
    {
        p = p->next;
        ++j;
    }
    if (!p || j > i - 1) return false;
    LinkList s = new Lnode;
    s->data = e;
    s->next = p->next;
    p->next = s;
    return true;
}
//删除--删除第i个结点
bool ListDelete_L(LinkList& L, int i, ElemType& e)
{
    LinkList p = L;
    LinkList q;
    int j = 0;
    while (p->next && j < i - 1)
    {
        p = p->next;
        ++j;
    }
    if (!(p->next) || j > i - 1) return false;
    q = p->next;
    p->next = q->next;
    e = q->data;
    delete q;
    return true;
}
//头插法建立单链表
void CreateList_H(LinkList& L, int n)
{
    L = new Lnode;
    L->next = NULL;
    for (int i = n; i > 0; --i)
    {
        LinkList p = new Lnode;
        cin >> p->data;
        p->next = L->next;
        L->next = p;
    }
}
//尾插法建立单链表
void CreateList_R(LinkList& L, int n)
{
    L = new Lnode;
    LinkList r = L;
    for (int i = 0; i < n; ++i)
    {
        LinkList p = new Lnode;
        cin >> p->data;
        p->next = NULL;
        r->next = p;
        r = p;
    }
    
}
#endif // !DANLIANBIAO_H

猜你喜欢

转载自blog.csdn.net/hu853712064/article/details/124027957