双向循环链表的创建
struct DNode
{
struct DNode* prev; //指向上一个结点
struct DNode* next; //指向下一个结点
char elem[]; //使用柔性数组可以接受任何类型
};
再是双向循环链表的结点前插入、结点后插入以及删除结点
//在node之前插入
void insert_before(struct DNode* node, const void* pElem, size_t elemSize)
{
assert(node!=NULL && pelem!=NULL && elemsize!=0);
//因为使用的是柔性数组所以分配内存要加上插入数据的大小
struct DNode* insNode = (struct DNode*)malloc(sizeof(struct DNode) + elemSize);
if(insNode == NULL)
return;
insNode->next = node;
insNode->prev = node->prev;
memcpy(node->elem, pElem, elemSize); //因为不知道elem的类型,所以要用内存拷贝
node->prev->next = insNode; //这两句的顺序不能乱
node->prev = insNode;
}
//在node之后插入,和上面区别不多,就改几句话
void insert_after(struct DNode* node, const void* pElem, size_t elemSize)
{
assert(node!=NULL && pelem!=NULL && elemsize!=0);
//因为使用的是柔性数组所以分配内存要加上插入数据的大小
struct DNode* insNode = (struct DNode*)malloc(sizeof(struct DNode) + elemSize);
if(insNode == NULL)
return;
insNode->next = node->next;
insNode->prev = node;
memcpy(node->elem, pElem, elemSize);
node->next->prev = insNode; //这两句的顺序不能乱
node->next = insNode;
}
//删除node结点
void delete_dnode(struct DNode* node)
{
assert(node != NULL);
if(node->next = node) //如果node为头结点怎不能删除
return;
node->prev->next = node->next;
node->next->prev = node->prev;
free(node);
}
//创建一个头结点
struct DNode* create_cdlist(void)
{
//因为头结点不存储数据,所以直接分配结构体大小的内存即可
struct DNode* list = (struct DNode*)malloc(sizeof(struct DNode));
if(list != NULL) //创建失败则直接返回NULL
{
list->next = list;
list->prev = list; //刚开始没数据且为且为环所以都先指向自己
}
return list;
}
//获取第pos个结点,pos从1一开始
struct DNode* get_dnode(struct DNode* list, size_t pos)
{
assert(list != NULL);
struct DNode* node = list->next;
size_t i;
for(i = 1; i<pos && node!=list; i++, node = node->next);
if(i < pos) //pos比链表总长度大时,node已经循环了一圈退出了循环指向了头结点,
//这时候返回空
return NULL;
return node;
}