静态链表的所有基本操作
来源:互联网 发布:vb api 编辑:程序博客网 时间:2024/05/20 23:32
头文件:SLinkList.h
using namespace std;
#define MAXSIZE 1000
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
typedef int ElemType;
typedef int Status;
typedef struct
{
ElemType data;
int next;
}component,SLinkList[MAXSIZE];
void InitSpace_SL(SLinkList& space)
{
for (int i = 0; i < MAXSIZE - 1; ++i)
space[i].next = i + 1;
space[MAXSIZE - 1].next = 0;
}
int Malloc_SL(SLinkList& space)
{
int i = space[0].next;
if (space[0].next)
{
space[0].next = space[i].next;
return i;
}
else
return 0;
}
void Free_SL(SLinkList& space, int k)
{
space[k].next = space[0].next;
space[0].next = k;
}
Status InitList_SL(SLinkList& S)
{
InitSpace_SL(S);
int L = Malloc_SL(S);
S[L].next = 0;
return OK;
}
Status DestroyList_SL(SLinkList& S)
{
S[0].next=0;
return OK;
}
Status ClearList_SL(SLinkList& S)
{
int j,k = S[1].next;
while (k)
{
j = S[k].next;
Free_SL(S, k);
k = j;
}
S[1].next = 0;
return OK;
}
Status ListEmpty_SL(SLinkList S)
{
if (S[1].next)
return FALSE;
else
return TRUE;
}
int ListLength_SL(SLinkList S)
{
int k = 1,length=0;
while (S[k].next)
{
++length;
k = S[k].next;
}
return length;
}
Status GetElem_SL(SLinkList S, int i, ElemType &e)
{
if ((i<1) || (i>ListLength_SL(S)))
return ERROR;
int k = 1;
for (int j = 0; (S[k].next )&& (j < i); ++j)
k = S[k].next;
e = S[k].data;
return OK;
}
int LocateElem_SL(SLinkList S, ElemType e)
{
int i = S[1].next,position=1;
while (i&&S[i].data != e)
{
++position;
i = S[i].next;
}
if (S[i].data == e)
return position;
else
return 0;
}
Status PriorElem_SL(SLinkList S, ElemType cur_e, ElemType& pre_e)
{
int i = S[1].next;
while (i&&S[i].next)
{
int j = S[i].next;
if (S[j].data == cur_e)
{
pre_e = S[i].data;
return OK;
}
i = j;
}
return INFEASIBLE;
}
Status NextElem_SL(SLinkList S, ElemType cur_e, ElemType& next_e)
{
int i = LocateElem_SL(S, cur_e);
if (i)
{
int j = S[i].next;
if (j)
{
next_e = S[j].data;
return OK;
}
}
return INFEASIBLE;
}
Status ListInsert_SL(SLinkList& S, int i, ElemType e)
{
if (i < 1 || i>ListLength_SL(S) + 1)
return ERROR;
int j = Malloc_SL(S), p = 1,num=1;
S[j].data=e;
while (p && num < i)
{
p = S[p].next;
num++;
}
if (!p || num>i)
return ERROR;
S[j].next = S[p].next;
S[p].next = j;
return OK;
}
Status ListDelete_SL(SLinkList& S, int i,ElemType& e)
{
if (i<1 || i>ListLength_SL(S))
return ERROR;
int num=0,p =1,q=S[1].next;
while (q)
{
num++;
if (num == i)
{
S[p].next = S[q].next;
Free_SL(S, q);
return OK;
}
p = q;
q = S[q].next;
}
return ERROR;
}
Status visit(ElemType i)
{
if (cout << i<<" ")
return OK;
else
return ERROR;
}
//依次对静态链表L的每个数据元素调用visit().一旦调用失败,则操作失败
Status ListTraverse_SL(SLinkList S, Status(*visit)(ElemType))
{
int p = S[1].next;
while (p)
{
if (!visit(S[p].data))
return ERROR;
p = S[p].next;
}
return OK;
}
主函数:
#include"SLinkList.h"
void main(void)
{
SLinkList S;
InitList_SL(S);
for (int i = 1, j = 1; i < 20; ++j, i += 2)
ListInsert_SL(S, j, i);
cout << "静态链表S的信息为:" << endl;
cout << "*******************************************" << endl;
cout << "长度为:" << ListLength_SL(S) << endl;
cout << "数据元素分别为:";
ListTraverse_SL(S, visit);
cout << endl;
cout << "*******************************************" << endl;
ElemType e;
GetElem_SL(S, 6, e);
cout << "第6个数据是:" << e << endl;
ElemType pre;
if (PriorElem_SL(S, e, pre) != INFEASIBLE)
cout << e << "前面的数据是:" << pre << endl;
else
cout << "数据元素" << e << "没有前驱!" << endl;
ElemType next;
if (NextElem_SL(S, e, next) != INFEASIBLE)
cout << e << "后面的数据是:" << next << endl;
else
cout << "数据元素" << e << "没有后继!" << endl;
cout << "删除数据" << e << endl;
if (ListDelete_SL(S, 6, e))
{
cout << "删除数据成功!" << endl;
cout << "更新后的数据是:" << endl;
cout << "*******************************************" << endl;
cout << "长度为:" << ListLength_SL(S) << endl;
cout << "数据元素分别为:";
ListTraverse_SL(S, visit);
cout << endl;
cout << "*******************************************" << endl;
}
else
cout << "删除失败!" << endl;
cout << "值为7的数据元素的位置在:";
if (LocateElem_SL(S, 7))
cout << "第" << LocateElem_SL(S, 7) << endl;
else
cout << "静态链表中没有此数据元素"<<endl;
cout << "静态链表S是否为空表:";
if (ListEmpty_SL(S))
cout << "是" << endl;
else
cout << "否" << endl;
cout << "现将静态链表S置为空表:" << endl;
ClearList_SL(S);
cout << "静态链表S是否为空表:";
if (ListEmpty_SL(S))
cout << "是" << endl;
else
cout << "否" << endl;
cout << "将静态链表S销毁!" << endl;
DestroyList_SL(S);
}
- 静态链表的所有基本操作
- 静态链表的基本操作
- 静态链表的基本操作实现
- 静态链表的基本操作实现
- 静态链表的创建以及基本操作
- c语言实现静态链表的基本操作
- 静态链表的基本操作及其应用(实验2.3)
- 静态链表的基本操作及其应用(实验2.3)
- 静态顺序表的基本操作
- 静态顺序表的基本操作
- 静态顺序表的基本操作
- 静态单链表的基本操作
- 严蔚敏数据结构顺序表的所有基本操作
- 实现基于静态数组的顺序表的基本操作
- 顺序表的基本操作——静态实现
- 数据结构 - C语言版 - 双向链表 所有基本操作
- 2007.08.24静态单链表的基本操作及顺序表和链表的比较
- 二叉树的所有基本操作
- Android版添加phonegap--文件下载插件教程
- PostgreSQL学习手册(数据库维护)
- Jenkins and Docker Next Generation Continuous Delivery
- Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用
- tomcat+redis实现session共享
- 静态链表的所有基本操作
- PostgreSQL学习手册(系统表)
- ABAP之程序相互调用--SUBMIT
- block访问外部变量
- Android获得文件的mimeType
- VirtualBox Centos 网络设置
- English summary in December
- VC++直接操作使用C#类库基本操作
- listview的优化