我有以下代码:(由 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
。这不是您想要的,因为:
- 您的所有节点都将指向与其
info
相同的p
。 - 由于您要创建这些节点的动态#,因此您应该使用
malloc
、calloc
等在堆上分配这些信息结构。
我假设p
是一个带有x
和y
字段的结构,这两个字段都是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/