⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sms.h

📁 C++编写的一个模拟短信接受予删除短信
💻 H
字号:
#ifndef ADJUST_H
#define ADJUST_H
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <Windows.h>
#include <string>
using namespace std;


#define TRUE                       1
#define FALSE                    0
#define	OK						0

typedef	int	Status;
typedef	char LValueType[200] ;

//////////////////////////////////////////////////////////////////////////
//	前视定义
//////////////////////////////////////////////////////////////////////////

typedef	struct _LListNode	LListNode; //节点类型
typedef	struct _LList		LList; //线性表类型

typedef	LListNode*			Position; //节点位置类型
typedef	int					Rank; //节点秩类型

/////////////////////////////////////////////////////////
//	线性表类型定义(双向链表实现)
/////////////////////////////////////////////////////////
typedef	struct _LListNode	{
	LValueType		value; //数据域
	BOOL          Empty;//判空标志 
	Position			next; //后继指针
	Position			prev; //前驱指针
	LList*			list; //所属的线性表
}	LListNode; //线性表节点

typedef	struct _LList {
	int				id; //标识
	Position			header; //头结点哨兵
	Position			trailer; //尾节点哨兵
	int				length; //当前实际长度
}	LList; //线性表

/////////////////////////////////////////////////////////
//	线性表的双向链表实现
/////////////////////////////////////////////////////////

/*
*	构造一个空的线性表(用id标识)
************************************************************************/
LList*		ListInit(int	id)
{
	static		int sid = 0;
	LList*		L = (LList*)malloc(sizeof(LList));

	if (id > sid)	sid = id;
	else				id = sid++;

	L->header = (Position)malloc(sizeof(LListNode));
	L->trailer= (Position)malloc(sizeof(LListNode));
	L->header->prev	= NULL; //头结点哨兵
	L->header->next	= L->trailer;
	L->header->list	= L;
	L->trailer->next = NULL; //尾结点哨兵
	L->trailer->prev	= L->header;
	L->trailer->list	= L;

	L->length		= 0; //长度为0
	L->id			= id; 

#if defined(VERBOSE)
	printf("done\n");
#endif

	return(L);
}

/*
*	查询L的规模
************************************************************************/
int			ListLength(LList*	L)
{
	return L->length;
}
/*
*查询L是否为空
/********************************************************/
bool ListEmpty(LList* L)
{
	if(!L->length)return 0;
	else return 1;
}

/*
* 若L非空,则返回L首节点的位置;否则返回NULL
* O(1)
************************************************************************/
Position		ListFirst(
						  LList*		L)
{
	return(ListEmpty(L) ? NULL : L->header->next); //头元素的后继
}


/*
* 若L非空,则返回L末节点的位置;否则返回NULL
* O(1)
************************************************************************/
Position		ListLast(
						 LList*		L)
{
	return(ListEmpty(L) ? NULL : L->trailer->prev); //尾元素的前驱

}

/*
*	若v不是v->list的首节点,则返回其前驱的位置;否则返回NULL
************************************************************************/
Position		ListPrev(
						 Position	v)
{
	return (v->list->header == v->prev) ? NULL : v->prev; //直接返回v的前驱
}

/*
*	若v不是v->list的末节点,则返回其后继的位置;否则返回NULL
************************************************************************/
Position		ListNext(
						 Position	v)
{
	return (v->list->trailer == v->next) ? NULL : v->next; //直接返回v的后继
}
/*
* 取L[i]的位置
* i可能越界
************************************************************************/
Position		ListRank2Pos(
							 LList*		L,
							 Rank			i)
{
	if (0 > i || i >= ListLength(L))	return(NULL);//秩越界

	Position	p = ListFirst(L); //从首元素开始
	while (0 < i--) //沿着线性表,依次
		p = ListNext(p); //跳过i-1个元素

	return(p);
}

/*
*	标记节点的bool量Empty为真,L的长度减1
* 0 <= i < ListLength(list)
************************************************************************/
LList *	ListDelete(
				   LList*		L,
				   LValueType	e)
{
	Position	h = L->header->next;

	while ( h!= L->trailer && strcmp( h->value,e ) )

		h =   h->next;   //寻找与要删除的数据匹配的节点
	
	if (h==L->trailer)//如果没有找到要删除的数据,则退出
	{
		return L;
	}

	else h->Empty=TRUE;//如果匹配成功,则将节点的空标志置真
	
	L->length--;//线形表长度减一
	
	return L;
}


/*
*	销毁线性表L
************************************************************************/
Status		ListDestroy(LList*	L)
{
#if defined(VERBOSE)
	printf("Destroying List%d of size %d ...\n", L->id, L->length);
#endif
	Position	h = L->header;
	Position	t = h->next->next;

	while (!L->length) //逐一确定删除位置:紧接在h之后
	{
		//	删除h与t之间的p
		Position	p = h->next; //p指向待删除结点
		h->next = t;	t->prev = h; //摘除p
		free(p);	//并释放其占用的空间
		L->length --;
	}

	free(L->header);	free(L->trailer);
	free(L);		L = NULL;
	return(OK);
}


/*
*	在L中插入新的数据元素e
************************************************************************/
LList *	ListInsert(
				   LList*		L,
				   LValueType	e)
{
	Position	h = L->header->next;

	while (   h!=  L->trailer  &&  h->Empty==  FALSE  )//找到插入的节点位置
		
		h=h->next;

	if (h==L->trailer)//在链表中没有空的节点,则插新节点于线形表尾部之前 
	{
		Position  p = (Position) malloc(sizeof(LListNode)); //生成新结点

		p->list	=	L; //记录下所属的线性表

		strcpy(p->value	,	e); //赋值

		p->Empty=FALSE;//节点空标志为假

		h=h->prev;

		p->next	=L->trailer;

		p->prev	=	h;
		h->next	=	p;
		L->trailer->prev=p;
	}
	else //如果找到被标记为空的节点,则插新节点于该节点处
	{
		strcpy(h->value,e);	//赋值

		h->Empty=FALSE;//节点空标志为假

	}

	L->length ++;//线形表长度加1

	return L;

}


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -