一  静态链表

 

结构体

 

struct node{
		T data;
		int link;
	};

一个成员存放数据,另一个成员(link)存放下一个数据的位置。

 

存于数组中,构成静态链表:node SL[MAXSIZE]

 

数据前后关系不是以数组顺序决定,由link决定。或者说:

链表输出不是以数组顺序输出,而是由指定位置(link)输出。

 

值得注意的是,存在着两个链表:

数据链表:该链表存放有用的数据,头节点在SL【0】;

备用链表:插入新数据时分配此链表的空间,分配的空间转换成数据链表的一部分;头节点在SL【MAXSIZE-1】。

 

如下图所示:

 

 

静态链表——用顺序存储实现链式存储功能_链表

 

 

静态链表——用顺序存储实现链式存储功能_静态链表_02

 

 

 

 

静态链表——用顺序存储实现链式存储功能_静态链表_03

 

 

 

二 程序实现:

 

1 建立一个SList.h文件:

 

 

#ifndef SLIST_H
#define SLIST_H
const int MAXSIZE=10;
template <typename T>
class SList{
	struct node{
		T data;
		int link;
	};
private:
	node SL[MAXSIZE];
	int New(){
		int i=SL[MAXSIZE-1].link;
		if(i)
			SL[MAXSIZE-1].link=SL[i].link;
		return i;
	}
	void Delete(int k){
		SL[k].link=SL[MAXSIZE-1].link;
		SL[MAXSIZE-1].link=k;
	}
public:
	SList(){
		int i;
		SL[0].link=0;
		SL[MAXSIZE-1].link=1;
		for(i=1;i<MAXSIZE-2;i++)
			SL[i].link=i+1;
		SL[MAXSIZE-2].link=0;
		
	}
	void ClearList(){
		int j,i=SL[MAXSIZE-1].link;
		while(i){
			j=i;
			i=SL[i].link;
		}
		SL[j].link=SL[0].link;
		SL[0].link=0;
	}
	bool ListEmpty(){
		return SL[0].link==0;
	}
	int ListLen()const{
		int count=0,i=SL[0].link;
		while(i){
			i=SL[i].link;
			count++;
		}
		return count;
	}
	
	
	bool PriorElem(T e, bool(*eq)(T, T), T &pre_e)const
	{

		int j, i=SL[0].link;
		do
		{
			j=i;
			i=SL[i].link;
		}while(i && !eq(SL[i].data, e));
		if(i)
		{
			pre_e=SL[j].data;
			return true;
		}
		return false;
	}
	bool NextElem(T e, bool(*eq)(T, T), T &next_e)const
	{

		int i=SL[0].link;
		while(i)
		{
			if(eq(SL[i].data, e) && SL[i].link)
			{
				next_e=SL[SL[i].link].data;
				return true;
			}
			i=SL[i].link;
		}
		return false;
	}

	bool InsertElem(int i,T e){
		int m,k=0;
		for(m=1;m<i;m++){
			k=SL[k].link;
			if(k==0)
				break;

		}
		if(m<i) return false;
		else{
			m=New();
			if(m){
				SL[m].data=e;
				SL[m].link=SL[k].link;
				SL[k].link=m;
				return true;
			}
			return false;
		}
	}
	bool DeleteElem(int i,T &e){
		int m,k=0;
		for(m=1;m<i;m++){
			k=SL[k].link;
			if(k==0) break;
		}
		if(m<i||SL[k].link==0) return false;
		else{
			m=SL[k].link;
			SL[k].link=SL[m].link;
			e=SL[m].data;
			Delete(m);
			return true;
		}
	}
	void ListPrint(void(*visit)(T*)){
		int i=SL[0].link;
		while(i){
			visit(&SL[i].data);
			i=SL[i].link;
		}
		cout<<endl;
	}
};
#endif


 

2 测试SList类:

 

 

#include <iostream>
#include<string>
using namespace std;
typedef string T;
bool equal(string c1, string c2)
{
	return c1==c2;
}
void print(T* c)
{
	cout<<*c<<" ";
}
#include "SList.h"
int main()
{
	SList<T> L;
	T e, e0="kobe";
	bool i;
	int j, k;
	T s;
	cout<<"请输入你心中最好的6名球星:"<<endl;
	for(j=1; j<=6; j++){
		cin>>s;
		i=L.InsertElem(j, s);
	}
	cout<<endl;
	cout<<"你的榜单L=";
	L.ListPrint(print);
	cout<<"L是否空?"<<boolalpha<<L.ListEmpty()<<",L长=";
	cout<<L.ListLen()<<endl;
	
	i=L.PriorElem(e0, equal, e);
	if(i)
		cout<<"球星"<<e0<<"的前一名为"<<e<<endl;
	
	i=L.NextElem(e0, equal, e);
	if(i)
		cout<<"球星"<<e0<<"的后一名为"<<e<<endl;
	
	k=L.ListLen();
	for(j=k+1; j>=k; j--)
	{
		i=L.DeleteElem(j, e);
		if(i)
			cout<<"删除第"<<j<<"个球星成功,他是"<<e<<endl;
		else
			cout<<"删除第"<<j<<"个球星失败(榜单不存在此球星),";
	}
	cout<<"依次输出L的球星:";
	L.ListPrint(print);
	L.ClearList();
	cout<<"清空L后,L=";
	L.ListPrint(print);
	cout<<"L是否空?"<<boolalpha<<L.ListEmpty()<<",L长=";
	cout<<L.ListLen()<<endl;

	return 0;
}


 

 

 

三 运行结果:

 

静态链表——用顺序存储实现链式存储功能_数据结构与算法_04