#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define error -1
#define OK 1
using namespace std;
typedef int DataType;
class LinkList {
public:
LinkList() {
pHead = new ListLinkNode;
pHead->data = -1;
pHead->next = NULL;
len = 0;
}
~LinkList() {
while (pHead->next != NULL) {
pTemp = pHead->next;
delete pHead;
pHead = pTemp;
}
delete pHead;
pHead = NULL;
len = 0;
}
int create(int n) {
if (n <= 0) return error;
len = n;
pTemp = pHead;
while (n--) {
pNew = new ListLinkNode;
pNew->next = NULL;
cin >> pNew->data;
pTemp->next = pNew;
pTemp = pNew;
}
pTemp = pNew = NULL;
return OK;
}
DataType operator [] (int pos) {
if (pos >= len) return error;
DataType Target;
pTemp = pHead->next;
Target = pTemp->data;
while (pos--) {
pTemp = pTemp->next;
Target = pTemp->data;
}
pTemp = NULL;
return Target;
}
int display() {
if (pHead->next == NULL) return error;
pTemp = pHead->next;
while (pTemp != NULL) {
cout << pTemp->data << "->";
pTemp = pTemp->next;
}
cout << "NULL" << endl;
pTemp = NULL;
return OK;
}
void clear() {
while (pHead->next != NULL) {
pTemp = pHead->next;
delete pHead;
pHead = pTemp;
}
pHead->next = NULL;
len = 0;
}
int insert(int pos, const DataType x) {
pTemp = pHead;
while (pTemp->next != NULL && pos != 0) { pTemp = pTemp->next; pos--; }
if (pos != 0) { pTemp = NULL; return error; }
pNew = new ListLinkNode;
pNew->data = x;
pNew->next = pTemp->next;
pTemp->next = pNew;
pTemp = pNew = NULL;
len++;
return OK;
}
int erase(int pos) {
if (pHead->next == NULL) return error;
pTemp = pHead;
while (pTemp->next != NULL && pos != 0) { pTemp = pTemp->next; pos--; }
if (pTemp->next == NULL || pos != 0) { pTemp = NULL; return error; }
pNew = pTemp->next->next;
delete pTemp->next;
pTemp->next = pNew;
pTemp = pNew = NULL;
len--;
return OK;
}
int erase(int pos1, int pos2) {
if (pHead->next == NULL) return error;
pTemp = pHead;
len -= pos2 - pos1 + 1;
while (pTemp->next != NULL && pos1 != 0) { pTemp = pTemp->next; pos1--; }
if (pTemp->next == NULL || pos1 != 0) { pTemp = NULL; return error; }
pNew = pHead->next;
while (pNew->next != NULL && pos2 != 0) { pNew = pNew->next; pos2--; }
if (pos2 != 0) { pNew = NULL; return error; }
pTr1 = pTemp->next;
pTemp->next = pNew->next;
while (pTr1 != pNew) {
pTr2 = pTr1->next;
delete pTr1;
pTr1 = pTr2;
}
pTemp = pNew = pTr1 = pTr2 = NULL;
return OK;
}
int size() {
return len;
}
bool empty() {
return len == 0 ? 1 : 0;
}
private:
struct ListLinkNode {
DataType data;
ListLinkNode* next;
}*pHead = NULL, *pTemp = NULL, *pNew = NULL, *pTr1 = NULL, *pTr2 = NULL;
int len;
};
int main(int argc, char** argv) {
LinkList L;
for (int i = 0; i < 5; i++)
L.insert(i, i);
L.display();
for (int i = 0; i < 5; i++)
cout << L[i] << ' ';
cout << endl;
L.erase(0, 1);
for (int i = 0; i < 4; i++)
cout << L[i] << ' ';
cout << endl;
L.clear();
cout << L.display() << endl;
return 0;
}