您正在尝试创建存储整数或字符串元素的通用列表迭代器。我正在尝试测试它调用IteratorG advance(IteratorG it, int n)
函数的情况,该函数接收列表it
和if { {1}}是一个正整数,它向第一个元素前进(移动)n次。如果n为负,它向列表中的最后一个元素前进n次。然后将元素复制到新创建的列表中n
并返回列表。如果无法前进n次,则该函数返回NULL。
例如,假设有一个数组列表lis
,它指向14.当[ 20 12 15 5 14 10 5 9 3 ]
被调用时,它移动到20并返回列表为advance(list,4)
。
这是构成功能:
[5 15 12 20]
如果需要,我还为代码IteratorG.h创建了一个头文件:
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include "iteratorG.h"
typedef struct Node {
void *value; // value of thee list item
struct Node *prev;
// pointer previous node in list
struct Node *next;
// pointer to next node in list
// implemented struct here ..
} Node;
typedef struct IteratorGRep {
int numofit; // count of items in list
Node *head; // first node in list
Node *curr; // current node in list
Node *tail; // last node in list
ElmCompareFp cmpElm;
ElmNewFp newElm;
ElmFreeFp freeElm;
// implemented struct here ..
} IteratorGRep;
IteratorG newIterator(ElmCompareFp cmpFp, ElmNewFp newFp, ElmFreeFp freeFp){
IteratorG newit;
if ((newit = malloc(sizeof (struct IteratorGRep)))==NULL)
{
printf("Error...! \n");
}
//assert (newit != NULL);
newit->numofit = 0;
newit->head = NULL;
newit->tail = NULL;
newit->curr = NULL;
newit->cmpElm=cmpFp;
newit->newElm=newFp;
newit->freeElm=freeFp;
return newit;
// implemented function here and changed return value
}
IteratorG advance(IteratorG it, int n){
int zero;
zero=0;
IteratorG lis;
lis = malloc(sizeof (struct IteratorGRep));
assert (lis != NULL);
lis->numofit = 0;
lis->head = NULL;
lis->tail = NULL;
lis->curr = NULL;
Node *tem;
if ((tem = malloc(sizeof(Node))) == NULL) {
return 0;
}
if(n<0 && distanceFromStart(it)!=0 )
{
for(tem=it->curr;n!=zero;it->curr=it->curr->prev)
{
add(lis,tem);
zero++;
}
return lis;
}
if(n>0 && distanceToEnd(it)!=0)
{
for(tem=it->curr;n!=zero;it->curr=it->curr->next)
{
add(lis,tem);
zero++;
}
return lis;
}
//To be implemented
//move forward by n times
return NULL;
}
Theres也是一个处理整数数据类型的int比较文件。这是它的头文件:
#ifndef LISTITERATORG_H
#define LISTITERATORG_H
#include <stdio.h>
typedef struct IteratorGRep *IteratorG;
typedef int (*ElmCompareFp)(void const *e1, void const *e2);
typedef void *(*ElmNewFp)(void const *e1);
typedef void (*ElmFreeFp)(void *e1);
IteratorG newIterator(ElmCompareFp cmpFp, ElmNewFp newFp, ElmFreeFp freeFp);
int add(IteratorG it, void *vp);
IteratorG advance(IteratorG it, int n);
#endif
这是它的代码:
#include <stdlib.h>
#include <stdio.h>
void positiveIntFree(void *vp);
void *positiveIntNew(void const *vp);
int positiveIntCompare(void const *vp1, void const *vp2);
我正在使用Linux环境,错误是结果的指示。我尝试使用gdb来诊断问题,并能够将问题缩小到高级函数中的以下行:
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include "positiveIntType.h"
/* ===== Functions for positiveIntType ===== */
void positiveIntFree(void *vp){
free(vp);
}
void *positiveIntNew(void const *vp){
int v = * (int *) vp ;
int *ip = malloc(sizeof(int));
*ip = v;
return ip;
}
int positiveIntCompare(void const *vp1, void const *vp2){
int v1 = * (int *) vp1 ;
int v2 = * (int *) vp2 ;
if( v1 == v2 ){ return 0; }
if( v1 < v2 ) { return -1; }
return 1;
}
add函数不应该有任何问题,它会添加指向下面列表的指针,因为它已经过测试并且工作正常。我将在此处包含它:
add(lis,tem);
现在剩下的代码工作了。它只是两个函数之间的交互,给出了问题。这是一个测试代码:
int add(IteratorG it, void *vp){
Node *temp;
if ((temp = malloc(sizeof(Node))) == NULL) {
return 0;
}
Node *tempe;
if ((temp = malloc(sizeof(Node))) == NULL) {
return 0;
}
temp->value = it->newElm(vp);
//temp->next=NULL;
if(it->curr==NULL)
{
//temp->next=it->curr;
it->head=it->tail=temp;
it->curr=temp;
}
else
{
tempe=it->curr;
tempe->prev=temp;
temp->next=tempe;
it->curr=tempe;
it->curr=temp;
it->head=temp;
}
//it->tail=it->head=it->curr;
return 1;
}
编辑:在头文件中添加了相应的编译和测试代码。
答案 0 :(得分:0)
找到答案,以防未来的人需要帮助:
在advance函数中调用它有助于使用创建列表的函数参数初始化列表。重要的是,需要为函数元素分配链接到列表的函数元素。
IteratorG lis = newIterator(it->cmpElm,it->newElm,it->freeElm);
感谢。