在循环列表中添加节点

时间:2013-03-29 20:05:38

标签: c list nodes circular-list

我有以下代码:

int InsForward (TL2 p, void* x){
 /* Inserta a node a step forward from the supplied p*/
 TL2 h = (TL2)calloc(1,sizeof(TCel2));
 if (!h)
      return 0;
h->pre = p->pre;
h->nxt= p;
p->pre = h;
p->pre->nxt = h;
h->info = x;   
return 1;

}

如何在已分配标记的循环列表中添加新节点?它已经给我打了好几个小时,因为节点已经分配但是链接是borked,它显示了每个的相同数据值,除了sentinel,这很好。

我尝试了什么:

 /* TCel a, int p, FILE fi*/
 while(fscanf(fi,"%i%i", &(p.x), &(p.y)) == 2)
  if ( InsForward(a, &p) == 0)   
       break;    

结构:

 typedef struct cel2
 { 
   struct cel2 *pre, *nxt;  
   void* info;              
 } TCel2, *TL2;

LE:所以我更新了代码,并写了这个来检查它:         / * TL2 u * /

for (u = a->nxt; u != a; u = u->nxt)
       printf("%i %i\n", u->info, u->info);

是的,信息无效,但我很好奇,如果细胞不同......我想不是:

  2686632 2686632 2686632 2686632 2686632 2686632  

这是怎么回事?!

2 个答案:

答案 0 :(得分:1)

也许我的理解是有缺陷的,但我相信这应该是:

h->pre = p->nxt;
p->nxt = h;
h->nxt = p;

这基本上是一个循环列表。假设p是循环列表中的第一个节点,h是最后一个节点。

答案 1 :(得分:1)

您的代码应为

int InsForward (TL2 p, void* x){
     /* Inserta a node a step forward from the supplied p*/
     TL2 h = (TL2)calloc(1,sizeof(TCel2));
     if (!h)
        return 0;
    h->pre = p;        //sets h previous to point to p
    h->nxt= p->nxt;    //sets h next to point to where p was pointing ( sentinel )
    p->nxt->prv = h;   //sets the sentinel previous to point to h
    p->nxt = h;        //sets the p next to point to h
    h->info = x;   
return 1;

这会在p和哨兵之间插入h