C++ 0507 指针和链表的使用
发布日期:2021-05-08 04:49:46 浏览次数:17 分类:精选文章

本文共 1199 字,大约阅读时间需要 3 分钟。

指针参数和引用参数

int x = 2;

x=incr_v(x); //将x拷贝到incr_v(),然后将结果拷贝出来并赋予x

使用指针参数警告编程者有些东西可能改变。

int x = 7;
incr_p(&x); //需要&
incr_r(x);

指针、引用和继承

当我们希望很容易地移除一个元素时,应使用双向链表。

struct Link

{
    string value;
    Link* prev;
    Link* succ;
    Link(const string& v, Link* p=nullptr, Link* s=nullptr)
        :value{v},prev{p},succ{s} {}
};

norse_gods

Freia Odin Thor

n p 

Link* insert(Link* p, Link* n) // 在P之前插入n(不完整)

{
    n->succ = p; //p紧跟在n之后
    p->prev->succ = n; //n紧跟在p的前驱之后
    n->prev=p->prev; //p的前驱变为n的前驱
    p->prev=n; //n变为p的前驱
    return n;
}

Link* norse_gods = new Link{"Thor"};

norse_gods = insert(norse_gods, new Link{"Odin"});
norse_gods = insert(norse_gods, new Link{"Freia"});

链表操作

Link* erase(Link* p) // 从链表中删除 *p;返回p的后继

{
    if (p==nullptr) return nullptr;
    if (p->succ) p->succ->prev = p->prev;
    if (p->prev) p->prev->succ = p->succ;
    return p->succ;
}

Link* find(Link* p, const string& s) // 在链表中查找s

{
    while(p)
    {
        if (p->value == s) return p;
        p = p->succ;
    }
    return nullptr;
}

//n为正数表示前进,负数表示后退
Link* advance(Link* p, int n) //在链表中移动n个位置
{
    if(p==nullptr) return nullptr;
    if(0<n)
    {
        while(n--)
        {
             if(p->succ == nullptr) return nullptr;
             p = p->succ;
        }
    }
    else if(n<0)
    {
        while(n++)
        {
             if(p->prev == nullptr) return nullptr;
             p = p->prev;
        }
    }
}

链表的使用

 

上一篇:Centos7 安装Docker UI 管理界面
下一篇:.netcore-abp-其它开源模块

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年03月25日 13时50分14秒