1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct node 4 { 5 int data;//数据域 6 struct node* pre;//前驱 指向上一个 7 struct node* next;//后继 指向下一个 8 }NODE; 9 10 11 void insertData(NODE*head, int data); 12 13 int main() 14 { 15 NODE* head = (NODE*)malloc(sizeof(NODE)); //循环双链表 16 head->next = head->pre = head;//只有一个结点时候 它的前驱和后继都是自己 17 18 for (int i = 0; i < 10; ++i) insertData(head, i); 19 20 21 22 NODE*p = head->next;//从第二个节点开始 23 while (p != head) 24 { 25 printf("%d ", p->data); 26 p = p->next; 27 } 28 29 getchar(); 30 return 0; 31 } 32 33 void insertData(NODE*head, int data) 34 { 35 NODE*p = (NODE*)malloc(sizeof(NODE)); 36 p->data = data;//放入数据 37 38 #if 0//插入部分 头插 39 NODE*q = head->next; 40 41 head->next = p; 42 p->pre = head; 43 p->next = q; 44 q->pre = p; 45 #else //尾插 46 NODE *q = head->pre; //指向最后一个结点 47 q->next = p; 48 p->pre = q; 49 head->pre = p; 50 p->next = head; 51 #endif 52 } 53 54 55 /* 56 优点 在任意地方插入和删除效率都高 57 循环双链表可以快速定位头尾 58 59 缺点 每个结点都要有两个指针保存位置 浪费一点内存 60 查找同样从前往后 一个个找 61 62 63 要大量插入删除数据--->链表这种结构 64 65 66 增删改查 快速查找 排序之后的数组 67 二叉树 68 69 70 先写出来就行了--->效率 时间复杂度 空间复杂度 71 72 73 74 一个同学的一组成绩 这个可以视为一个数据 75 data换成数组 76 77 78 79 一个班全部放到一个结点中 链表只有一个结点 80 81 */