/*
* list_2.cpp
*
* Created on: 2013年8月2日
* Author: 黄东东
* 为了能有章泽天这样的女朋友而不断努力。。。。。。
*/
#include <iostream>
using namespace std;
typedef int T;
class List {
struct Node {
T data;
Node* next;
Node(const T& d = T()) :
data(d), next(0) {
}
};
Node* head;
int len;
public:
List() :
head(NULL), len(0) {
}
~List() {
clear();
}
void insert(const T& d, int pos) {
Node*& pn = getptr(pos);
Node* p = new Node(d);
p->next = pn;
pn = p;
++len;
}
void push_front(const T& d) {
insert(d, 0);
}
List& push_back(const T& d) {
insert(d, size());
return *this;
}
void clear() {
Node* p;
while (head != NULL) {
p = head->next;
delete head;
head = p;
}
}
void erase(int pos) {
if (pos < 0 || pos >= size()) {
return;
}
Node*& pn = getptr(pos);
Node* p = pn;
pn = pn->next;
delete p;
--len;
}
void remove(const T& d) {
int pos;
while ((pos = find(d)) != -1) {
erase(pos);
}
}
void set( int pos,const T& d) {
if (pos < 0 || pos >= size()) {
return;
}
getptr(pos)->data = d;
}
Node*& getptr(int pos) {
if (pos < 0 || pos > size()) {
pos = 0;
}
if (pos == 0) {
return head;
}
Node* p = head;
for (int i = 1; i < pos; ++i) {
p = p->next;
}
return (*p).next;
}
int find(const T& d) {
Node* p = head;
int pos = 0;
while (p) {
if (p->data == d) {
return pos;
}
p = p->next;
pos++;
}
return -1;
}
int front() {
if (empty()) {
throw "空";
}
return head->data;
}
int back() {
if (empty()) {
throw "空";
}
Node* p = head;
while (p->next != NULL) {
p = p->next;
}
return (*p).data;
}
bool empty() {
return head == NULL;
}
int size() {
return len;
}
void travel() {
Node* p = head;
while (p != NULL) {
cout << p->data << ' ';
p = p->next;
}
cout<<endl;
}
};
int main(){
List l;
l.push_front(5);//5
l.push_front(8);//8 5
l.push_front(20);//20 8 5
l.insert(9, 2);//20 8 9 5
l.insert(6, 100);//6 20 8 9 5
l.insert(7, -10);//7 6 20 8 9 5
l.insert(1, 2);//7 6 1 20 8 9 5
//7 6 1 20 8 9 5 10 15
l.push_back(10).push_back(15).travel();
l.erase(0);//6 1 20 8 9 5 10 15
l.erase(l.size() - 1);//6 1 20 8 9 5 10
l.erase(2);//6 1 8 9 5 10
l.travel();
l.push_back(6);//6 1 8 9 5 10 6
l.insert(6,3);//6 1 8 6 9 5 10 6
l.travel();
l.remove(6);//1 8 9 5 10
l.travel();
l.set(0,666);//666 8 9 5 10
l.set(4,789);//666 8 9 5 789
l.set(l.find(9),123);//666 8 123 5 789
l.set(1,777);//666 777 123 5 789
l.travel();
cout<<l.front()<<"...."<<l.back()<<','<<l.size()<<endl;
while(!l.empty()){
l.erase(0);
}
cout<<"size: "<<l.size()<<endl;
}
链表的基本结构及常用算法
最新推荐文章于 2023-04-01 19:25:52 发布