高级功能在程序

时间:2018-04-21 14:18:49

标签: c doubly-linked-list abstract-data-type

您正在尝试创建存储整数或字符串元素的通用列表迭代器。我正在尝试测试它调用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;
  }  

编辑:在头文件中添加了相应的编译和测试代码。

1 个答案:

答案 0 :(得分:0)

找到答案,以防未来的人需要帮助:

在advance函数中调用它有助于使用创建列表的函数参数初始化列表。重要的是,需要为函数元素分配链接到列表的函数元素。

IteratorG lis = newIterator(it->cmpElm,it->newElm,it->freeElm);

感谢。