C++ 0507 指针和链表的使用

指针参数和引用参数

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     {
        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;
        }
    }
}


链表的使用


 

你可能感兴趣的:(C++)