对GPSR代码的理解——gpsr_sinklist.cc

#include "gpsr_sinklist.h"

//数据接收器初始化
//这里是将接收器链表头指向空。
Sinks::Sinks()
{
    sinklist_ = NULL;
}

//创建新的数据接收器
//参数为添加的数据接收器的id、地理坐标、上一跳节点的id
bool
Sinks::new_sink(nsaddr_t id,  double x,  double y,  nsaddr_t lasthop, int hops, int seqno)
{
    struct sink_entry *temp = sinklist_; //临时变量指向链表头
    //若链表中已存在
    while(temp)
    {
        if(temp->id_ == id) //该数据接收器已经存在
        {
            if(temp->x_ == x && temp->y_ == y &&
               ((seqno <= temp->seqno_) || (temp->hops_ <= hops)))
                return false;
            else //该数据接收器已经更新
            {
                temp->x_ = x;
                temp->y_ = y;
                temp->lasthop_ = lasthop;
                temp->hops_ = hops;
                temp->seqno_ = seqno;
                return true;
            }
        }
        temp = temp->next_;
    }
    //添加新的数据接收器到数据接收器链
  temp = (struct sink_entry*)malloc(sizeof(struct sink_entry)); //开辟内存空间
  temp->id_ = id;
  temp->x_ = x;
  temp->y_ = y;
  temp->lasthop_ = lasthop;
  temp->hops_ = hops;
  temp->seqno_ = seqno;
  temp->next_ = sinklist_; //头插
  sinklist_ = temp;
  return true;
}

//删除指定id的数据接收器
bool
Sinks::remove_sink(nsaddr_t id)
{
    struct sink_entry *temp;
    struct sink_entry *p, *q;

    q = NULL;
    p = sinklist_;
    //从链表表头开始遍历
    while(p)
    {
        temp = p;
        if(temp->id_ == id) //找到指定id的数据接收器
        {
            p = temp->next_;
            //要删除的结点不为头结点,该结点的前一结点直接指向其下一结点
            if(q)
            {
                q->next_ = p;
            }
            //要删除的结点为头结点,直接将头节点指向其下一结点
            else
            {
                sinklist_ = p;
            }
            free(temp);
            return true;
        }
        q = p;
        p = p->next_;
    }
    return false;
}

//通过id获取节点位置
void
Sinks::getLocbyID(nsaddr_t id, double &x, double &y, int &hops)
{
    struct sink_entry *temp = sinklist_;
    //遍历链表
    while(temp)
    {
        if(temp->id_ == id) //表中存在id为此的结点
        {
            x = temp->x_;
            y = temp->y_;
            hops = temp->hops_;
            return;
        }
        temp = temp->next_;
    }
    //表中不存在
    x = -1.0;
    y = -1.0;
}

//转储
//把数据接收器列表中的内容写入到文件sinklist.tr
void
Sinks::dump()
{
    struct sink_entry *temp = sinklist_;
    FILE *fp = fopen("sinklist.tr", "a+");
    while(temp)
    {
        fprintf(fp, "%d\t%f\t%f\t%d\t%d\t%d\n",
	    temp->id_, temp->x_, temp->y_,
	    temp->lasthop_, temp->hops_, temp->seqno_);
        temp = temp->next_;
    }
    fclose(fp);
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值