📄 sms.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 + -