- #include<stdio.h>
- #include<stdlib.h>
- typedef struct node
- {
- int data;// 数据域
- struct node* pre;// 前驱 指向上一个
- struct node* next;// 后继 指向下一个
- }NODE;
- void insertData(NODE*head, int data);
- int main()
- {
- NODE* head = (NODE*)malloc(sizeof(NODE)); // 循环双链表
- head->next = head->pre = head;// 只有一个结点时候 它的前驱和后继都是自己
- for (int i = 0; i <10; ++i) insertData(head, i);
- NODE*p = head->next;// 从第二个节点开始
- while (p != head)
- {
- printf("%d\t", p->data);
- p = p->next;
- }
- getchar();
- return 0;
- }
- void insertData(NODE*head, int data)
- {
- NODE*p = (NODE*)malloc(sizeof(NODE));
- p->data = data;// 放入数据
- #if 0// 插入部分 头插
- NODE*q = head->next;
- head->next = p;
- p->pre = head;
- p->next = q;
- q->pre = p;
- #else // 尾插
- NODE *q = head->pre; // 指向最后一个结点
- q->next = p;
- p->pre = q;
- head->pre = p;
- p->next = head;
- #endif
- }
- /*
- 优点 在任意地方插入和删除效率都高
- 循环双链表可以快速定位头尾
- 缺点 每个结点都要有两个指针保存位置 浪费一点内存
- 查找同样从前往后 一个个找
- 要大量插入删除数据 ---> 链表这种结构
- 增删改查 快速查找 排序之后的数组
- 二叉树
- 先写出来就行了 ---> 效率 时间复杂度 空间复杂度
- 一个同学的一组成绩 这个可以视为一个数据
- data 换成数组
- 一个班全部放到一个结点中 链表只有一个结点
- */
双链表
来源: http://www.bubuko.com/infodetail-3016484.html