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

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

  用设计模式实现完以后我突然发现,所谓的设计模式其实在C语言里不就是链表吗?当前节点能处理就处理不能处理让下一个节点处理,不多说,上代码

  消息类的设计

  message.h

  #ifndef MESSAGE_H

  #define MESSAGE_H

  #define TRUE 1

  #define FALSE 0

  typedef struct {

  int sender;

  int isSend;

  int isCharge;

  char date ;

  }Message;

  Message * makeMessage(const int sender, const char *date);

  void setSendFlag(Message * const message);

  void setChargeFlag(Message * const message);

  int isSameDate(const Message * const message, const char * const date);

  char * format(const Message * const message);

  const char * boolStr(const int value);

  #endif

  message.c

  #include <assert.h>

  #include <string.h>

  #include <stdlib.h>

  #include <stdio.h>

  #include "message.h"

  Message * makeMessage(const int sender, const char *date)

  {

  Message *message = (Message*)malloc(sizeof(Message));

  assert(message != NULL);

  message->sender   = sender;

  message->isSend   = FALSE;

  message->isCharge = FALSE;

  strncpy(message->date, date, 8);

  return message;

  }

  const char * boolStr(const int value)

  {

  return value == TRUE "TRUE" : "FALSE";

  }

  char * format(const Message * const message)

  {

  #define BUF_SIZE 1024

  static char buffer[BUF_SIZE];

  memset(&buffer, 0, BUF_SIZE);

  snprintf((char*)&buffer, BUF_SIZE, "Message <%d isSend:%s isCharge:%s>\n", \

  message->sender, boolStr(message->isSend), boolStr(message->isCharge));

  return (char*)buffer;

  }

  void setSendFlag(Message * const message)

  {

  message->isSend = TRUE;

  }

  void setChargeFlag(Message * const message)

  {

  message->isCharge = TRUE;

  }

  int isSameDate(const Message * const message, const char * const date)

  {

  if (strncmp(message->date, date, 8) == 0)

  {

  return TRUE;

  }

  else

  {

  return FALSE;

  }

  }

  testMessage.c

  #include <stdio.h>

  #include "message.h"

  #include "gtest/gtest.h"

  TEST(MESSAGE,makeMessage){

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

  EXPECT_EQ(1, message->sender);

  EXPECT_STREQ("Message <1 isSend:FALSE isCharge:FALSE>\n", format(message));

  }

  链表类的实现

  node.h

  #ifndef NOTE_H

  #define NOTE_H

  typedef struct Node{

  void *ptr;

  struct Node *next;

  }Node;

  Node *makeListWithArray(void *array[], int length);

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

  #endif

  node.c

  #include <stdlib.h>

  #include <assert.h>

  #include "node.h"

  Node *makeListWithArray(void *array[], int length)

  {

  int i;