#pragma once
#ifndef _SCLIST_H_
#define _SCLIST_H_
#include <iostream>
#include <assert.h>
using namespace std;
typedef enum{FALSE,TRUE} Status;
template<class Type> class List;
template<class Type>
class ListNode
{
friend class List<Type>;
public:
ListNode() :data(Type()), next(NULL)
{}
ListNode(Type d, ListNode<Type> *n = NULL)
: data(d), next(n)
{}
~ListNode()
{}
void setData(const Type &d)
{
data = d;
}
Type GetData()
{
return data;
}
private:
Type data;
ListNode<Type> *next;
};
template<class Type>
class List
{
public:
List()
{
ListNode<Type> *s = new ListNode<Type>;
assert(s != NULL);
last = first = s;
last->next = first;
size = 0;
}
~List()
{}
public:
Status push_back(const Type &x)
{
ListNode<Type> *s = new ListNode<Type>(x);
assert(s != NULL);
s->next = last->next;
last->next = s;
last = s;
size++;
return TRUE;
}
Status push_front(const Type &x)
{
ListNode<Type> *s = new ListNode<Type>(x);
assert(s != NULL);
s->next = first->next;
first->next = s;
if (size == 0)
{
last = s;
last->next = first;
}
size++;
return TRUE;
}
Status pop_back()
{
if (size == 0)
{
return FALSE;
}
ListNode<Type> *p = first;
ListNode<Type> *q = p->next;
while (q->next != first)
{
p = p->next;
q = q->next;
}
delete last;
last = p;
last->next = first;
size--;
return TRUE;
}
Status pop_front()
{
if (size == 0)
{
return FALSE;
}
ListNode<Type> *p = first;
ListNode<Type> *q = p->next;
p->next = q->next;
delete q;
if (size == 1)
{
last = first;
last->next = first;
}
size--;
return TRUE;
}
Status insert_val(const Type &x)
{
ListNode<Type> *p = first;
while (p->next != first && p->next->data < x)
{
p = p->next;
}
if (p->next == first)
{
push_back(x);
}
else
{
ListNode<Type> *s = new ListNode<Type>(x);
s->next = p->next;
p->next = s;
size++;
}
return TRUE;
}
Status delete_val(const Type &x)
{/*
if (size == 0)
{
return FALSE;
}
ListNode<Type> *p = find(x);
if (p == NULL)
{
return FALSE;
}
if (p == last)
{
pop_back();
}
else
{
ListNode<Type> *q = p->next;
p->data = q->data;
p->next = q->next;
if (p->next == last)//q爲最後一個結點
{
last = p;
}
delete q;
size--;
return TRUE;
}*/
if (size == 0)
{
return FALSE;
}
ListNode<Type> *p = first;
ListNode<Type> *q = p->next;
while (q != first && q->data != x)
{
p = p->next;
q = q->next;
}
if (q->next == first)
{
pop_back();
}
else
{
p->next = q->next;
delete q;
size--;
}
return TRUE;
}
ListNode<Type> *find(const Type &key) const
{
if (size == 0)
{
return NULL;
}
ListNode<Type> *p = first->next;
while (p != first && p->data !=key)
{
p = p->next;
}
if (p == first)
{
return NULL;
}
return p;
}
ListNode<Type> *Prio(const Type &x) const
{
if(size==0 || size==1)
{
return NULL;
}
ListNode<Type> *p = first->next;
ListNode<Type> *q = p->next;
while (q->data != x)
{
p = p->next;
q = q->next;
}
return p;
}
ListNode<Type> *prio(ListNode<Type> *p) const
{
if (p==NULL || p==first->next)
{
return NULL;
}
ListNode<Type> *s = first;
while (s->next != p)
{
s = s->next;
}
return s;
}
ListNode<Type> *Next(const Type &x) const
{
if(size==0 || size==1)
{
return NULL;
}
ListNode<Type> *s = find(x);
if (s == NULL)
{
return NULL;
}
return s->next;
}
ListNode<Type> *next(ListNode<Type> *p) const
{
if (p == NULL || p->next != first)
{
return NULL;
}
ListNode<Type> *s = first;
while (s->next != p)
{
s = s->next;
}
return s;
}
void show_List()
{
ListNode<Type> *p = first->next;
while (p != first)
{
cout << p->data << "->";
p = p->next;
}
cout << "first" << endl;
}
int length()
{
return size;
}
void clear()
{
ListNode<Type> *p = first->next;
while (p != first)
{
first->next = p->next;
delete p;
p = first->next;
}
last = first;
last->next = first;
size = 0;
}
void destroy()
{
clear();
delete first;
first = last = NULL;
}
Status modify_val(const Type &x, const Type &y)
{
ListNode<Type> *s = find(x);
if (s == NULL)
{
return FALSE;
}
s->data = y;
return TRUE;
}
void sort()
{
if (size == 0 || size == 1)
{
return;
}
ListNode<Type> *p = first->next;
ListNode<Type> *q = p->next;
last = p;
last->next = first;
while (q != first)
{
p = q;
q = q->next;
ListNode<Type> *s = first;
while (s->next != first && p->data > s->next->data)
{
s = s->next;
}
if (s->next == first)
{
p->next = first;
last->next = p;
last = p;
}
else
{
p->next = s->next;
s->next = p;
}
}
}
void resver()
{
if (size == 0 || size == 1)
{
return;
}
ListNode<Type> *p = first->next;
ListNode<Type> *q = p->next;
last = p;
last->next = first;
while (q != first)
{
p = q;
q = q->next;
p->next = first->next;
first->next = p;
}
}
Status merge(List<Type> <1, List<Type> <2)
{
ListNode<Type> *p = lt1.first->next;
ListNode<Type> *q = lt2.first->next;
ListNode<Type> *s = first;
while (p != lt1.first && q != lt2.first)
{
if (p->data < q->data)
{
s->next = p;
p = p->next;
s = s->next;
}
else
{
s->next = q;
q = q->next;
s = s->next;
}
}
while (p != lt1.first)
{
s->next = p;
p = p->next;
s = s->next;
}
while (q != lt2.first)
{
s->next = q;
q = q->next;
s = s->next;
}
s->next = first;
size = lt1.size + lt2.size;
return TRUE;
}
private:
ListNode<Type> *first;
ListNode<Type> *last;
size_t size;
};
#endif
#include "SCList.h"
void main()
{
List<int> mylist;
List<int> youlist;
List<int> mergelist;
int select = 1;
int pos;
int item;
system("Color 0d");
while (select)
{
cout << "************************************" << endl;
cout << "* [0] quit_system [1] push_back *" << endl;
cout << "* [2] push_front [3] show_list *" << endl;
cout << "* [4] pop_back [5] pop_front *" << endl;
cout << "* [6] insert_val [7] delete_val *" << endl;
cout << "* [8] merge [9] next *" << endl;
cout << "* [10] find [11] sort *" << endl;
cout << "* [12] resver [13] length *" << endl;
cout << "* [14] clear [15] destroy *" << endl;
cout << "* [16] modify_val [17] prio *" << endl;
cout << "************************************" << endl;
cout << "請選擇:>";
cin >> select;
switch (select)
{
case 1:
cout << "請輸入要插入的數據(-1結束):>";
while (cin >> item, item != -1)
{
mylist.push_back(item);
}
break;
case 2:
cout << "請輸入要插入的數據(-1結束):>";
while (cin >> item, item != -1)
{
mylist.push_front(item);
}
break;
case 3:
system("cls");
mylist.show_List();
system("pause");
break;
case 4:
mylist.pop_back();
break;
case 5:
mylist.pop_front();
break;
case 6:
cout << "請輸入要插入的值:>";
cin >> item;
mylist.insert_val(item);
break;
case 7:
cout << "請輸入要刪除的值:>";
cin >> item;
mylist.delete_val(item);
break;
case 8:
for (int i = 1; i < 10; i += 2)
{
mylist.push_back(i);
}
for (int i = 2; i < 10; i += 2)
{
youlist.push_back(i);
}
mergelist.merge(mylist, youlist);
mergelist.show_List();
break;
case 9:
cout << "請輸入要查找的值:>";
cin >> item;
cout << "所在查找值的後繼爲:" << mylist.Next(item) << endl;
break;
case 10:
cout << "請輸入要查找的值:>";
cin >> item;
cout << "該值指針爲:" << mylist.find(item) << endl;
break;
case 11:
mylist.sort();
break;
case 12:
mylist.resver();
break;
case 13:
cout << "線性表的長度爲:" << mylist.length() << endl;
break;
case 14:
mylist.clear();
break;
case 15:
mylist.destroy();
break;
case 16:
cout << "請輸入要修改的值:>";
cin >> item;
cout << "請輸入修改後的值:>";
cin >> pos;
mylist.modify_val(item, pos);
break;
case 17:
cout << "請輸入要查找的值:>";
cin >> item;
cout << "所在查找值的前驅爲:" << mylist.Prio(item) << endl;
break;
default:
break;
}
}
}
運行界面如下: