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\t", 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 */