学完几种线性表后发现自己常常会搞错,原因还是没有总结区分牢记。今天趁着有时间赶紧写下来让记忆更加牢固。
=========================================分界线======================================
一、顺序表:
结构类型定义
typedef struct
{
char name[20];
int id;
} Book;
typedef struct
{
Book *base;
int length;
}
接下来当然是各种基本操作
1、取值操作:GetElem(SqList L, int i , Book &e) 注意需要判断i是不是合理,然后将对应的元素保存到e
2、查找操作:LocateElem(Sqlist L, Book e) 查找成功返回序号,这没什么好说的!
3、插入操作:ListInsert(Sqlist &L, int i, Book e) 这里有几点要注意:注意i是否合法 1<= i < length+1 ,注意表是否满了,注意最后表长加一。
4、删除操作:ListDelete( Sqlist &L , int i) 注意几点:判断i是否合法,最后记得表长减一。
===========================================分界线=======================================
二、链表
单链表结构类型定义
typedef struct Node
{
ElemType data;
struct Node *next;
} Node ,*Linklist;
//其实上面的 *LinkList 在不在这里定义都无所谓,因为我们后面可以直接定义。
接下来当然是各种基本操作
1、初始化操作:InitList( Linklist &L) 生成新节点作为头结点,next指向NULL;
2、取值操作: GetElem( Linklist L, int i,ElemType &e)这里注意判断 i 是否合法
3、查找操作: *LocateElem( Linklist L, ElemType e) 注意查询成功返回节点的地址,不存在返回Null
4、插入操作:ListInsert( LinkList &L, int i ,ElemType e)
5、删除操作:ListDelete( Linklist &L,int i )同样判断 i 值合法性。
7、前插法操作:CreateList_H (LinkList &L , int n)
8、后插法操作:CreateList_R(LinkList &L , int n
循环链表
和单链表操作基本一致,差别在于判别指针p是否指向终点条件不同。单链表条件为p!= null或者 p->next != null 而循环条件是 p!= L 或者 p->next != L 。
双向链表
typedef struct DNode
{
ElemType data;
struct Node *next;
struct Node *prior;
} DNode,*DLinkList;
基本操作
1、插入操作:ListInsert(DlinkList &L , int i, ElemType e)
2、删除操作:LinkDelete(DLinklist & L,int i )
3、其他操作:只涉及一个方向的操作与 单链表类似不再多讲。
==========================================分界线========================================
三、顺序栈
结构类型定义
typedef struct
{
ElemType *base;
ElemType *top;
int stacksize;
}
base为栈底指针,始终指向栈底,top为栈顶指针(栈顶元素的上一个);当base=top时栈为空。stacksize 为栈可用的最大容量。进出元素只有top移动。
基本操作:
1、初始化操作: InitStack(SqStack &S ) 初始化stacksize , 分配数组空间 , top=base 。
2、入栈操作: Push(SqStack &S ,ElemType e),判断是否满了,指针加一。
3、出栈操作:Pop(SqStack &S,ElemType &e),判断是否空栈,指针减一。
4、去栈顶元素:GetTop(SqStack S),栈非空返回栈顶元素值,栈顶指针保持不变。
=========================================分界线==========================================
四、链栈
结构类型定义
typedef struct StackNode
{
ElemType data;
struct StackNode *next;
} StackNode,*LinkStack;
基本操作: 主要操作是在栈顶插入与删除
1、初始化操作:InitStack(LinkStack & S)
2、入栈操作:Push(LinkStack &S , ElemType e)
3、出栈操作:Pop(LinkStack &S,ElemType &e) 注意要判断是否为空,最后还要释放空间。
4、取栈顶元素:GetTop(LinkStack L) 返回栈顶元素的值
====================================分界线============================================
五、循环队列 ——(也称为 队列的顺序表示 )
结构类型定义
typedef struct
{
ElemType *base;
int front;
int rear;
} SqQueue;
基本操作:
1、初始化操作:InitQueue(SqQueue & Q),分配好数组的大小,base为基地址。头指针与尾指针为0.
2、求队列的长度:(SqQueue Q),(rear-front+MAXSIZE)%MAXSIZE ;
3、入队操作: EnQueue(SqQueue &Q,ElemType e)判断是否满了
4、出队操作:DeQueue(SqQueue &Q,ElemType &e),判断是否为空
5、取队头元素:GetHead(SqQueue Q)
=======================================分界线==========================================
六、链队
结构类型定义
typedef struct QNode
{
ElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
} LinkQueue;
基本操作:
1、初始化操作:InitQueue(LinkQueue &Q)
2、入队操作:EnQueue(LinkQueue &Q,ElemType e)
3、出队操作:DeQueue(LinkQueue &Q,ElemType &e)
4、取队头元素:GetHead(LinkQueue Q)