用链表解决if语句过多的问题(二)

2014-02-14 12:51:44 · 作者: · 浏览: 196

 

  Node *last = NULL;

  assert(array != NULL && length > 0);

  for(i = length - 1; i >= 0; i--)

  {

  Node *node = (Node*)malloc(sizeof(Node));

  node->ptr  = array[i];

  node->next = last;

  last = node;

  }

  return last;

  }

  void foreach(Node *list, void (*process) (Node *))

  {

  Node *current = NULL;

  assert(list != NULL && process != NULL);

  for(current = list; current != NULL; current = current->next)

  {

  process(current);

  }

  }

  testNode.c

  #include <stdio.h>

  #include "node.h"

  #include "gtest/gtest.h"

  void printNode(Node *node)

  {

  static int i = 0;

  int data[] = {1,2,3};

  EXPECT_EQ(data[i], *(int*)node->ptr);

  i++;

  }

  TEST(NODE,makeListWithArray){

  int i;

  int data[] = {1,2,3};

  void *aSet[] = {&data[0], &data , &data };

  Node *list = makeListWithArray(aSet, 3);

  foreach(list, printNode);

  }

  程序入口实现(main.c)

  #include <stdio.h>

  #include <string.h>

  #include "message.h"

  #include "node.h"

  # define FALSE 0

  # define TRUE  1

  typedef int BOOL;

  typedef BOOL (*FuncIsAllowSend)(Message *, Node*);

  BOOL isAllowSendCheckDate(Message *message, Node *node)

  {

  FuncIsAllowSend isAllowSend = NULL;

  if(strcmp(message->date, "20130101") == 0)

  {

  return FALSE;

  }

  isAllowSend = (FuncIsAllowSend) node->next->ptr;

  return isAllowSend(message, node->next);

  }

  BOOL isAllowSendCheckWhiteList(Message *message, Node *node)

  {

  FuncIsAllowSend isAllowSend = NULL;

  if(message->sender == 10)

  {

  return TRUE;

  }

  isAllowSend = (FuncIsAllowSend) node->next->ptr;

  return isAllowSend(message, node->next);

  }

  BOOL isAllowSendWithDefault(Message *message, Node *node)

  {

  setChargeFlag(message);

  return TRUE;

  }

  int main()

  {

  Message *message = makeMessage(1,"20131212");

  void *actionList[] = {(void*)&isAllowSendCheckDate,

  (void*)&isAllowSendCheckWhiteList,

  (void*)&isAllowSendWithDefault};

  Node *theList = makeListWithArray(actionList, sizeof(actionList)/4);

  FuncIsAllowSend isAllowSend = (FuncIsAllowSend)theList->ptr;

  if(isAllowSend(message, theList) == TRUE)

  {

  setSendFlag(message);

  }

  printf("%s\n",format(message));

  }

  代码风格其实是C风格,但是因为要使用gtest不得不使用了g++对程序进行编译调试,命令如下:

  # 前提:我已经把gtest编译成库放在了系统目录下

  g++ -c message.c

  g++ -c testMessage.c

  g++ message.o testMessage.o -lgtest -lpthread

  ./a.out

  g++ -c node.c

  g++ -c testNode.c

  g++ node.o testNode.o -lgtest -lpthread

  ./a.out

  g++ -c main.c

  g++ message.o node.o main.o

  ./a.out