对于某些高级程序设计语言,并没有指针,又想使用链表结构。用可以数组实现。称为,静态链表。
/*
node data cur
0 1----------s[0].cur指向可用的节点。
1 x 2----------链表头指针
2 x 3
3 x 4
4 x 5
5 x 6
6 x 7
7 x 8
8 x 9
9 x 0----------链表末尾
*/
#include <iostream>
using namespace std;
const int MAXSIZE=20;
typedef int DataType;
typedef struct
{
DataType data;
int cur;
}node,SLinkList[MAXSIZE];
void init_node(SLinkList S);
int find_previous_x(SLinkList S,int head,DataType x);
void insert_node(SLinkList S,int &head,DataType x,DataType y);//在x之前插入。
void delete_node(SLinkList S,int &head,DataType x);//删除为x的节点。
int malloc_node(SLinkList S);
void free_node(SLinkList S,int i);//实现释放i的内存。。
int main()
{
SLinkList S;
init_node(S);
int head=malloc_node(S);
int temp=head;
S[head].data=1;
for (int i=1;i<5;++i)
{
S[head].cur=malloc_node(S);
head=S[head].cur;
S[head].data=i+1;
}
S[head].cur=0;
head=temp;
//delete_node(S,head,4);
//delete_node(S,head,5);
delete_node(S,head,1);
//insert_node(S,head,4,8);
while(head)
{
cout<<S[head].data<<endl;
head=S[head].cur;
}
system("pause");
return 0;
}
void init_node(SLinkList S)
{
for (int i=0;i<MAXSIZE-1;++i)
{
S[i].cur=i+1;
}
S[MAXSIZE-1].cur=0;//尾节点指向0。
}
int find_previous_x(SLinkList S,int head,DataType x)
{
for (int i=head;i!=0;)
{
if (x==S[S[i].cur].data)//从head.cur开始寻找。
{
return i;
}
i=S[i].cur;//
}
}
void insert_node(SLinkList S,int &head,DataType x,DataType y)
{
int i=malloc_node(S);
S[i].data=y;
if (x==S[head].data)
{
S[i].cur=head;
head=i;
}
else
{
int index=find_previous_x(S,head,x);
S[i].cur=S[index].cur;
S[index].cur=i;
}
}
void delete_node(SLinkList S,int &head,DataType x)
{
int temp;
if (x==S[head].data)
{
temp=head;
head=S[head].cur;
}
else
{
int index=find_previous_x(S,head,x);
temp=S[index].cur;
S[index].cur=S[temp].cur;
}
free_node(S,temp);
}
int malloc_node(SLinkList S)
{
//只单纯实现malloc函数的功能。
int i=S[0].cur;
S[0].cur=S[i].cur;
return i;
}
void free_node(SLinkList S,int i)
{
//只用实现free的原来功能就行,只是删除节点,不管剩下的链表是否还连续。
S[i].cur=S[0].cur;
S[0].cur=i;
}
虽然就短短的100多行,确花了将近4个小时的时间,而且还不够完善,没有足够的测试,还有一些功能没有实现。待续吧。