单链表简单实现
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<unordered_map>
using namespace std;
void pause() {
getchar(), getchar();
}
struct Node {
int data;
Node *next;
Node(int p) :data(p),next(nullptr) {}
Node() :data(0),next(nullptr) {}
};
struct List {
Node *first;
int size;
List():first(NULL),size(0) {}
void insert(int);
void insert_back(int);
bool empty();
int length();
int remove_index(int index);
int remove_data(int);
~List() {
Node* p = first;
while (p) {
Node*q = p->next;
delete p;
p = q;
}
}
};
void List::insert(int value) {
Node *node = new Node(value);
if (first != NULL) {
node->next = first, first = node;
}
else {
first = node;
}
++size;
}
void List::insert_back(int val) {
Node * node = new Node(val);
Node *p = first;
if (p ) {
while (p->next) p = p->next;
p->next = node;
}
else {
first = node;
}
++size;
}
bool List::empty() {
return size == 0;
}
int List::length() {
return size;
}
int List::remove_index(int index) {
if (index < 0 || index >= size || first==NULL) return false;
if (index == 0) {
Node *ne = first;
first = first->next;
delete ne;
}
else {
int k = 0;
for (Node* p = first; p ; p = p->next,++k) {
if (k == index-1) {
Node *ne = p->next;
if (ne) {
p->next = ne->next;
}
delete ne;
return 1;
}
}
}
--size;
}
int List::remove_data(int data) {
if (first == NULL) return 0;
Node node(-1);
node.next = first;
Node *p = &node;
while (p && p->next) {
if(p && p->next &&p->next->data == data) {
Node * ne = p->next->next;
delete p->next;
if(ne) p->next = ne;
else p->next = NULL;
--size;
}
if(p)p = p->next;
}
return 1;
}
int main(void) {
List list;
for (int i = 1; i < 8; ++i) list.insert_back(i);
list.remove_data(7);
list.insert(3);
list.remove_data(999);
cout << list.length() << endl;
Node *x = list.first;
while (x) {
cout << x->data << " ";
x = x->next;
}
pause();
return 0;
}