对几种线性表做一个总结

       学完几种线性表后发现自己常常会搞错,原因还是没有总结区分牢记。今天趁着有时间赶紧写下来让记忆更加牢固。

=========================================分界线======================================

一、顺序表:

                                                            结构类型定义

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)

只是简单的勾勒出学过的线性表的基本知识框架,详细实现在前面那几个博客里面可以看到。我想通过这个简单的体系,可以联系到详细的实现。书是越读越薄嘛!厚积薄发也许是这个道理。继续,加油!

 

猜你喜欢

转载自blog.csdn.net/cj151525/article/details/84708819