顺序存储
#include<iostream>
using namespace std;
#define MaxSize 50
template<typename ElemType>
struct sqList{
ElemType data[MaxSize];
int length;
};
#ifdef DEBUG
#define InitSize 100
template<typename ElemType>
struct seqList {
ElemType* data;
int MaxSize;
int length;
};
#endif
template<typename ElemType>
bool ListInsert(sqList<ElemType>& L, int i, ElemType e) {
if (i<1 || i>L.length + 1)
return false;
if (L.length >= MaxSize)
return false;
for (int j = L.length; j >= i; --j) {
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
++L.length;
return true;
}
template<typename ElemType>
bool ListDelete(sqList<ElemType>& L, int i, ElemType& e) {
if (i<1 || i>L.length)
return false;
e = L.data[i - 1];
for (int j = i ; j < L.length; ++j) {
L.data[j - 1] = L.data[j];
}
--L.length;
return true;
}
template<typename ElemType>
int LocalElem(sqList<ElemType>& l, ElemType& e) {
int i;
for (i = 0; i < l.length; ++i) {
if (l.data[i] == e)
return i + 1;
}
return 0;
}
链式存储
#include<iostream>
using namespace std;
template<typename ElemType>
struct LNode {
ElemType data;
struct LNode *next;
};
template<typename ElemType>
LNode<ElemType>* List_HeadInsert(LNode<ElemType>* L) {
LNode<ElemType>* s; ElemType x;
L = new LNode<ElemType>;
L->next = nullptr;
cin >> x;
while (x != 9999) {
s = new LNode<ElemType>;
s->data = x;
s->next = L->next;
L->next = s;
cin >> x;
}
return L;
}
template<typename ElemType>
LNode<ElemType>* List_TailInsert(LNode<ElemType>* L) {
ElemType x;
L = new LNode<ElemType>;
LNode<ElemType>* s, * r = L;
cin >> x;
while (x != 9999) {
s = new LNode<ElemType>;
s->data = x;
r->next = s;
r = s;
cin >> x;
}
r->next = nullptr;
return L;
}
template<typename ElemType>
LNode<ElemType>* GetElem(LNode<ElemType>*L, int i) {
if (i < 1)
return nullptr;
int j = 1;
LNode<ElemType>* p = L->next;
while (p != nullptr && j < i) {
p = p->next;
++j;
}
return p;
}
template<class ElemType>
LNode<ElemType>* LocateElem(LNode<ElemType>* L, ElemType e) {
LNode<ElemType>* p = L;
while (p!=nullptr&&p->data!=e){
p = p->next;
}
return p;
}
template<class ElemType>
bool Front_Insert(LNode<ElemType>* L, int i, ElemType e) {
LNode<ElemType>* temp = GetElem(L, i - 1);
if (temp == nullptr)
return false;
LNode<ElemType>* newNode = new LNode<ElemType>;
newNode->data = e;
newNode->next = temp->next;
temp->next = newNode;
return true;
}
template<class ElemType>
bool Delete(LNode<ElemType>* L, int i) {
LNode<ElemType>* temp = GetElem(L, i - 1);
if (temp == nullptr)
return false;
LNode<ElemType>* next = temp->next;
temp->next = temp->next->next;
delete next;
return true;
}
template<class ElemType>
int GetLinkLength(LNode<ElemType>* L) {
int cnt = 0;
LNode<ElemType>* cur = L->next;
while (cur){
++cnt;
cur = cur->next;
}
return cnt;
}