表、栈、队列

1. 表 List

1.1 List ADT
struct Node;
typedef struct Node* PtrToNode;
typedef PtrToNode List;		// 通常用一个节点来代表一个空表
typedef PtrToNode Position;
typedef int ElementType;

List MakeEmpty( List L );
int IsEmpty( List L);
int IsLast(Position P, List L);
Position Find(ElementType X, List L);
void Delete(ElementType X, List L);
Position FindPrevious(ElementType X, List L);
void Insert(ElementType X, List L);
void DeleteList(List L);

struct Node
{
	ElementType Element;
	Position Next;
};

1.1.1 创建与测试空表
int IsEmpty( List L )
{
	return L->Next == NULL;
}

1.1.2 测试当前位置是否链表的末尾
int IsLast( Position P, List L )
{
	return P->Next == NULL;
}

1.1.3 查找
Position Find(ElementType X, List L)
{
	Position P;
	P = L->Next;
	while ( P!=NULL && P->Element!=X )
		P = P->Next;
	return P;
}

1.1.4 查找前驱节点
Position FindPrevous(ElementType X, List L)
{
	Position P;
	P = L;
	while ( P->Next!=NULL && P->Next->Element!=X )
		P = P->Next;
	return P;
}

1.1.5 删除元素
void Delete(ElementType X, List L) // 删除首次出现的节点,不存在则什么也不做
{
	Position P, TmpCell;
	P = FindPrevious(X, L);
	if( !IsLast(P, L) ) // 前驱是最后一个元素,说明没有找到
	{
		TmpCell = P->Next;
		P->Next = TmpCell->Next;
		free( P );
	}
}

1.1.6 插入
void Insert(ElementType X, List L, Position P) // 在P的后面插入
{
	Position TmpCell = malloc( sizeof(struct Node) );
	if(NULL == TmpCell) return;
	TmpCell->Element = X;
	TmpCell->Next = P->Next;
	P->Next = TmpCell;
}

1.1.7 删除链表
void DeleteList(List L)
{
	Position P, Tmp;
	P = L->Next;
	L->Next = NULL;
	while (P)
	{
		Tmp = P->Next;
		free(P);
		P = Tmp;
	}
}

2. 堆栈

数据对象集: 一个有0个或多个元素的有穷线性表, 具有LIFO性质

操作集
Stack CreateStack(int MaxSize);//生成空堆栈,其最大长度为MaxSize
int IsFull(Stack S, int MaxSize); // 判断堆栈S是否已满
void Push(Stack S, ElementType item); // 将元素Item压入堆栈
int IsEmpty(Stack S); // 判断堆栈S是否为空
ElementType Pop(Stack S); // 删除并返回栈顶元素

2.1 栈的顺序存储实现
通常由一个一维数组和一个记录栈顶元素位置的变量组成
typedef struct SNode* Stack;
struct SNode
{
	ElementType Data[MaxSize];
	int top;
}

2.1.1 入栈
void Push( Stack S, ElementType item )
{
	if( S->Top == MaxSize-1 ){
		Error("Full");
	}
	else{
		S->Data[++(S->Top)] = item;
	}
}

2.1.2 出栈
ElementType Pop( Stack S )
{
	if( S->Top == -1 ){
		return ERROR;
	}else{
		return (S->Data[(S->Top)--]);
	}
}

2.2 堆栈的链式存储实现
栈的链式存储结构实际上就是一个单链表,叫做链栈。插入和删除操作只能在链栈的栈顶进行,栈顶在表头一侧。
typedef struct SNode* Stack;
struct SNode{
	ElementType Data;
	strtuct SNode* Next;
}

2.2.1 创建
Stack CreateStack()
{
	Stack S;
	S = (Stack)malloc(sizeof(struct SNode));
	S->Next = NULL;
	return S;
}
2.2.2 判空
int IsEmpty( Stack S )
{
	return ( S->Next == NULL );
}
2.2.3 Push
void Push( ElementType item, Stack )
{
	struct SNode* TmpCell;
	TmpCell = (struct SNode*)malloc( sizeof(struct SNode) );
	TmpCell->Next = S->Next;
	TmpCell->Next = S->Next;
	S->Next = TmpCell;
}
2.2.4 Pop
ElementType Pop(Stack S)
{
	struct SNode* FirstCell;
	ElementType TopElem;
	if ( IsEmpty( S ) ){
		return ERROR;
	}else{
		FirstCell = S->Next;
		S->Next = FirstCell->Next;
		TopElem = FirstCell->Element;
		free(FirstCell);
		return TopElem;
	}
}

3. 队列 Queue

只能在一端插入另一端删除,具有FIFO性质。
数据对象集: 一个有0个或多个元素的有穷线性表

ADT
Queue CreateQueue( int MaxSize ); // 生成长度为MaxSize的空队列
int IsFull( Queue Q, int MaxSize ); // Q是否已满
void AddQ( Queue Q, ElementType item ); // 将元素item插入队列Q中
int IsEmptyQ( Queue Q ); // 队列是否为空
ElementType DeleteQ( Queue Q ); // 将队头元素从队列中删除并返回

3.1 队列的顺序存储实现
struct QNode{
	ElementType Data[MaxSize];
	int rear;	// 队为
	int front; // 队头
}
typedef struct QNode* Queue;

逻辑上实现循环队列的操作
int IsFull( Queue Q, int MaxSize )
{// 加1取余, 循环利用空间
	return ( (Q->rear+1) % MaxSize == Q->front );
}

void AddQ( Queue Q, ElementType item)
{
	if ( IsFull(Q) ) return;
	Q->rerar = (Q->rear+1) % MaxSize;
	Q->Data[Q->rear] = item;
}

int IsEmptyQ( Queue Q )
{
	return ( Q->front == Q->rear );
}
ElementType DeleteQ( Queue Q )
{
	if ( IsEmpty() ) return ERROR;
	Q->front = (Q->front+1) % MaxSize;
	return Q->Data[Q->front];
}


3.2 队列的链式存储实现
队列的链式存储结构也可以用一个单链表实现。插入和删除操作分别在链表两头进行。队头在表头,队尾在表尾。
struct Node{
	ElementType Data;
	struct Node* Next;
}
typedef struct Node* Position;
struct QNode{ /*队列结构*/
	Position rear; /*指向队尾节点*/
	Position front;/*指向队头节点*/
	int MaxSize; /*队的最大容量*/
};
typedef struct QNode* Queue;

// 判空
int IsEmpty( Queue Q )
{
	return ( Q->front == NULL );
}
// 出队
ElementType DeleteQ( Queue Q )
{
	Position FrontCell;
	ElementType FrontElem;
	if ( IsEmpty( Q ) )
		return ERROR;
	FrontCell = Q->front;
	if( Q->front == Q->rear ) /*若队列只有一个元素*/
		Q->front = Q->rear = NULL; /*删除队列后为空*/
	else
		Q->front = Q->front->Next;
	FrontElem = FrontCell->Data;

	free( FrontCell );
	return;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值