【我的漫漫跨考路】数据结构第二章--线性结构

脉络图

正文之前

本人目前华科机械大三,因为实习期间见识到了传统机械的无聊枯燥,所以决定往计算机跑,也就是说,准备跨考计算机了。不准备到处乱跑,华科计算机有认识的学长,所以还是乖乖的考本校吧!鉴于没有上过计算机的课,所以我先学习一波数据结构,计算机网络当初考了计算机三四级的时候学了两遍,暂时不急!下面是我的一些电子笔记,分享出来。不过考研的人时间是宝贵的。所以排版/文字解说方面的可能有所欠缺,希望各位理解。

正文

1.~ 用数字直接表示顺序存储结构,含有很多的零项,造成空间浪费,数组下标表示指数,数组内的数据表示该位置的系数。

2.~ 用一个二元数组来表示,第一个数据为系数,第二个数据为指数。并且按照指数的大小进行有序存储。

3.~ 链表存储数据非零项,链表中每个节点存储一个非零项的系数,指数以及下一个节点的指针。

4.~ 线性表(Linear List)”:由同类型数据元素构成有序序列的线性结构
表中元素个数称为线性表的长度 
线性表没有元素时,称为空表 
表起始位置称表头,表结束位置称表尾

5.~ typedef struct{
ElementType Data[MAXSIZE];
int Last; } List;
List L, *PtrL;
访问下标为 i 的元素:L.Data[i] 或 PtrL->Data[i]
线性表的长度:L.Last+1 或 PtrL->Last+1

由此可见,结构体可以采用直接声明以及声明此类型的指针两种。常用指针。

6.~ 优秀思想:在插入之前,一定要检查线性表是否已经达到饱和了以及检查输入的实参的合法性!

void Insert( ElementType X, int i, List *PtrL ) {       
int j;         
if ( PtrL->Last == MAXSIZE-1 )
{        /* 表空间已满,不能插入*/                  
printf("表满");                   
return;          }           
if ( i < 1 || i > PtrL->Last+2) {             
 /*检查插入位置的合法性*/                
printf("位置不合法");                
return;          }          
for ( j = PtrL->Last; j >= i-1; j-- )               
PtrL->Data[j+1] = PtrL->Data[j];  
/*将 ai~ an倒序向后移动*/         
PtrL->Data[i-1] = X;                             /*新元素插入*/         PtrL->Last++;                                       /*Last仍指向最后元素*/         return;  } 

7.~ 链表存储中,一定要有一个表头,不然根本找不到整个链表。

8.~ 链表的插入代码实现:

List *Insert( ElementType X, int i, List *PtrL ) {       
List  *p, *s;         
if ( i == 1 ) {                                                      
 /* 新结点插入在表头 */              
s = (List *)malloc(sizeof(List));                    
 /*申请、填装结点*/              
s->Data = X;               
s->Next = PtrL;              
return s;                                                            
/*返回新表头指针*/         }         
p = FindKth( i-1, PtrL );                                        
/* 查找第i-1个结点 */         
if ( p == NULL ) {                                    
/* 第i-1个不存在,不能插入 */                  
printf("参数i错");                 
return NULL;          }
else {                 
s = (List *)malloc(sizeof(List));                     /*申请、填装结点*/              
s->Data = X;                  
s->Next = p->Next;                 /*新结点插入在第i-1个结点的后面*/                 
p->Next = s;                  
return PtrL;        } 
}

9.~ 堆栈:堆栈可以想象为一个死胡同,而且只有一个人宽,那么最后进去的那个人肯定是最先出来的,因为他不出来,后面的人根本出不来。一般用于现场保护(递归函数,函数调用等)

10.~ 后缀表达式: 很简单的一个东西。按照你计算时候的加减优先级顺序,比如上面的5+6/2-34这个中缀表达式如何转换?第一,先算6/2=3得到一个62/(等价于3)放好,然后是34=12 得到34(等价于12)放好,然后62/先与5结合得到562/+然后这个整体(8)再与后面的12结合,有了562/+34- =-4

11.~ 堆栈的顺序是使用数组存储数据,配合一个说明当前栈顶在哪个数组下标内的int栈顶指针。
入栈的时候用一个指针指向整个结构体,然后先判断是否已经满栈,没满的话,那就先++栈顶指针,再以栈顶指针为数组下标,进行元素入栈。
出站的时候先判断是否已经空栈,没空的话,那就先--顶指针,再以栈顶指针为数组下--下标,进行元素入栈。

12.~ 队列: 队列是跟堆栈有类似的地方但是又很不同的地方。堆栈是一个死胡同。队列就是火车站的单向检票口,先排队的肯定先出队伍。

.

正文之后

来不及多说了。下午还是难熬的实习,但是自从有了数据结构,腰不酸了!腿不疼了!人不困了!简直是治病神药!大家快来一起快乐的学习吧!(另外,最近好像国内禁止商业VPN很火热啊,然而,我是小家小户自己搭的梯子,而且最近承蒙学长指导习得屠龙技~~~嘿嘿嘿!笑看禁VPN风潮)

posted @ 2017-08-10 18:41  HustWolfzzb  阅读(479)  评论(0编辑  收藏  举报