数据结构学习笔记(二)
2016-07-06 15:17
471 查看
数据结构学习笔记(二)
逻辑结构和物理结构之间没有--对应关系
数据结构是由一组存储区和一组相关的函数构成的
这组函数规定了这些存储区的使用方法
队列 - 先进先出
桟 - 先进后出
//双向链表演示
2
3 #include <stdlib.h>
4 /*
5 typedef struct node{
6
7 int number;
8 struct node * p_next;
9 struct node * p_pre;
10 }NODE;
11
12 typedef struct{
13 NODE head;
14 NODE tail;
15 struct NODE * p_cur;
16 }LINK;
17 */
18 //链表初始化
19 void link_init( LINK *p_link )
20 {
21
22 p_link->head.p_next = &p_link->tail;
23 p_link->tail.p_next = NULL;
24 p_link->tail.p_pre =&(p_link->head);
25 p_link->head.p_pre = NULL;
26
27 p_link->p_cur = NULL;
28
29 }
30
31 //链表清理函数
32 void link_deinit( LINK *p_link )
33 {
34 // NODE * pnode_i = NULL;
35
36 while ( p_link->head.p_next !=&p_link->tail )
37 {
38 NODE * pnode_first =&p_link->head;
39 NODE * pnode_mid =pnode_first->p_next;
40 NODE * pnode_last =pnode_mid->p_next;
41
42 pnode_first->p_next = pnode_last;
43 pnode_last->p_pre = pnode_first;
44
45 free( pnode_mid );
46 pnode_mid = NULL;
47 }
48
49 p_link->p_cur = NULL;
50 }
51
52 //统计有效节点个数
53 int link_size( const LINK* p_link )
54 {
55
56 const NODE * pnode_i = NULL;
57
58 int size = 0;
59
60 for( pnode_i = &(p_link->head);pnode_i != &(p_link->tail); pnode_i = p_node_i->p_next )
61 {
62 const NODE * pnode_first = pnode_i;
63 const NODE * pnode_mid =pnode_first->p_next;
64 const NODE * pnode_last =pnode_mid->p_next;
65
66 if( pnode_mid !=&(p_link->tail) )
67 {
68 size++;
69 }
70 }
71
72 return size;
73 }
74
75 //把新数字加入到链表的最后
76 void link_add_end( LINK *p_link, int num )
77 {
78 //NODE * pnode_i = NULL;
79
80 NODE * pnode_temp = NULL;
81
82 pnode_temp = (NODE *) malloc(sizeof(NODE));
83
84 if(!pnode_temp)
85 {
86 return;
87 }
88
89 pnode_temp->number = num;
90 pnode_temp->p_next = NULL;
91 pnode_tmep->p_pre = NULL;
92 /*
93 for(pnode_i = &(p_link->head);pnode_i != &(p_link->tail); pnode_i = pn ode_i->p_next )
94 {
95 NODE * pnode_first = pnode_i;
96 NODE * pnode_mid =pnode_first->p_next;
97 NODE * pnode_last =pnode_mid->p_next;
98
99 if(pnode_mid ==&(p_link->tail))
100 {
101 pnode_first->p_next =pnode_temp;
102 pnode_temp->p_pre =pnode_first;
103
104 pnode_temp->p_next = pnode_mid;
105 pnode_mid->p_pre = pnode_temp;
106 break;
107 }
108 }
109 */
110
111 NODE * pnode_first =&(p_link->tail.p_pre);
4000
112 NODE * pnode_mid = p_first->p_next;
113 NODE * pnode_last =pnode->mid->p_next
114
115 pnode_first->p_next =pnode_temp;
116 pnode_tmep->p_pre = pnode_first;
117
118 pnode_temp->p_next = pnode_mid;
119 pnode_mid->p_pre = pnode_temp;
120 }
121
122 //把新数字加入到链表头
123 void link_add_head( LINK* p_link, int num )
124 {
125 NODE * pnode_temp = NULL;
126 pnode_temp = (NODE *) malloc(sizeof(NODE));
127 if(!pnode_temp)
128 {
129 return;
130 }
131
132 pnode_temp->number = num;
133 pnode_temp->p_next = NULL;
134
135 NODE * pnode_first =&(p_link->head);
136 NODE * pnode_mid = pnode_first->p_next;
137 NODE * pnode_last = pnode_mid->p_next;
138
139 pnode_first->p_next =pnode_temp;
140 pnode_temp->p_pre = pnode_first;
141
142 pnode_temp->p_next = pnode_mid;
143 pnode_mid->p_pre = pnode_temp;
144 }
145
146 //按大到小的顺序把新数字加入链表
147 void link_add_order( LINK* p_link, int num )
148 {
149
150 NODE * pnode_temp = NULL;
151 NODE * pnode_i = NULL;
152
153 pnode_temp = (NODE *) malloc (sizeof(NODE));
154 if( !pnode_temp )
155 {
156 return;
157 }
158
159 pnode_temp->number = num;
160 pnode_temp->p_next = NULL;
161
162
163 for(pnode_i = &(p_link->head);pnode_i != &(p_link->tail); pnode_i = pn ode_i->p_next)
164 {
165 NODE * pnode_first = pnode_i;
66 NODE * pnode_mid =pnode_first->p_next;
7 NODE * pnode_last =pnode_mid->p_next;
8
9 if( pnode_mid ==&(p_link->head) || pnode_mid->number > num )
0 {
1 pnode_first->p_next =pnode_temp;
2 pnode_temp->p_pre =pnode_first;
3
4 pnode_temp->p_next = pnode_mid;
5 pnode_mid->p_pre = pnode_temp;
6
7 break;
8 }
9 }
0
1 }
2
3 //根据编号查找数字的函数
4 int search_by_pos( const LINK * p_link, intpos)
5 {
6 int cnt = 0;
7
8 const NODE * p_node = NULL;
9 for( p_node = &(p_link->head);p_node != &(p_link->tail); p_node = p_n ode->p_next)
0 {
1 const NODE * pnode_first = p_node;
2 const NODE * pnode_mid =pnode_first->p_next;
3 const NODE * pnode_last =pnode_mid->p_next;
4
5 if(pnode_mid !=&(p_link->tail))
6 {
7 if(cnt == pos)
8 {
9 return pnode_mid->number;
0 }
1 }
2
3 cnt++;
4 }
5
6 return -1;
7 }
8
9
0 //根据数字查找编号的函数
1 int link_search_val( const LINK * p_link, intval)
2 {
3 int cnt = 0;
4
5 const NODE * p_node = NULL;
6 for( p_node = &(p_link->head);p_node != &(p_link->tail); p_node = p_n ode->p_next)
7 {
8 const NODE * pnode_first = p_node;
9 const NODE * pnode_mid =pnode_first->p_next;
0 const NODE * pnode_last =pnode_mid->p_next;
1
2 if(pnode_mid !=&(p_link->tail))
3 {
4 if(pnode_mid->number == val)
5 {
6 return cnt;
7 }
8 }
9
0 cnt++;
1 }
2
3 return -1;
4 }
5
6 //删除第一个有效节点
7 void link_remove_head( LINK* p_link )
8 {
9
0 if(p_link->head.p_next ==&(p_link->tail))
1 {
2 return;
3 }
4
5 NODE * pnode_first =&(p_link->head);
6 NODE * pnode_mid = pnode_first->p_next;
7 NODE * pnode_last = pnode_mid->p_next;
8
9 pnode_first->p_next = pnode_last;
0 pnode_last->p_pre = pnode_first;
1
2 free(pnode_mid);
3 pnode_mid = NULL;
4 }
5
6 //删除最后一个有效节点
7 void link_remove_tail( LINK* p_link )
8 {
9 /*
0 NODE * pnode_i = NULL;
1
2 for(pnode_i = &(p_link->head);pnode_i != &(p_link->tail); pnode_i = pn ode_i->p_next )
3 {
4 NODE * pnode_first = pnode_i;
5 NODE * pnode_mid =pnode_first->p_next;
6 NODE * pnode_last =pnode_mid->p_next;
7 if(pnode_last ==&(p_link->tail))
8 {
9 pnode_first->p_next =pnode_last;
0 pnode_last->p_pre =pnode_first;
1
2 free(pnode_mid);
3 pnode_mid = NULL;
4 }
5 }
6 */
7
8 if( p_link->head.p_next ==&(p_link->tail))//-------
9 {
0 return;
1 }
2
3 NODE * pnode_last =&(p_link->p_head);
4 NODE * pnode_mid = pnode_last->p_pre;
5 NODE * pnode_first = pnode_mid->p_pre;
6
7 pnode_first->p_next = pnode_last;
8 pnode_last->p_pre = pnode_first;
9
0 free(pnode_mid);
1 pnode_mid = NULL;
2 }
4 //删除某个数字所在的节点
5 void remove_num( LINK *p_link, int num )
6 {
7 NODE * pnode_i = NULL;
8
9 for(pnode_i = &(p_link->head);pnode_i != &(p_link->tail); pnode_i = pn ode_i->p_next)
0 {
1 NODE * pnode_first = pnode_i;
2 NODE * pnode_mid =pnode_first->p_next;
3 NODE * pnode_last =pnode_mid->p_next;
4
5 if( pnode_mid !=&(p_link->tail) && pnode_mid->number == num )
6 {
7 pnode_first->p_next =pnode_last;
8 pnode_last->p_pre =pnode_first;
9 free(pnode_mid);
0 pnode_mid = NULL;
1 break;
2 }
3 }
4
5 }
8 //开始从前想向后遍历
9
0 void link_begin( LINK *p_link )
1 {
2 p_link->p_cur = &(p_link->head);
3 }
4
5 //获得后一个数字
6 int link_next( LINK *p_link, int * p_num )
7 {
8
9 if(!p_link->p_cur)
0 {
1 return 0;
2 }
3
b328
4 p_link->p_cur =p_link->p_cur->p_next;
5
6
7 if(p_link->p_cur ==&(p_link->tail))
8 {
9 p_link->p_cur = NULL;
0 return 0;
1 }
2
3 * p_num =p_link->p_cur->number;
4
5 return 1;
6 }
7
8 //从后向前遍历
9 void link_rbegin( LINK *p_link )
0 {
1 p_link-p_cur = &(p_link->tail)
2 }
3
4 //获得前一个数字
5 int link_prev( LINK *p_link, int * p_num )
6 {
7 if(!p_link->p_cur)
8 {
9 return 0;
0 }
1
2 p_link->p_cur =p_link->p_cur->p_pre;
3
4 if( p_link->p_cur ==&(p_link->head) )
5 {
6 p_link->p_cur = NULL;
7 return 0;
8 }
9
0 *p_num = p_link->p_cur->number;
1
2 return 1;
3
4}
续:数据结构学习笔记(三)
逻辑结构和物理结构之间没有--对应关系
数据结构是由一组存储区和一组相关的函数构成的
这组函数规定了这些存储区的使用方法
队列 - 先进先出
桟 - 先进后出
//双向链表演示
2
3 #include <stdlib.h>
4 /*
5 typedef struct node{
6
7 int number;
8 struct node * p_next;
9 struct node * p_pre;
10 }NODE;
11
12 typedef struct{
13 NODE head;
14 NODE tail;
15 struct NODE * p_cur;
16 }LINK;
17 */
18 //链表初始化
19 void link_init( LINK *p_link )
20 {
21
22 p_link->head.p_next = &p_link->tail;
23 p_link->tail.p_next = NULL;
24 p_link->tail.p_pre =&(p_link->head);
25 p_link->head.p_pre = NULL;
26
27 p_link->p_cur = NULL;
28
29 }
30
31 //链表清理函数
32 void link_deinit( LINK *p_link )
33 {
34 // NODE * pnode_i = NULL;
35
36 while ( p_link->head.p_next !=&p_link->tail )
37 {
38 NODE * pnode_first =&p_link->head;
39 NODE * pnode_mid =pnode_first->p_next;
40 NODE * pnode_last =pnode_mid->p_next;
41
42 pnode_first->p_next = pnode_last;
43 pnode_last->p_pre = pnode_first;
44
45 free( pnode_mid );
46 pnode_mid = NULL;
47 }
48
49 p_link->p_cur = NULL;
50 }
51
52 //统计有效节点个数
53 int link_size( const LINK* p_link )
54 {
55
56 const NODE * pnode_i = NULL;
57
58 int size = 0;
59
60 for( pnode_i = &(p_link->head);pnode_i != &(p_link->tail); pnode_i = p_node_i->p_next )
61 {
62 const NODE * pnode_first = pnode_i;
63 const NODE * pnode_mid =pnode_first->p_next;
64 const NODE * pnode_last =pnode_mid->p_next;
65
66 if( pnode_mid !=&(p_link->tail) )
67 {
68 size++;
69 }
70 }
71
72 return size;
73 }
74
75 //把新数字加入到链表的最后
76 void link_add_end( LINK *p_link, int num )
77 {
78 //NODE * pnode_i = NULL;
79
80 NODE * pnode_temp = NULL;
81
82 pnode_temp = (NODE *) malloc(sizeof(NODE));
83
84 if(!pnode_temp)
85 {
86 return;
87 }
88
89 pnode_temp->number = num;
90 pnode_temp->p_next = NULL;
91 pnode_tmep->p_pre = NULL;
92 /*
93 for(pnode_i = &(p_link->head);pnode_i != &(p_link->tail); pnode_i = pn ode_i->p_next )
94 {
95 NODE * pnode_first = pnode_i;
96 NODE * pnode_mid =pnode_first->p_next;
97 NODE * pnode_last =pnode_mid->p_next;
98
99 if(pnode_mid ==&(p_link->tail))
100 {
101 pnode_first->p_next =pnode_temp;
102 pnode_temp->p_pre =pnode_first;
103
104 pnode_temp->p_next = pnode_mid;
105 pnode_mid->p_pre = pnode_temp;
106 break;
107 }
108 }
109 */
110
111 NODE * pnode_first =&(p_link->tail.p_pre);
4000
112 NODE * pnode_mid = p_first->p_next;
113 NODE * pnode_last =pnode->mid->p_next
114
115 pnode_first->p_next =pnode_temp;
116 pnode_tmep->p_pre = pnode_first;
117
118 pnode_temp->p_next = pnode_mid;
119 pnode_mid->p_pre = pnode_temp;
120 }
121
122 //把新数字加入到链表头
123 void link_add_head( LINK* p_link, int num )
124 {
125 NODE * pnode_temp = NULL;
126 pnode_temp = (NODE *) malloc(sizeof(NODE));
127 if(!pnode_temp)
128 {
129 return;
130 }
131
132 pnode_temp->number = num;
133 pnode_temp->p_next = NULL;
134
135 NODE * pnode_first =&(p_link->head);
136 NODE * pnode_mid = pnode_first->p_next;
137 NODE * pnode_last = pnode_mid->p_next;
138
139 pnode_first->p_next =pnode_temp;
140 pnode_temp->p_pre = pnode_first;
141
142 pnode_temp->p_next = pnode_mid;
143 pnode_mid->p_pre = pnode_temp;
144 }
145
146 //按大到小的顺序把新数字加入链表
147 void link_add_order( LINK* p_link, int num )
148 {
149
150 NODE * pnode_temp = NULL;
151 NODE * pnode_i = NULL;
152
153 pnode_temp = (NODE *) malloc (sizeof(NODE));
154 if( !pnode_temp )
155 {
156 return;
157 }
158
159 pnode_temp->number = num;
160 pnode_temp->p_next = NULL;
161
162
163 for(pnode_i = &(p_link->head);pnode_i != &(p_link->tail); pnode_i = pn ode_i->p_next)
164 {
165 NODE * pnode_first = pnode_i;
66 NODE * pnode_mid =pnode_first->p_next;
7 NODE * pnode_last =pnode_mid->p_next;
8
9 if( pnode_mid ==&(p_link->head) || pnode_mid->number > num )
0 {
1 pnode_first->p_next =pnode_temp;
2 pnode_temp->p_pre =pnode_first;
3
4 pnode_temp->p_next = pnode_mid;
5 pnode_mid->p_pre = pnode_temp;
6
7 break;
8 }
9 }
0
1 }
2
3 //根据编号查找数字的函数
4 int search_by_pos( const LINK * p_link, intpos)
5 {
6 int cnt = 0;
7
8 const NODE * p_node = NULL;
9 for( p_node = &(p_link->head);p_node != &(p_link->tail); p_node = p_n ode->p_next)
0 {
1 const NODE * pnode_first = p_node;
2 const NODE * pnode_mid =pnode_first->p_next;
3 const NODE * pnode_last =pnode_mid->p_next;
4
5 if(pnode_mid !=&(p_link->tail))
6 {
7 if(cnt == pos)
8 {
9 return pnode_mid->number;
0 }
1 }
2
3 cnt++;
4 }
5
6 return -1;
7 }
8
9
0 //根据数字查找编号的函数
1 int link_search_val( const LINK * p_link, intval)
2 {
3 int cnt = 0;
4
5 const NODE * p_node = NULL;
6 for( p_node = &(p_link->head);p_node != &(p_link->tail); p_node = p_n ode->p_next)
7 {
8 const NODE * pnode_first = p_node;
9 const NODE * pnode_mid =pnode_first->p_next;
0 const NODE * pnode_last =pnode_mid->p_next;
1
2 if(pnode_mid !=&(p_link->tail))
3 {
4 if(pnode_mid->number == val)
5 {
6 return cnt;
7 }
8 }
9
0 cnt++;
1 }
2
3 return -1;
4 }
5
6 //删除第一个有效节点
7 void link_remove_head( LINK* p_link )
8 {
9
0 if(p_link->head.p_next ==&(p_link->tail))
1 {
2 return;
3 }
4
5 NODE * pnode_first =&(p_link->head);
6 NODE * pnode_mid = pnode_first->p_next;
7 NODE * pnode_last = pnode_mid->p_next;
8
9 pnode_first->p_next = pnode_last;
0 pnode_last->p_pre = pnode_first;
1
2 free(pnode_mid);
3 pnode_mid = NULL;
4 }
5
6 //删除最后一个有效节点
7 void link_remove_tail( LINK* p_link )
8 {
9 /*
0 NODE * pnode_i = NULL;
1
2 for(pnode_i = &(p_link->head);pnode_i != &(p_link->tail); pnode_i = pn ode_i->p_next )
3 {
4 NODE * pnode_first = pnode_i;
5 NODE * pnode_mid =pnode_first->p_next;
6 NODE * pnode_last =pnode_mid->p_next;
7 if(pnode_last ==&(p_link->tail))
8 {
9 pnode_first->p_next =pnode_last;
0 pnode_last->p_pre =pnode_first;
1
2 free(pnode_mid);
3 pnode_mid = NULL;
4 }
5 }
6 */
7
8 if( p_link->head.p_next ==&(p_link->tail))//-------
9 {
0 return;
1 }
2
3 NODE * pnode_last =&(p_link->p_head);
4 NODE * pnode_mid = pnode_last->p_pre;
5 NODE * pnode_first = pnode_mid->p_pre;
6
7 pnode_first->p_next = pnode_last;
8 pnode_last->p_pre = pnode_first;
9
0 free(pnode_mid);
1 pnode_mid = NULL;
2 }
4 //删除某个数字所在的节点
5 void remove_num( LINK *p_link, int num )
6 {
7 NODE * pnode_i = NULL;
8
9 for(pnode_i = &(p_link->head);pnode_i != &(p_link->tail); pnode_i = pn ode_i->p_next)
0 {
1 NODE * pnode_first = pnode_i;
2 NODE * pnode_mid =pnode_first->p_next;
3 NODE * pnode_last =pnode_mid->p_next;
4
5 if( pnode_mid !=&(p_link->tail) && pnode_mid->number == num )
6 {
7 pnode_first->p_next =pnode_last;
8 pnode_last->p_pre =pnode_first;
9 free(pnode_mid);
0 pnode_mid = NULL;
1 break;
2 }
3 }
4
5 }
8 //开始从前想向后遍历
9
0 void link_begin( LINK *p_link )
1 {
2 p_link->p_cur = &(p_link->head);
3 }
4
5 //获得后一个数字
6 int link_next( LINK *p_link, int * p_num )
7 {
8
9 if(!p_link->p_cur)
0 {
1 return 0;
2 }
3
b328
4 p_link->p_cur =p_link->p_cur->p_next;
5
6
7 if(p_link->p_cur ==&(p_link->tail))
8 {
9 p_link->p_cur = NULL;
0 return 0;
1 }
2
3 * p_num =p_link->p_cur->number;
4
5 return 1;
6 }
7
8 //从后向前遍历
9 void link_rbegin( LINK *p_link )
0 {
1 p_link-p_cur = &(p_link->tail)
2 }
3
4 //获得前一个数字
5 int link_prev( LINK *p_link, int * p_num )
6 {
7 if(!p_link->p_cur)
8 {
9 return 0;
0 }
1
2 p_link->p_cur =p_link->p_cur->p_pre;
3
4 if( p_link->p_cur ==&(p_link->head) )
5 {
6 p_link->p_cur = NULL;
7 return 0;
8 }
9
0 *p_num = p_link->p_cur->number;
1
2 return 1;
3
4}
续:数据结构学习笔记(三)
相关文章推荐
- 数据结构学习笔记(一)
- 经典数据结构 [ B树,B+树 ]
- 堆和栈的区别(内存和数据结构)
- 理解二叉堆数据结构及Swift的堆排序算法实现示例
- 数据结构5 用一个栈实现另一个栈的排序
- poj1042
- 字符串-拼写检查(数据结构基础 第4周)
- 字符串-前缀中的周期(数据结构基础 第4周)
- 数据结构与算法(每天更新)
- linux内核数据结构之kfifo
- java/数据结构/栈/队列/数组/链表/ArrayList/泛型/增强for/静态导入/可变参数
- 数据结构试验—链表实现数据信息录入
- C 实现通用Tween缓动动画(2)Tween数据结构
- sdut 数据结构实验之栈三:后缀式求值
- C语言的数据结构
- vector自定义数据结构数组按照指定元素排序
- 【数据结构与算法】Hash Table
- 字符串-KMP算法实现(数据结构基础 第4周)
- 数据结构与算法_学习笔记(1)
- 《数据结构》复习之图