- #include
- #include
-
- // 双向循环链表
- typedef int datatype_t;
- typedef struct node{
- datatype_t data;
- struct node *prior;
- struct node *next;
- } dlinklist_t;
-
- // 创建空的双向循环链表
- dlinklist_t * dlinklist_create() {
- dlinklist_t *dl;
- dl = (dlinklist_t *)malloc(sizeof(dlinklist_t));// malloc是从堆里面获得的空间
- dl->next = dl->prior = dl;
- return dl;
- }
-
- // 使用头插法向链表中插入数据
- void dlinklist_head_insert(dlinklist_t *dl, datatype_t value) {
- dlinklist_t *temp = (dlinklist_t *)malloc(sizeof(dlinklist_t));
- temp->data = value;
-
- // 这样写可以同时兼容头结点有数据和没有数据的情况
- dlinklist_t *pnext = dl->next;
- dl->next = temp;
- temp->next = pnext;
- pnext->prior = temp;
- return;
- }
-
- // 实现尾插法 双向循环链表的尾插是非常快的 因为可以直接得到需要的位置 时间复杂度为O(1)
- void dlinklist_tail_insert(dlinklist_t *dl, datatype_t value) {
- dlinklist_t *temp = (dlinklist_t *)malloc(sizeof(dlinklist_t));
- temp->data = value;
- temp->next = dl;
- temp->prior = dl->prior;
- dl->prior->next = temp;
- dl->prior = temp;
- return;
- }
-
- // 显示
- void dlinklist_show(dlinklist_t *dl) {
- dlinklist_t *temp = dl;
- while (dl->next != temp)
- {
-
- dl = dl->next;
- printf("%d ", dl->data);
- }
-
- printf("\n");
- return;
- }
-
- // 判断链表是否为空
- int dlinklist_empty(dlinklist_t *dl) {
- return dl->next == dl ? 1 : 0;
- }
-
- // 删除数据节点
- int dlinklist_head_delete(dlinklist_t *dl) {
-
- // 删除前先判断是否为空
- if (dlinklist_empty(dl))
- {
- printf("empty");
- return 0;
- }
-
- // 保存被删除节点的地址
- dlinklist_t *temp = dl->next;
-
- // 保存被删除节点的下一个节点的地址
- dlinklist_t *nnext = temp->next;
-
- // 将节点从双向循环链表中删除
- dl->next = nnext;
- nnext->prior = dl;
-
- // 保存数据并返回
- datatype_t value = temp->data;
-
- // 释放被删除节点占用的内存空间
- free(temp);
- temp = NULL;
- return value;
- }
-
- int main() {
- dlinklist_t *dl;
- dl = dlinklist_create();
- dlinklist_head_insert(dl, 100);
- dlinklist_head_insert(dl, 200);
- dlinklist_head_insert(dl, 300);
- dlinklist_show(dl);
-
- dlinklist_tail_insert(dl, 400);
- dlinklist_show(dl);
-
- printf("\n从节点中删除了:%d\n", dlinklist_head_delete(dl));
- dlinklist_show(dl);
-
- printf("\n从节点中删除了:%d\n", dlinklist_head_delete(dl));
- dlinklist_show(dl);
-
- printf("\n从节点中删除了:%d\n", dlinklist_head_delete(dl));
- dlinklist_show(dl);
-
- dlinklist_tail_insert(dl, 500);
- dlinklist_tail_insert(dl, 600);
- dlinklist_show(dl);
-
- printf("\n从节点中删除了:%d\n", dlinklist_head_delete(dl));
- dlinklist_show(dl);
- return 0;
- }
下面是执行效果
