导航

数据结构/链式物理结构/单向线性/动态分配结点

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 }
View Code

 代码订正:少了第60行;   // 3.显示功能

 

7.编写代码从键盘中获得一组整数,并按照从小到大的顺序,将其构造成链式物理结构,并按照从小到大的顺序打印到屏幕上。

posted on 2018-07-06 13:00  爱我鸭  阅读(322)  评论(0)    收藏  举报