首页 > 编程语言 >数据结构 —— 线性表的链式存储(链表)(C++)

数据结构 —— 线性表的链式存储(链表)(C++)

时间:2024-03-31 09:33:37浏览次数:24  
标签:LinkList 结点 return Lnode int C++ next 链表 线性表

目录

本文相关知识:以链式存储结构来实现线性表(C++)

如有错误请指正~~谢谢~后面更新循环链表和双向链表

单链表(有头结点)

以带头结点的单链表为例,操作更加简便!

定义

首先,为了增强程序的可读性,做出以下定义:

#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

#define MAXSIZE 100     //表的最大长度
typedef int Status;     //函数返回值的类型
typedef int ElemType;  //元素的类型

typedef struct Lnode
{
    ElemType data;
    struct Lnode *next;//Lnode* 强调指向链表中某个结点的指针
}LNode,*LinkList;//LinkList 强调指向某个单链表的头指针

初始化

Status InitList(LinkList &L)
{
    L=new LNode;//生成新结点,用指针L指向头结点
    L->next=NULL;//头结点的指针域置空
    return OK;
}

判空

Status IsEmpty(LinkList L)
{
    if(L->next)
        return OK;
    else
        return ERROR;
}

销毁

//销毁后链表就不存在了
Status DestoryList(LinkList &L)
{
    Lnode *p;
    while(L)
    {
        p=L;//从头结点开始依次释放所有结点
        L=L->next;
        delete p;
    }
    return OK;
}

清空

//清空后链表(的头指针和头结点)仍存在,只是没有元素变成了空链表
Status ClearList(LinkList &L)
{
    Lnode *p,*q;
    p=L->next;
    while(p)//没到表尾
    {
        q=p->next;//用q保存下一个结点的地址,不然删除后就找不到
        delete p;
        p=q;
    }
    L->next=NULL;
    return OK;
}

求表长

int ListLength(LinkList L)
{
    Lnode *p=L->next;//p指向第一个结点
    int len=0;
    while(p)//遍历链表统计结点数
    {
        len++;
        p=p->next;
    }
    return len;
}

取值

Status GetElem(LinkList L,int i,ElemType &e)
{
    Lnode *p=L->next;
    int j=1;
    while(p&&j<i)//当链表遍历完或j=i找到该元素时,循环结束
    {
        p=p->next;
        j++;
    }
    if(!p||j>i)//p为空or位置i非法时返回错误,元素i不存在
        return ERROR;
    e=p->data;
    return OK;
}

查找

int LocateElem(LinkList L,ElemType e)
{
    Lnode *p=L->next;
    int j=1;
    while(p&&p->data!=e)//当链表遍历完或找到该元素时,循环结束
    {
        p=p->next;
        j++;
    }
    if(p)//p不为空时返回值为e的元素的位置j
        return j;
    else
        return ERROR;
}

插入

Status InsertNode(LinkList &L,int i,ElemType e)
{//在第i个元素之前插入元素
    Lnode *p=L;
    int j=0;
    while(p&&j<i-1)//找到第i-1个元素
    {
        p=p->next;
        j++;
    }
    if(!p||j>i-1)
        return ERROR;
    Lnode *s=new LNode;//生成新结点
    s->data=e;
    s->next=p->next;//使新结点的指针域指向第i个结点
    p->next=s;//使第i-1个结点的指针域指向新结点
    return OK;
}

删除

Status DeleteNode(LinkList &L,int i)
{
    Lnode *p=L->next;
    int j=1;
    while(p&&j<i-1)
    {
        p=p->next;
        j++;
    }
    Lnode *q=p->next;//保存第i个元素的地址,防止丢失
    p->next=p->next->next;//使第i-1个结点的指针域指向第i+1个结点
    delete q;
    return OK;
}

创建

头部创建

void CreateList_Front(LinkList &L,int n)
{
    L=new LNode;
    L->next=NULL;//先建立一个空链表
    Lnode *p;
    for(i=0;i<n;i++)
    {
        p=new LNode;
        cin>>p->data;//逆序输入元素值赋给新结点的数据域
        p->next=L->next;
        L->next=p;//把新结点插入头结点之后
    }
}

尾部创建

