我在现有的源代码库,链接列表实现(添加节点,插入,删除,遍历)中有以下结构:
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数据字段?
答案 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;