线性表之链表实作一

2024-06-16 19:18
文章标签 链表 线性表 实作

本文主要是介绍线性表之链表实作一,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

//线性表的一个例子
#include<iostream>
using namespace std;


typedef struct List
{
     int num;
     struct List *next;//指向下一个元素   
}list,*listp;//前者代表该种数据类型,后者代表该种数据类型的指针 


void InitList(listp &first)
{
     first=new list;
     first->num=0;
     first->next=NULL;  //NULL 在此处不需要再次定义 
}


//删除整个链表 
void DestroyList(listp &first)
{
     listp p;
     while(first->next)
     {
           p=first;
           first=first->next;
           delete p;
     }
     delete first;
     cout<<"The list have been destroyed !"<<endl;
}


//清空整个链表 
void ClearList(listp &first)
{
     listp p;
     while(first->next)
     {
           p=first->next;
           first->next=p->next;
           delete p;
     }
     cout<<"The list have been cleared !"<<endl;
}


//判断链表是否为空,如果是空,返回true;否则返回false 
bool ListEmpty(listp first)
{
     if(first->next!=NULL)return false;
     else return true;
}


//返回链表的长度 
int ListLength(listp first)
{
     listp p=first;
     int len=0;
     while(p->next!=NULL)
     {
           ++len;
           p=p->next;
     }
     return len;
}


//获取链表中第 i 个元素 
int GetElem(listp first,int i)
{
    int len=1;
    listp p=first->next;
    while(len<i)
    {
          ++len;
          p=p->next;
    }
    return p->num;
}


//获取元素 i 在链表中的位置 
int LocateElem(listp first,int i)
{
    int locate=1;
    listp p=first->next;
    while(p->num!=i)
    {
          ++locate;
          p=p->next;
    }
    return locate;
}


//获取元素 i 在链表中的 直接前驱 
int PriorElem(listp first,int i)
{
    listp p=first;
    while(p->next->num!=i)
    {
          p=p->next;
    }
    return p->num;
}


//获取元素 i 在链表中的直接后继 
int NextElem(listp first,int i)
{
    listp p=first->next;
    while(p->next!=NULL && p->num!=i)
    {
          p=p->next;
    }
    if(p->next==NULL)return 1;
    else return p->next->num;
}


//在链表中用  前插法  插入元素 
void ListInsert(listp first,int i)
{
     listp p=new list;
     p->next=first->next;
     first->next=p;
     p->num=i;
}


int main()
{
    int elem=3;
    listp first,p;
    
    InitList(first);  //初始化 
    
    for(int i=0;i<9;++i) //插入元素 
         ListInsert(first,i);
    p=first;
    
    while(p->next!=NULL)
    {
         cout<<p->next->num<<"  ";
         p=p->next;
    } 
    cout<<"Length= "<<ListLength(first)<<endl;
    
    cout<<elem<<" locate "<<LocateElem(first,elem)<<endl;
    
    cout<<elem<<" preelem "<<PriorElem(first,elem)<<endl;
    
    cout<<elem<<" nextelem "<<NextElem(first,elem)<<endl;
    
    cout<<"IsEmpty "<<ListEmpty(first)<<endl;
    
    cout<<"The "<<elem<<" num is "<<GetElem(first,elem)<<endl;
    
    ClearList(first);
    
    cout<<"IsEmpty "<<ListEmpty(first)<<endl;
    
    DestroyList(first);
    
    system("pause");
    return 0;

}



值得说明的几个注意点:关于  指针  和   指针地址。众所周知,指针中存储的是一个地址,使用指针可以改变该地址中变量的值;然而,如果要想改变指针呢,是不是就要用指针的指针呢?显而易见,是的。使用指针的指针获得指针的地址,今儿改变指针的内容。


例如:int test=10;int *p=&test;则可以使用*p=100将test的值改为100;


这篇关于线性表之链表实作一的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067321

相关文章

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

数据结构:线性表的顺序存储

文章目录 🍊自我介绍🍊线性表的顺序存储介绍概述例子 🍊顺序表的存储类型设计设计思路类型设计 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾” 和“内容共创官” ,现在我来为大家介绍一下有关物联网-嵌入

[数据结构]线性表之单链表的类模板实现

类的具体实现如下: /#include"LinearList.h"#include <iostream>#include <cstdlib>using namespace std;template<class T>struct LinkNode //链表节点类{T data;LinkNode<T>* link;LinkNode(LinkNode<T>* ptr=NULL):

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣3217, 82, 237

总结,删除链表节点问题使用到列表,哈希表,递归比较容易超时,我觉得使用计数排序比较稳,处理起来也不是很难。 1. 力扣3217:从链表中移除在数组中的节点 1.1 题目: 给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后,返回修改后的链表的头节点。 示例 1: 输入: nums = [1,2,3], head = [1,2,3,

c++ 链表详细介绍

链表是数据结构的一种,由节点组成,每个节点包含数据和指向下一个节点的指针。链表在C++中的实现可以是单链表、双链表或循环链表。以下是链表的详细介绍: 1. 单链表 结构: 节点(Node):每个节点包含数据和一个指针(next),指向链表中的下一个节点。 示例结构: struct Node {int data;Node* next;Node(int d) : data(d), next(