Статический связанный список
\
структура
struct node{
T data;
int link;
};
Один элемент содержит данные, а другой элемент (ссылка) содержит расположение следующих данных.
Хранится в массиве для формирования статического связанного списка: node SL[MAXSIZE]
\
Контекст данных определяется не порядком массива, а ссылкой. Или:
Вывод связанного списка выводится не в порядке массива, а с указанной позиции (ссылки).
\
Стоит отметить, что существует два связанных списка:
Список данных: в этом списке хранятся полезные данные, головной узел SL [0];
Резервный связанный список: при вставке новых данных выделяется пространство этого связанного списка, и выделенное пространство преобразуется в часть связанного списка данных; головной узел находится в SL [MAXSIZE-1].
\
Как показано ниже:
\
\
\
\
\
\
\
\
\
\
\
\
\
\
Две программные реализации:
\
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;
}
\
\
\
Три бегущих результата:
\
\