c - 循环链表中具有相同值的节点

标签 c circular-list

我有以下代码:(由 Armin 提供)

 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;

我尝试过的:

/* 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;

所以我检查了它:

 /* TL2 u*/

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

是的,该信息无效,但我很好奇地址是否不同......我想没有:

 0028FEA8 0028FEA8 0028FEA8 0028FEA8 0028FEA8 0028FEA8 

为什么它们是一样的?!

最佳答案

在此循环中,您永远不会创建新的p。您正在重复使用相同的 p 来存储 fscanf 的结果,然后使用指向 p 的指针来设置 info 节点的字段。

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

这就是为什么所有指针最终都指向同一个p。这不是您想要的,因为:

  1. 您的所有节点都将指向与其 info 相同的 p
  2. 由于您要创建这些节点的动态#,因此您应该使用 malloccalloc 等在堆上分配这些信息结构。

我假设p是一个带有xy字段的结构,这两个字段都是int 。你应该这样。我将此结构称为 tuple_t

while(true) {
 tuple_t *p = malloc(sizeof(tuple_t));
 int f = fscanf(fi,"%i%i", &(p->x), &(p->y));
 if (f != 2 || InsForward(a, p) == 0) {
   break;
}

当然,您需要添加更多您认为合适的错误处理和内存管理。

关于c - 循环链表中具有相同值的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15711023/

相关文章:

Make 中的 C 编译错误,但不是 GCC/G++

c - 我无法正确地对我的四个阵列执行数据验证。

c - 在c中打印双向链表的内容仅打印出第一个节点

使用链表的循环队列

c - 将值写入 C 中 .csv 文件中的新行

c - TicTacToe 的 Minimax 算法无法正常工作

c - 练习 9.7 Kochan。奇怪的输出

c++ - 无法在赋值中将 'clist<int>::node*' 转换为 'clist<char>::node*'

java - 循环链表和迭代器 API 缺乏确定性

list - 在haskell中创建循环列表的三种方法