通用链表,存入学生类为例,并提供排序功能。
#include <iostream>
using namespace std;
template<class T> struct node {
T data;
node<T> *next;
};
template<class T> class linkqueue {
private:
node<T> *front, *rear;
int sum;
public:
linkqueue();
~linkqueue() {};
void Enqueue( T );
void Dequeue();
T Getqueue();
bool Isempty() {
if(sum == 0)
return 1;
else
return 0;
}
int returnsum() {return sum;}
node<T> *gethead() {return front->next;}
};
template<class T>
linkqueue<T>::linkqueue() {
node<T> *s = new node<T>;
s->next = NULL;
front = rear = s;
sum = 0;
}
template<class T>
void linkqueue<T>::Enqueue( T t) {
node<T> *p = new node<T>;
p->data = t;
p->next = NULL;
rear->next = p;
rear = p;
sum++;
}
template<class T>
void linkqueue<T>::Dequeue() {
if(Isempty())
cout << "Is empty!" << endl;
else {
node<T> *q = new node<T>;
q = front->next;
front->next = q->next;
if(q->next == NULL)
rear = front;
delete q;
sum--;
}
}
template<class T>
T linkqueue<T>::Getqueue() {
if(Isempty())
return 0;
else
return front->next->data;
}
class student {
private:
char *name, *sex;
double ID;
public:
student(char *na = 0, char *se = 0, double id = 0) {
name = na, sex = se, ID = id;
}
~student() {}
friend bool operator>(student a, student b);
void print() {
cout << "name: " << name << " sex: " << sex << " ID: " << ID << endl;
}
};
bool operator>(student a, student b) {
if(a.ID > b.ID)
return true;
else
return false;
}
template<class T>
void sort(linkqueue<T> *L) {
node<T> *p, *q;
p = L->gethead();
q = p->next;
while(p != NULL) {
node<T> *t = p;
q = p;
while(q->next != NULL) {
q = q->next;
if(q ->data > t -> data )
t = q;
}
T x = t -> data;
t -> data = p -> data;
p -> data = x;
p = p->next;
}
}
int main() {
linkqueue<student> a;
student a1("abc", "man", 123), a2("abcd", "woman", 910), a3("abcde", "man", 789),a4("qwer","man",999);
a.Enqueue(a1);
a.Enqueue(a2);
a.Enqueue(a3);
a.Enqueue(a4);
sort(&a);
a.Dequeue();
int sum2 = a.returnsum();
for(int i = 0; i < sum2; i++) {
a.Getqueue().print();
a.Dequeue();
}
return 0;
}