• 数据结构(4)——线性表的链式表示和实现


    2.3.1 线性链表

      线性链表的链式存储结构的特定是用一组任意的存储单元存储线性表的数据元素(这组数据存储单元可以是连续的,也可以是不连续的)。

      节点包括:数据域和指针域
      只包含一个指针域的称为线性链表又称为单链表。

      单链表的主要操作代码如下:

    #include<iostream>
    #include<string>
    using namespace std;
    
    // 定义元素类型
    typedef int ElemType;
    
    // 定义线性表的单链表存储结构
    typedef struct LNode
    {
        ElemType data;
        struct LNode *next;
    }LNode, *LinkList;
    
    // 功能: 获取第i个结点上的值
    // 入参: L 带头结点的单链表
    // 入参: i 位置i
    // 入参: e 第i个位置上的值
    // 返回: ERROR 没找到, OK 找到
    string GetElemByIndex(LinkList L, int i, ElemType &e)
    {
        // L为带头结点的单链表
        // 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
        LinkList p = L->next;
    
        int j = 1;
        while(p && j < i)
        {
            p = p->next;
            j ++;
        }
    
        if (!p || j > i)
        {    
            return "ERROR";
        }
    
        e = p ->data;
        return "OK";
    }
    
    // 功能: 在第 i 个位置前插入数值e
    // 入参: L 单链表
    // 入参: i 第i个位置
    // 入参: e 要插入第i个位置的值
    // 返回: OK 插入成功,ERROR 插入不成功
    string InsertLinkList(LinkList &L, int i, ElemType e)
    {
        // 带头结点的单链表
        LinkList p = L->next;
        int j = 1;
        
        // 寻找第 i - 1 个结点
        while(p && j < i - 1)
        {
            p = p->next;
            j ++;
        }
        
        if (!p || j > i - 1)
        {    
            return "ERROR";
        }
    
        LinkList s = (LinkList)malloc(sizeof(LNode));
        s->data = e;
        s->next = p->next;
        p->next = s;
        return "OK";
    
    }
    
    // 功能: 删除带头结点单链表第i个位置上的值
    // 入参: 带头结点的单链表
    // 入参: i 第i个结点
    // 返回: ERROR 删除不成功,OK 删除成功
    string DelLinkList(LinkList &L, int i)
    {
        LinkList p = L->next;
        int j = 1;
        while(p && j < i - 1)
        {
            p = p->next;
            j ++;
        }
    
        if (!p || j > i - 1)
        {
            return "ERROR";
        }
    
        LinkList q = p->next;
        p->next = q->next;
        free(q);
        return "OK";
    }
    
    // 功能: 创建一个单链表
    // 入参: LinkList &L 单链表
    // 入参: int n 单链表的长度
    // 返回值: 空
    void CreateLinkList(LinkList &L, int n)
    {
        // 创建头结点
        L = (LinkList)malloc(sizeof(LNode));
        L->next = NULL;
        LinkList p;
        int i;
        for(i = 0; i <= n ; i++)
        {
            p = (LinkList)malloc(sizeof(LNode));
            p->data = i;
            p->next = L->next;
            L->next = p;
        }
    }
    
    // 功能: 遍历输出单链表
    // 入参: 带头结点的单链表
    // 返回值: 空
    void Display(LinkList L)
    {
        LinkList p = L->next;
        cout << "遍历单链表结果如下:" << endl;
        while(p)
        {
            cout << p->data << " ";
            p = p->next;
        }
        cout << endl;
    }
    
    // 主函数
    void main()
    {
        // 带头结点的单链表
        LinkList L;
    
        // 创建10个结点个数的单链表
        CreateLinkList(L, 10);
        
        // 遍历输出单链表
        Display(L);
    
        // 获取第i个位置上的元素
        ElemType e;
        string status = GetElemByIndex(L, 12, e);
        cout << status << "," << e << endl;
    
        // 在第 i 个位置之前插入数值e
        string insertStatus = InsertLinkList(L, 4, 90);
        cout << insertStatus << endl;
        Display(L);
    
        // 删除第i个位置上的结点
        string delStatus = DelLinkList(L, 5);
        cout << delStatus << endl;
        Display(L);
    }
    作者:BestNow
    出处:http://www.cnblogs.com/BestNow/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    优化慢执行或慢查询的方法
    Top K问题的两种解决思路
    优先队列实现 大小根堆 解决top k 问题
    进程间的八种通信方式----共享内存是最快的 IPC 方式
    二叉树基础之按层打印
    按层打印二叉树--每行打印一层
    给定一颗完全二叉树,给每一层添加上next的指针,从左边指向右边
    缓存与数据库一致性保证
    一致性哈希算法原理
    Linux复制指定目录下的文件夹结构
  • 原文地址:https://www.cnblogs.com/tianxue/p/3933913.html
Copyright © 2020-2023  润新知