C++ 静态链表

来源:互联网 发布:五大联赛数据 编辑:程序博客网 时间:2024/05/29 19:19

C++与数据结构系列依然在继续~~~


今天研究了一下数据结构中的静态链表。

静态链表是给没有指针的语言设计的一种实现单链表的方法。

对于每一个结构体,有数据和游标,游标就相当于该数据的地址,那这样子就显得简单了,删除、插入操作思想与链表是一样的。其优点主要是在插入和删除上更方便,但是没有解决连续储存分配带来的表长难以确定的问题,失去了顺序存储结构随机存取的特性。



#include<iostream>#define OK 1#define ERROR 0#define MAXSIZE 20using namespace std;typedef int Status;typedef char ElemType;typedef struct{ElemType data;int cur;}Component,StaticLinkList[MAXSIZE];//打印元素Status visit(ElemType c)  {      cout<<c;      return OK;  } //初始化链表Status InitList(StaticLinkList space){int i;srand  ( time(0) );for(i=0;i<MAXSIZE-1;i++)   space[i].cur = i+1;  // space[i].data = rand()%100+1;  // cout<<"  "<<space[i].data;space[MAXSIZE-1].cur = 0;return OK ;}//将下表为k的空闲结点回收到备用链表void Free_SSL(StaticLinkList space,int k){space[k].cur = space[0].cur;space[0].cur = k;}//查找静态链表L中有多少个数据元素 int ListLength(StaticLinkList L){int j=0;int i=L[MAXSIZE-1].cur;while(i){i = L[i].cur;j++;}return j;}//自定义malloc函数int Malloc_SSL(StaticLinkList space){int i = space[0].cur;if(space[0].cur)space[0].cur = space[i].cur;return i;}//在L中第i个元素之前插入新的数据元素eStatus ListInsert(StaticLinkList L,int i,ElemType e){int j,k,l;k = MAXSIZE -1;if(i<1 || i>ListLength(L) + 1)return ERROR;j = Malloc_SSL(L);if(j){L[j].data = e;for(l = 1; l <= i-1; l++)k = L[k].cur;L[j].cur = L[k].cur;L[k].cur = j;cout<<"插入成功"<<endl;return OK;}return ERROR;}//将L中的第i个数据元素删除Status ListDelete(StaticLinkList L, int i){int j,k;k = MAXSIZE -1;if(i<1 || i>ListLength(L) + 1)return ERROR;k = MAXSIZE -1;for(j=1;j<=i-1;j++)k = L[k].cur;j = L[k].cur;L[k].cur = L[j].cur;Free_SSL(L,j);cout<<"删除成功"<<endl;return OK ;}Status ListTraverse(StaticLinkList L)  {      int j=0;      int i=L[MAXSIZE-1].cur;      while(i)      {              visit(L[i].data);              i=L[i].cur;              j++;      }      return j;      cout<<endl;      return OK;  } int main(){StaticLinkList L;      Status i;      i=InitList(L);       cout<<"初始化L后:L.length="<<ListLength(L)<<endl;       i=ListInsert(L,1,'F');      i=ListInsert(L,1,'E');      i=ListInsert(L,1,'D');      i=ListInsert(L,1,'B');      i=ListInsert(L,1,'A');       cout<<"插入后:L.length="<<ListLength(L)<<endl;     cout<<"在L的表头依次插入FEDBA后:L为"<<endl;       ListTraverse(L); i=ListInsert(L,3,'C');      cout<<"在L的“B”与“D”之间插入“C”后:L为"<<endl;       ListTraverse(L); i=ListDelete(L,1);      cout<<"在L的删除“A”后:L为"<<endl;      ListTraverse(L);         cout<<endl;        return 0; }




0 0
原创粉丝点击