重用现有的链表API实现

时间:2013-07-15 06:32:59

标签: c linux

我在现有的源代码库,链接列表实现(添加节点,插入,删除,遍历)中有以下结构:

typedef struct tagDirInfo
{
  char *pdirName;
  struct tagDirInfo *__next;
  struct tagDirInfo *__prev;
}DIR_HEADER;

让我们假设char * pdirName指向数据部分 我想形成数据部分的包装并重用现有的API,因此,新的链表结构的数据部分为:

typedef struct printJob
{
  char labelName[BUF_LEN];
  int priStatus;
  time_t time_stamp;
}PRINTJOB;

我想如果我这样做:

PRINTJOB newJob;
/* Fill in newJob structure */
DIR_HEADER *newNode;
newNode->pdirName = (char*)newJob;
newNode->__next = NULL;
newNode->__prev = NULL;

这样做,将填写链表结构。

但是如何通过链表结构的pdirName字段访问labelName数据字段?

2 个答案:

答案 0 :(得分:1)

您应该使用模板(如果您可以使用c ++)。

char* Labelname = ((PRINTJOB*) newNode->pdirName)->labelName;

顺便说一句,“newJob”的类型应为PRINTJOB*,而不是PRINTJOB

更好的解决方案是:

typedef struct _LINKED_LIST {
  struct _LINKED_LIST *_Next;
  struct _LINKED_LIST *_Prev;
} LINKED_LIST;

typedef struct {
    LINKED_LIST List;
    char labelName[BUF_LEN];
    int priStatus;
    time_t time_stamp;
} MY_LINKED_LIST_DATA;

MY_LINKED_LIST_DATA* MyData = (MY_LINKED_LIST_DATA*) 
malloc(sizeof(MY_LINKED_LIST_DATA));
MyData->List->_Next = NULL;
MyData->List->_Prev = NULL;

您的数据始终包含特定于字段的字段_Next_Prev

答案 1 :(得分:1)

你的意思是你想做类似的事情:

printf("labelName : %s\n", ((PRINTJOB *)(newNode->pdirName))->labelName);

但是,您的代码有一个错误!要纠正它:

更改

  

newNode-> pdirName =(char *)newJob;

  

newNode-> pdirName =(char *)& newJob;