线性表的顺序表示指的是用一组地址连续的存储空间一次存储线性表的数据元素。(连续空间、静态链表)
通常都用数组来描述数据结构中的顺序存储结构。定义如下:
typedef struct{
ElemType *elem; //存储空间基址;
int legth; //当前长度;空表长度
int listsize; //当前分配存储容量;
}SqList;
构造空的线性表,初始化线性表。
status InitList_Sq(SqList &L){
L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem) exit(OVERFLOW);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return ok;
}
在线性表的第i-1个元素和第i个元素之间插入一个元素b。线性表由(a1,a2…….ai-1,ai,…..an)n个元素变成了(a1,a2…….ai-1,b,ai,…..an)n+1个元素。插入元素b后,后面ai到an个元素顺序后移。
和插入相似,删除元素后,后续的元素顺序前移一个位置。
线性表的单链表存储结构
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
以前遇到的元素都是正向输入,如果现在给一串逆向输入的数据。比如以前给出1、2、3、4,以此建立正向链表。现在给出4、3、2、1,要求建立一个1、2、3、4顺序的链表。这样就需要逆向建立链表,最后在建立一个头。
如果两个链表是有序的,那么可以在n的时间复杂度内,原地合并。
静态链表的存储结构如下:
typedef struct {
ElemType data;
int cur;
}component,SLinkList[MAXSIZE];
每个链表可以看成一个二维的数组,每个元素物理上相邻,但是逻辑上并不一定相邻。这就是和顺序表的区别。所以这里需要存储每个元素的逻辑位置。
它的特点是表中最后一个节点的指针域指向头结点,整个链表形成一个环。
顺序栈,利用一组地址连续的存储单元依次存储自栈底到栈顶的元素,同时附设指针top指示栈顶元素在顺序栈中的位置。
例如:(1348)十 = (2504)八
void conversion(){
InitStack();
scanf("%d", &N);
while(N){
push(N%8);
N /= 8;
}
while(!StackEmpty()){
Pop(S,e);
printf("%d",e);
}
}`
bfs宽度搜索,一般用队列
例如求下面表达式的值:
4+2*3-10/5
算术四则运算的规则:
1. 先乘除、后加减
2. 从左算到右
3. 先括号内,后括号外
算法如下:
可以用连续的存储空间
链表实现的队列。
初始化建空队列时,令front = rear = 0,每当插入新的队列队尾元素时,尾指针增1,每当删除队头元素时,头指针曾1。如果(rear+1)% MAXQSIZE = front,那么表示队列已满。