#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);
}
对GPSR代码的理解——gpsr_sinklist.cc
最新推荐文章于 2024-01-15 16:37:35 发布