我查看了其他问题,但没有人回答我的问题。我正在尝试建立一个单独链接的列表,从尾部添加一个类赋值。
/** List node **/
typedef struct node_type
{
struct node_type *next; /* Pointer to next node */
void *objPtr; /* Pointer to associated object */
} node_t;
/** List structure **/
typedef struct list_type
{
node_t *head; /* Pointer to front of list */
node_t *tail; /* Pointer to end of list */
} list_t;
list_t *newList() {
list_t *list;
list = (list_t *)malloc(sizeof(list_t));
list -> head = NULL;
list -> tail = NULL;
return(list);
}
这些是给我使用的结构。我的添加功能是这样的:
/** l_add -- add an object to the linked list **/
void l_add(list_t *list, void *objPtr) {
node_t *newNode;
newNode = (node_t *)malloc(sizeof(node_t));
newNode -> objPtr = objPtr;
newNode -> next = NULL;
if ((list -> head == NULL) && (list -> tail == NULL)) {
list -> head = newNode;
list -> tail = newNode;
} else {
list -> tail -> next = newNode;
list -> tail = newNode;
}
}
和我的迭代器相关的函数是这样的:
iterator_t *newIterator(list_t *list) {
iterator_t *itr;
itr = (iterator_t *)malloc(sizeof(iterator_t));
itr -> list = list;
itr -> position = list -> head;
return(itr);
}
void *l_next(iterator_t *iter) {
void *object;
if ((iter -> position) == NULL) {
return NULL;
exit(0);
} else {
object = iter -> position -> next;
iter -> position = iter -> position -> next;
}
return object;
}
void l_begin(iterator_t *iter) {
iter -> position = iter -> list -> head;
}
当我编译它时,它没有给我任何错误,我得到大的值,我假设是内存而不是我应该收到的数据。我传递的第一个值是“5”,列表中第一个值波动但是数百万。我还在尝试习惯指针,是否有人知道我为什么要添加地址而不是值?
我使用它的代码:
size = sizeof(data)/sizeof(int);
for(index = 0; index < size; index++) {
l_add(list1, &data[index]);
}
l_begin(iter1);
ptr1 = l_next(iter1);
fprintf(stdout, "First value=%d\n", *ptr1);
而list1是:
int data[] = {5, 10, 15, 20, 25};
list_t *list1;
list1 = newList();
*已更新,包括打印功能和迭代器。我不认为问题存在,但可能是。很抱歉这么长的问题,我试着编辑它所以没有那么多代码,所以希望所有这些都是有道理的,而且我并没有弄清楚我想要展示的内容。
大家都在同一时间得到它,谢谢你的帮助!
答案 0 :(得分:0)
您似乎没有取消引用objPtr。这就是你获得大价值的原因。
我认为l_next应该返回一个node_type。在这种情况下,您需要:
fprintf(stdout, "First value=%d\n", *((int*)ptr1->objPtr));
要更改fprintf,请将l_next中的object =更改为:
object = iter -> position -> next -> objPtr;
另外,您可能应该知道l_next实际上不会迭代。它不会改变iter中的位置值。
答案 1 :(得分:0)
您需要传入指向5值的指针。因此,不是在为5的整数集分配内存中传递“5”,而是传递指针用于内存分配:
int * newObject = (int *)malloc(sizeof(int));
*newObject = 5;
l_add(list, newObject);
要检索它,您需要将对象取消引用为您实例化5值的任何类型。
好吧,既然您发布了其余的代码,那么看起来您正在抓取下一个节点结构,因为迭代器返回对象而不是实际对象:
object = iter -> position -> next;
应该是这样的:
object = iter -> position -> objPtr;
答案 2 :(得分:0)
你的l_next
坏了;您将返回next
节点而不是对象。它应该是:
void *l_next(iterator_t *iter) {
void *object;
if ((iter -> position) == NULL) {
return NULL;
exit(0);
} else {
object = iter -> position -> objPtr;
iter -> position = iter -> position -> next;
}
return object;
}