数据结构/链式物理结构/单向线性/动态分配结点
1.数据结构研究如何使用存储区。 用来解决相对复杂的问题。
2.算法,一些常见问题的通用解决方法。
3.数字之间的关系可以从两个角度来描述。一个是数字之间与计算机无关的逻辑关系:二是数字的物理结构,是指存放数字的存储区之间关系。
4.数字之间的逻辑关系有以下几种情况:一是集合;二是线性结构;三是树状结构;四是网状结构。
5.数字的物理结构有以下两种:
一是顺序结构(内存里的存储区是连续排列的;如数组,动态分配内存都是顺序结构的例子;
顺序结构里可以给每个存储区指定一个编号,通过编号可以找到对应的存储区;通过编号找到存储区的方法叫做随机访问;顺序结构的优点是很容易找到一个数字;
顺序结构的存储区个数是很难调整的,这样容易造成内存浪费;顺序结构不适合进行插入删除操作);
二是链式物理结构(由多个相互独立的存储区构成;任何两个存储区之间可以使用指针连接;
因为每个存储区都要做两件事情,像火车一样一个是拉货,一个是链接,所以链式物理结构的每个存储区都只能是一个结构体;每个存储区称为一个结点;
链式物理结构本身是不支持随机访问的,但可以自己模拟;优势:插入删除)
6.链式物理结构演示:

1//链式物理结构的绝大多数操作都是用循环来实现的 2 #include <stdio.h> 3 4 5 typedef struct node { 6 int num; 7 struct node * p_next; 8 }node; 9 10 int main(){ 11 12 int cnt=0; 13 //声明一个结构体指针作为循环变量 14 node * p_node=NULL; 15 16 node node1={1},node2={5},node3={13}; 17 node head={0},tail={0}; 18 node node4={7}; 19 20 //在单向线性链式物理结构中可以增加一个头结点和尾结点 21 head.p_next=&node1; 22 node1.p_next=&node2; 23 node2.p_next=&node3; 24 node3.p_next=&tail; 25 //insert node4 26 /*node2.p_next=&node4; 27 node4.p_next=&node3;*/ 28 29 /*1.插入功能:如何找到插入位置 30 当我们对位置做操作的时候,是对p_first和p_middle指针中间位置做操作。 31 当我们对结点做操作的时候,可以用p_mid 32 以下三个指针和三个相邻结点捆绑 33 */ 34 for(p_node=&head;p_node!=&tail;p_node=p_node->p_next){ 35 node *p_first=p_node; 36 node *p_mid=p_first->p_next; 37 node *p_last=p_mid->p_next; 38 /*如果p_mid指针和尾结点捆绑 39 或者p_mid指针捆绑的结点里的数字比新节点的数字大 40 应该把新节点加入到p_first和p_mid 中间 41 或有短路特征*/ 42 43 if(p_mid==&tail||p_mid->num>node4.num ){ 44 p_first->p_next=&node4; 45 node4.p_next=p_mid; 46 break; 47 } 48 } 49 50 //2.删除功能:假设要删除数字5 51 for(p_node=&head;p_node!=&tail;p_node=p_node->p_next){ 52 node *p_first=p_node; 53 node *p_mid=p_first->p_next; 54 node *p_last=p_mid->p_next; 55 56 if(p_mid!=&tail &&p_mid->num==5){ 57 p_first->p_next=p_last; 58 break; 59 } } 61 for(p_node=&head;p_node!=&tail;p_node=p_node->p_next){ 62 node *p_first=p_node; 63 node *p_mid=p_first->p_next; 64 node *p_last=p_mid->p_next; 65 if(p_mid!=&tail){ 66 printf("%d\n",p_mid->num); 67 } 68 } 69 printf("\n"); 70 71 /*4.统计功能:统计有效结点的个数。 72 int cnt=0;用于计数 73 node * p_node=NULL; 74 node head={0},tail={0}; 75 当mid指针不是和尾结点捆绑的时候,就代表和有效结点在捆绑 76 */ 77 78 79 for(p_node=&head;p_node!=&tail;p_node=p_node->p_next){ 80 node *p_first=p_node; 81 node *p_mid=p_first->p_next; 82 node *p_last=p_mid->p_next; 83 if(p_mid!=&tail){ 84 cnt++; 85 } 86 } 87 printf("有效数字个数是%d\n",cnt); 88 89 /*5.实现链式物理结构的随机访问功能(根据编号找到数字) 90 */ 91 cnt=0;//重新计数,但是不能重新初始化,加了int就错了。 92 for(p_node=&head;p_node!=&tail;p_node=p_node->p_next){ 93 node *p_first=p_node; 94 node *p_mid=p_first->p_next; 95 node *p_last=p_mid->p_next; 96 if(p_mid!=&tail){ 97 if(cnt==2){ 98 printf("编号为2的数字是%d\n",p_mid->num); 99 break; //找到了之后循环结束掉; 100 } 101 cnt++;//当p_mid和有效结点捆绑的时候,我们做自增 102 } 103 } 104 105 return 0; 106 107 }
代码订正:少了第60行; // 3.显示功能
7.编写代码从键盘中获得一组整数,并按照从小到大的顺序,将其构造成链式物理结构,并按照从小到大的顺序打印到屏幕上。