C语言学习–链式物理结构
动态分配内存
源代码
#include <stdio.h>
2 #include <stdlib.h>
3
4 typedef struct node{
5 int val;
6 struct node* p_next;
7 }node_t;
8 int main(void)
9 {
10 node_t head = {0},tail = {0};
11 int arr[] = {10,5,13,45,89,45};
12 int num;
13 //没有节点的线性链式物理结构
14 head.p_next = &tail;
15 node_t* p_node;
16 node_t* p_tmp = NULL,*p_first = NULL,*p_mid = NULL,*p_last = NULL;
17 for(num = 0;num < (sizeof(arr) / sizeof(arr[0]));num ++)
18 {
19 //动态分配节点来记录新的数字
20 p_node = (node_t*)malloc(sizeof(node_t));
21 if(!p_node){
22 //动态分配失败
23 continue;
24 }
25 p_node->val = arr[num];
26 p_node->p_next = NULL;
27 //按照从小到大的顺序把新的节点插入到链式物理结构中
28 for(p_tmp=&head;p_tmp!=&tail;p_tmp=p_tmp->p_next)
29 {
30 p_first = p_tmp;
31 p_mid = p_first->p_next;
32 p_last = p_mid->p_next;
33 if(p_mid == &tail || arr[num] < p_mid->val)
34 {
35 p_first->p_next = p_node;
36 p_node->p_next = p_mid;
37 break;
38 }
39 }
40 }
41 for(p_tmp=&head;p_tmp!=&tail;p_tmp=p_tmp->p_next)
42 {
43 p_first = p_tmp;
44 p_mid = p_first->p_next;
45 p_last = p_mid->p_next;
46 if(p_mid!=&tail)
47 printf("%d ",p_mid->val);
48 }
49 //释放所有动态分配的节点
50 while(head.p_next != &tail)
51 {
52 p_first = &head;
53 //p_mid指针指向第一个有效节点,也就是要释放的节点
54 p_mid = p_first->p_next;
55 p_last = p_mid->p_next;
56 //把p_mid指针指向的节点从链式物理结构中摘出来
57 p_first->p_next = p_last;
58 free(p_mid);
59 p_mid = NULL;
60 }
61 printf("\n");
62 return 0;
63 }
程序的输出结果:
5 10 13 45 45 89