void CreateList_Rear(LinkList &L,int n)
{
    L=new LNode;
    L->next=NULL;//先建立一个空链表
    Lnode *p,*r=L;
    for(i=0;i<n;i++)
    {
        p=new LNode;
        cin>>p->data;//顺序输入元素值赋给新结点的数据域
        r->next=p;
        p->next=NULL;//把新结点连在尾结点后面
        r=p;//尾指针指向新的尾结点
    }
}

标签:LinkList,结点,return,Lnode,int,C++,next,链表,线性表
From: https://www.cnblogs.com/vicky-han/p/18106017

相关文章

  • 数据结构与算法——双向链表的使用原理
    双向链表是一种特殊链表,每个节点包含两个指针,一个指向前一个节点,一个指向后一个节点。双向链表可以支持双向遍历,插入和删除操作更加高效。双向链表的基本操作包括插入、删除、查找等。双向链表的常见应用场景包括LRU缓存淘汰算法、双向队列等需要频繁在两端进行操作的场景......
  • 【数据结构】用C语言实现单链表及其常见操作
    【数据结构】用C语言实现单链表及其常见操作链表是一种常用的基础数据结构,可以快速插入和删除数据,但是不能随机访问。那么它在内存中是怎么存储的呢?它和数组不同,数组在内存中是连续存储的,而链表不一定是连续的,它们之间是通过指针来连接的。指针是C语言中最重要的特性之一。那......
  • 杨辉三角形(c++实现)
    题目下面的图形是著名的杨辉三角形:如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列:1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,…给定一个正整数N,请你输出数列中第一次出现N是在第几个数?输入输入一个整数N。输出输出一个整数代......
  • UE4 c++ 通过枚举寻找DataTable中的数据
    DataTable中的数据DataTable中每一行数据是一个结构体在C++代码中定义结构体,然后可以在蓝图中可以创建以此结构体为单元的DataTable枚举变量定义一个头文件来存储枚举变量,然后可以在要使用的文件中利用MyEnumPtr=FindObject<UEnum>(ANY_PACKAGE,TEXT("EGridShapEnum"),tr......
  • 有关链表算法题的一些思考
    1.针对链表的特性(1)双指针的方法:因为不管是删除还是添加元素,都要涉及指定位置元素的上一个元素,因此需要设置前后两个指针来实现操作,同时针对题目特殊性也可能会有三指针的情况,如LeetCode82的去重,第一个指针作为删除操作的前一个指针,而后两个指针则用来查取重复范围/**......
  • C++入门(一)
    目录命名空间:为什么要提出命名空间?命名空间的定义:命名空间的使用:加命名空间名称及作用域限定符:使用using将命名空间中某个成员引入:使用usingnamespace命名空间名称引用:C++输入&输出:库的导入:使用说明:输入和输出:输入流:输出流:缺省参数:缺省参数的概念:缺省参数的......
  • COMP2017 9017 多类型链表数据结构
    COMP20179017课业2到期时间:2024年3月28日23:59这项任务相当于你最终评估的10%任务描述您的任务是创建一个多类型链表数据结构和与之交互的程序任务分为三个任务,必须按顺序完成。第一部分是链表的基本命令语法、创建、删除、查看等。第二部分是通过插入和删除元素来修改现有的列......
  • 第1章 迈向现代C++
    芝士wa2024.3.30资源链接1.1被启用的特性不再允许字符串字面值常量赋值给一个char*。如果需要用字符串字面值常量赋值和初始化一个char*,应该使用constchar*或者autochar*str="helloworld!";//将出现弃用警告C++98异常说明、unexpected_handler,set_unexpec......
  • 【力扣hot100】160.相交链表
    相交链表给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。图示两个链表在节点c1开始相交:题目数据保证整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构。示例1:输......
  • C++U6-10 - 表达式与表达式求值
    学习目标 算数表达式 三种算数表达式 中缀转后缀  计算机的转换逻辑 中缀转后缀 【算法分析】从左到右进行遍历。1.遇到的是运算数,直接输出。2.遇到的是左括号'(',直接压入堆栈(括号是最高优先级,无需比较;入栈后优先级降到最低,确保其他符号正常入栈)。......