5勉强能用了,泪目
This commit is contained in:
parent
3783c65a76
commit
8ccaf99287
4 changed files with 442 additions and 0 deletions
24
ex5/ex5.cpp
Normal file
24
ex5/ex5.cpp
Normal file
|
@ -0,0 +1,24 @@
|
|||
#include "vec.cpp"
|
||||
#include "list.cpp"
|
||||
#include <time.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
srand(time(NULL));
|
||||
Vec v(54,2);
|
||||
v.printall();
|
||||
|
||||
List l;
|
||||
|
||||
printf("¿ªÊ¼½¨Á¢Á´±í\n");
|
||||
|
||||
for(int i=0;i<=53;i++)
|
||||
{
|
||||
l.firstInsert(v.get(i));
|
||||
printf("%d\n",l[0]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
106
ex5/list.cpp
Normal file
106
ex5/list.cpp
Normal file
|
@ -0,0 +1,106 @@
|
|||
#include "list.h"
|
||||
|
||||
List::List()
|
||||
{
|
||||
_size = 0;
|
||||
|
||||
header->data = 0;
|
||||
header->succ = trailer;
|
||||
header->pred = NULL;
|
||||
|
||||
trailer->succ = NULL;
|
||||
trailer->pred = header;
|
||||
}
|
||||
|
||||
Node List::predInsert(Node Old, int New)
|
||||
{
|
||||
Node T = new node;
|
||||
T->data = New;
|
||||
T->succ = Old;
|
||||
T->pred = Old->pred;
|
||||
Old->pred = T;
|
||||
_size++;
|
||||
return T;
|
||||
}
|
||||
Node List::succInsert(Node Old, int New)
|
||||
{
|
||||
Node T = new node;
|
||||
T->data = New;
|
||||
T->pred = Old;
|
||||
T->succ = Old->succ;
|
||||
Old->succ = T;
|
||||
_size++;
|
||||
return T;
|
||||
}
|
||||
void List::firstInsert(int New)
|
||||
{
|
||||
Node T = new node;
|
||||
T->data = New;
|
||||
T->pred = header;
|
||||
T->succ = header->succ;
|
||||
header->succ = T;
|
||||
_size++;
|
||||
}
|
||||
void List::lastInsert(int New)
|
||||
{
|
||||
Node T = new node;
|
||||
T->data = New;
|
||||
T->succ = trailer;
|
||||
T->pred = trailer->pred;
|
||||
trailer->pred = T;
|
||||
_size++;
|
||||
}
|
||||
Node List::predInsertN(Node Old, Node New)
|
||||
{
|
||||
Node T = new node;
|
||||
T = New;
|
||||
T->succ = Old;
|
||||
T->pred = Old->pred;
|
||||
Old->pred = T;
|
||||
_size++;
|
||||
return T;
|
||||
}
|
||||
Node List::succInsertN(Node Old, Node New)
|
||||
{
|
||||
Node T = new node;
|
||||
T = New;
|
||||
T->pred = Old;
|
||||
T->succ = Old->succ;
|
||||
Old->succ = T;
|
||||
_size++;
|
||||
return T;
|
||||
}
|
||||
|
||||
Node List::firstInsertN(Node New)
|
||||
{
|
||||
Node T = new node;
|
||||
T = New;
|
||||
T->pred = header;
|
||||
T->succ = header->succ;
|
||||
header->succ = T;
|
||||
_size++;
|
||||
return T;
|
||||
}
|
||||
Node List::lastInsertN(Node New)
|
||||
{
|
||||
Node T = new node;
|
||||
T = New;
|
||||
T->succ = trailer;
|
||||
T->pred = trailer->pred;
|
||||
trailer->pred = T;
|
||||
_size++;
|
||||
return T;
|
||||
}
|
||||
Node List::find(int i)
|
||||
{
|
||||
Node ans = first();
|
||||
for (int i = 0; i < _size; i++)
|
||||
{
|
||||
ans = ans->succ;
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
int List::get(int i)
|
||||
{
|
||||
return find(i)->data;
|
||||
}
|
72
ex5/list.h
Normal file
72
ex5/list.h
Normal file
|
@ -0,0 +1,72 @@
|
|||
#include <iostream>
|
||||
#include <string>
|
||||
#define Node node *
|
||||
|
||||
typedef struct node
|
||||
{
|
||||
int data;
|
||||
Node pred;
|
||||
Node succ;
|
||||
} node;
|
||||
|
||||
class List
|
||||
{
|
||||
private:
|
||||
Node header = new node;
|
||||
Node trailer = new node;
|
||||
int _size;
|
||||
|
||||
protected:
|
||||
int clear();
|
||||
|
||||
public:
|
||||
List();
|
||||
Node first() { return header->succ; }
|
||||
Node last() { return trailer->pred; }
|
||||
void firstInsert(int New);
|
||||
void lastInsert(int New);
|
||||
Node succInsert(Node Old, int New);
|
||||
Node predInsert(Node Old, int New);
|
||||
Node firstInsertN(Node New);
|
||||
Node lastInsertN(Node New);
|
||||
Node succInsertN(Node old, Node ne);
|
||||
Node predInsertN(Node old, Node ne);
|
||||
int get(int i);
|
||||
Node find(int i);
|
||||
|
||||
int operator[](int i)
|
||||
{
|
||||
Node p = first();
|
||||
while (0 < i--)
|
||||
p = p->succ;
|
||||
return p->data;
|
||||
}
|
||||
};
|
||||
|
||||
class PUKE
|
||||
{
|
||||
private:
|
||||
std::string PU[54] = {
|
||||
"1A", "1B", "1C", "1D",
|
||||
"2A", "2B", "2C", "2D",
|
||||
"3A", "3B", "3C", "3D",
|
||||
"4A", "4B", "4C", "4D",
|
||||
"5A", "5B", "5C", "5D",
|
||||
"6A", "6B", "6C", "6D",
|
||||
"7A", "7B", "7C", "7D",
|
||||
"8A", "8B", "8C", "8D",
|
||||
"9A", "9B", "9C", "9D",
|
||||
"10A", "10B", "10C", "10D",
|
||||
"JA", "JB", "JC", "JD",
|
||||
"QA", "QB", "QC", "QD",
|
||||
"KA", "KB"
|
||||
"KC",
|
||||
"KD",
|
||||
"BlackJoker", "RadJoker"};
|
||||
|
||||
public:
|
||||
std::string p(int a)
|
||||
{
|
||||
return PU[a];
|
||||
}
|
||||
};
|
240
ex5/vec.cpp
Normal file
240
ex5/vec.cpp
Normal file
|
@ -0,0 +1,240 @@
|
|||
#include "vec.h"
|
||||
|
||||
Vec::Vec(int len, int mode)
|
||||
{
|
||||
_used = len - 1;
|
||||
_len = len * 2;
|
||||
_v = new int[_len];
|
||||
|
||||
// for (int i = 0; i <= _used; i++)
|
||||
// _v[i] = i + 1;
|
||||
if (mode == 1)
|
||||
{
|
||||
for (int i = 0; i <= _used; i++)
|
||||
_v[i] = rand() % (2 * (_used + 1));
|
||||
|
||||
for (int i = 0; i <= _used; i++)
|
||||
swap(i, rand() % (2 * (_used + 1)));
|
||||
}
|
||||
else if (mode == 2)
|
||||
{
|
||||
for (int i = 0; i <= _used; i++)
|
||||
_v[i] = _used - i;
|
||||
for (int i = 0; i <= _used; i++)
|
||||
swap(i, rand() % ((_used + 1)));
|
||||
}
|
||||
}
|
||||
|
||||
int Vec::get(int a)
|
||||
{
|
||||
return _v[a];
|
||||
}
|
||||
|
||||
void Vec::put(int a, int value)
|
||||
{
|
||||
_v[a] = value;
|
||||
}
|
||||
|
||||
void Vec::swap(int a, int b)
|
||||
{
|
||||
int temp = _v[a];
|
||||
_v[a] = _v[b];
|
||||
_v[b] = temp;
|
||||
}
|
||||
|
||||
void Vec::expand()
|
||||
{
|
||||
_len = _len * 2;
|
||||
int *p = new int[_len];
|
||||
|
||||
for (int i = 0; i <= _used; i++)
|
||||
p[i] = _v[i];
|
||||
|
||||
delete[] _v;
|
||||
_v = p;
|
||||
}
|
||||
|
||||
void Vec::shrink()
|
||||
{
|
||||
if (((double)_used / (double)_len) >= 0.25)
|
||||
return;
|
||||
|
||||
_len = _len >> 1;
|
||||
int *p = new int[_len];
|
||||
|
||||
for (int i = 0; i <= _used; i++)
|
||||
p[i] = _v[i];
|
||||
|
||||
delete[] _v;
|
||||
_v = p;
|
||||
}
|
||||
//位置 数值
|
||||
int Vec::insert(int locate, int value)
|
||||
{
|
||||
if (locate == _used + 1)
|
||||
{
|
||||
_used++;
|
||||
_v[_used] = value;
|
||||
return 0;
|
||||
}
|
||||
if (locate < 0 || locate > _used)
|
||||
return -1;
|
||||
|
||||
_used++;
|
||||
|
||||
if (_used >= _len)
|
||||
expand();
|
||||
|
||||
for (int i = _used; i > locate; i--)
|
||||
_v[i] = _v[i - 1];
|
||||
|
||||
_v[locate] = value;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//位置 删除个数
|
||||
int Vec::remove(int locate, int value)
|
||||
{
|
||||
|
||||
if (locate < 0 || ((_used - value) < 0) || ((locate + value - 1) > _used))
|
||||
return -1;
|
||||
|
||||
_used = _used - value;
|
||||
|
||||
for (int i = locate; i <= _used; i++)
|
||||
_v[i] = _v[i + value];
|
||||
|
||||
shrink();
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
//删除某一元素
|
||||
int Vec::remove_sorted(int value)
|
||||
{
|
||||
int j, i;
|
||||
|
||||
for (i = 0; i <= _used && _v[i] != value; i++)
|
||||
;
|
||||
|
||||
for (j = 1; _v[i + j] == value; j++)
|
||||
;
|
||||
|
||||
return remove(i, j);
|
||||
}
|
||||
|
||||
int Vec::count(int value)
|
||||
{
|
||||
int j, i;
|
||||
|
||||
for (i = 0; i <= _used && _v[i] != value; i++)
|
||||
;
|
||||
|
||||
for (j = 0; _v[i + j] == value && i + j <= _used; j++)
|
||||
;
|
||||
|
||||
if (j == 0)
|
||||
return -1;
|
||||
|
||||
return j;
|
||||
}
|
||||
|
||||
int Vec::find(int value)
|
||||
{
|
||||
int i = 0;
|
||||
for (i; i <= _used; i++)
|
||||
{
|
||||
if (_v[i] == value)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int Vec::getlen()
|
||||
{
|
||||
return _len;
|
||||
}
|
||||
|
||||
int Vec::getused()
|
||||
{
|
||||
return _used;
|
||||
}
|
||||
|
||||
void Vec::printall()
|
||||
{
|
||||
for (int i = 0; i <= _used; i++)
|
||||
printf("%d\n", _v[i]);
|
||||
}
|
||||
|
||||
void Vec::bubbleSort()
|
||||
{
|
||||
int n = _used;
|
||||
bool sorted = false;
|
||||
|
||||
while (!sorted)
|
||||
{
|
||||
sorted = true;
|
||||
|
||||
for (int i = 1; i <= n; i++)
|
||||
{
|
||||
if (_v[i - 1] > _v[i])
|
||||
{
|
||||
swap(i - 1, i);
|
||||
|
||||
sorted = false;
|
||||
}
|
||||
}
|
||||
n--;
|
||||
}
|
||||
_sorted = true;
|
||||
}
|
||||
|
||||
void Vec::mergeSort(int lo, int hi)
|
||||
{
|
||||
if (lo >= hi)
|
||||
{
|
||||
return;
|
||||
}
|
||||
int mi = lo + (hi - lo) / 2;
|
||||
mergeSort(lo, mi);
|
||||
mergeSort(mi + 1, hi);
|
||||
merge(lo, mi, hi);
|
||||
|
||||
_sorted = true;
|
||||
}
|
||||
int Vec::search(int e)
|
||||
{
|
||||
if (_sorted == false)
|
||||
return -1;
|
||||
|
||||
int i = 0;
|
||||
for (i; i <= _used && _v[i] <= e; i++)
|
||||
;
|
||||
|
||||
return i - 1;
|
||||
}
|
||||
|
||||
void Vec::merge(int lo, int mi, int hi)
|
||||
{
|
||||
|
||||
int i = lo, j = mi + 1, k = 0;
|
||||
int *temp = new int[hi - lo + 1];
|
||||
while (i <= mi && j <= hi)
|
||||
{
|
||||
if (_v[i] <= _v[j])
|
||||
temp[k++] = _v[i++];
|
||||
else
|
||||
temp[k++] = _v[j++];
|
||||
}
|
||||
while (i <= mi)
|
||||
temp[k++] = _v[i++];
|
||||
while (j <= hi)
|
||||
temp[k++] = _v[j++];
|
||||
for (i = lo, k = 0; i <= hi; i++, k++)
|
||||
_v[i] = temp[k];
|
||||
delete[] temp;
|
||||
}
|
Reference in a new issue