静态链表。实现。

 对于某些高级程序设计语言,并没有指针,又想使用链表结构。用可以数组实现。称为,静态链表。
 
/*
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个小时的时间,而且还不够完善,没有足够的测试,还有一些功能没有实现。待续吧。
阅读更多
个人分类: 数据结构
想对作者说点什么? 我来说一句

数据结构 静态链表实现

2010年10月17日 2KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