第 2 章 线性表

107
Department of Computer Science & Technology, Nanjing University fall 2008 DATA STRUCTURES 1 第2第 第第第 第第第 第第第 第第第 第第第第 第第第第 第第第

Upload: jeroen

Post on 05-Jan-2016

69 views

Category:

Documents


11 download

DESCRIPTION

第 2 章 线性表. 线性表 顺序表 单链表 循环链表 双向链表 多项式. 线性表的定义 线性表是 n (≥ 0) 个数据元素的有限序列 ( a 1 , a 2 , …, a n ) a i 是表中数据元素, n 是表长度。 原则上讲,线性表中表元素的数据类型可以不相同。但采用的存储表示可能会对其有限制。 为简单起见,假定各元素类型相同。. 2.1 线性表 (Linear List). a 1. a 2. a 3. a 4. a 5. a 6. 线性表的特点 除第一个元素外,其他每一个元素有一个且仅有一个 直接前驱 。 - PowerPoint PPT Presentation

TRANSCRIPT

DATA STRUCTURES
DATA STRUCTURES
DATA STRUCTURES

DATA STRUCTURES
class LinearList {
virtual int Search(T x) const = 0; //
virtual int Locate(int i) const = 0; //
virtual E* getData(int i) const = 0; //
virtual void setData(int i, E x) = 0; //
Department of Computer Science & Technology, Nanjing University fall
DATA STRUCTURES
virtual bool IsEmpty() const = 0; //
virtual bool IsFull() const = 0; //
virtual void Sort() = 0 //
virtual void input() = 0 //
virtual void output() = 0 //
virtual LinearList<T, E>operator=
(LinearList<T, E>& L) = 0; //
};
DATA STRUCTURES
ain
;
data
DATA STRUCTURES
DATA STRUCTURES
(SeqList) P.46
Type *data; //
int MaxSize; //
int last; //
int Find ( Type & x ) const;
Department of Computer Science & Technology, Nanjing University fall
DATA STRUCTURES
int Remove ( Type & x );
int Next ( Type & x ) ;
int Prior ( Type & x ) ;
Type Get ( int i ) {
}
}
DATA STRUCTURES
if ( sz > 0 ) {
DATA STRUCTURES
// x
int i = 0;
i++;
else return i;
DATA STRUCTURES


2x-1
Department of Computer Science & Technology, Nanjing University fall
DATA STRUCTURES
x = 50
x =48
DATA STRUCTURES
DATA STRUCTURES
0 1 2 3 4 5 6 7
data
50
data
50
i
DATA STRUCTURES
DATA STRUCTURES
// i x
return 0; //
data[j] = data[j -1];
data[i] = x;
return 1; //
DATA STRUCTURES
DATA STRUCTURES
Department of Computer Science & Technology, Nanjing University fall
DATA STRUCTURES
DATA STRUCTURES
// x
if ( i >= 0 ) {
data[j] = data[j+1];
return 1; //
DATA STRUCTURES

DATA STRUCTURES
SeqList<Type> & LB ) {
int n = LA.Length ( );
int m = LB.Length ( );
Type x = LB.Get(i); //LB
if ( k == -1 ) //
}
}

DATA STRUCTURES
SeqList<Type> & LB ) {
int n = LA.Length ( );
while ( i < n ) {
if ( k == -1 ) { LA.Remove (i); n--; }
else i++; //LA
DATA STRUCTURES
DATA STRUCTURES
1
4
DATA STRUCTURES
2.3
data link
DATA STRUCTURES
DATA STRUCTURES
DATA STRUCTURES
DATA STRUCTURES
DATA STRUCTURES
//,
DATA STRUCTURES
DATA STRUCTURES

first
newnode
DATA STRUCTURES

DATA STRUCTURES

DATA STRUCTURES
// x i i 1
//i = 0
LinkNode *newNode = new LinkNode(x); //
newNode->link = first; first = newNode;
//
*
DATA STRUCTURES
{ current = current->link; k++; }
{cerr << “!\n”; return false;}
else { //
DATA STRUCTURES
DATA STRUCTURES
—:
*
DATA STRUCTURES
// i , i 1
LinkNode *del; //
else {
while (k < i-1 && current != NULL)
{ current = current->link; k++; }
}
return true;
DATA STRUCTURES
DATA STRUCTURES
DATA STRUCTURES
DATA STRUCTURES
// x i i 1
//i = 0
LinkNode *newNode = new LinkNode(x); //
newNode->link = first; first = newNode;
//
:
DATA STRUCTURES

DATA STRUCTURES
DATA STRUCTURES
DATA STRUCTURES
struct LinkNode { //
E data; //
LinkNode() { link = NULL; } //
{ data = item; link = ptr; } //
bool operator== (T x) { return data.key == x; }
//
};
DATA STRUCTURES
class List : public LinearList<T, E> {
//,
public:
List(E x) { first = new LinkNode<T, E>(x); }
List( List<T, E>& L); //
~List(){ } //
DATA STRUCTURES
E *getData(int i); //i
bool Insert (int i, E x); //i
bool Remove(int i, E& x); //i
bool IsEmpty() const //
LinkNode<T, E> *getFirst() const { return first; }
void setFirst(LinkNode<T, E> *f ) { first = f; }
void Sort(); //
DATA STRUCTURES
LinkNode<T, E> *q;
while (first->link != NULL) {
q = first->link; //
delete q; //
DATA STRUCTURES
DATA STRUCTURES
int List<T, E> :: Length ( ) const {
ListNode<T, E> *p = first->link;
// p
int count = 0;
DATA STRUCTURES
DATA STRUCTURES
LinkNode<T, E> *List<T, E>::Search(T x) {
//x,
//; NULL
while ( current != NULL && current->data != x ) current = current->link;
//x
DATA STRUCTURES
LinkNode<T, E> *List<T, E>::Locate ( int i ) {
// i i < 0 i
//NULL
LinkNode<T, E> *current = first; int k = 0;
while ( current != NULL && k < i )
{ current = current->link; k++; }
};
DATA STRUCTURES
bool List<T, E>::Insert (int i, E x) {
// x i
LinkNode<T, E> *current = Locate(i);
if (current == NULL) return false; //
LinkNode<T, E> *newNode =
newNode->link = current->link; //
current->link = newNode;
return true; //
DATA STRUCTURES
bool List<T, E>::Remove (int i, E& x ) {
//i, x
if ( current == NULL || current->link == NULL)
return false; //
current->link = del->link;
return true;
DATA STRUCTURES
DATA STRUCTURES
DATA STRUCTURES
cin >> val;
node->link = first->link;
first->link = node; //
DATA STRUCTURES
DATA STRUCTURES
Type val; ListNode<Type> *node, *last;
first = new ListNode<Type>; //
cin >> val; last = first;
while ( val != endTag ) { //last
cin >> val; //
DATA STRUCTURES
DATA STRUCTURES
2.3
DATA STRUCTURES
DATA STRUCTURES


DATA STRUCTURES
struct CircLinkNode { //
NULL ) { link = next; }
NULL ) { data = d; link = next; }
bool Operator==(E x) { return data.key == x.key; }
bool Operator!=(E x) { return data.key != x.key; }
};
DATA STRUCTURES
private:
public:
CircList(); //
//
//
DATA STRUCTURES
DATA STRUCTURES
DATA STRUCTURES
:nm<n
*
DATA STRUCTURES
*
DATA STRUCTURES
Firster ( );
cout << “” << getData ( )
DATA STRUCTURES
void main ( ) {
//
DATA STRUCTURES
Department of Computer Science & Technology, Nanjing University fall
DATA STRUCTURES
DATA STRUCTURES

DATA STRUCTURES
friend class DblList<Type>;
DblNode ( Type value, //
*
DATA STRUCTURES
lLink (NULL), rLink (NULL) { }
public:
int Search ( const Type & target );
Type getData ( ) const;
DATA STRUCTURES
void Remove ( );
DATA STRUCTURES
DATA STRUCTURES
Search( const Type & target ) {
while ( p != first && p→data != target )
p = p→rLink; //
return 0;
DATA STRUCTURES
DATA STRUCTURES
()
DATA STRUCTURES
()
DATA STRUCTURES
template <class T>
bool DblList<T>::Insert ( int i, const T& x, int d ) {
//x, d
//di
DblNode<T,E> *newNd = new DblNode<T,E>(x);
if (d == 0) { //:i
current->lLink = newNd;
newNd->rLink = current;
current->rLink = newNd;
newNd->lLink = current;
DATA STRUCTURES
DATA STRUCTURES
current→rLink→lLink = current→lLink; current→lLink→rLink = current→rLink;
()
48
first
first

31
48
15
current
31
15
current31
DATA STRUCTURES
()
DATA STRUCTURES
template <class T>
bool DblList<T>::Remove( int i, const T& x, int d ) {
//di
current->rLink->lLink = current->lLink;
current->lLink->rLink = current->rLink;
//lLinkrLink
return true; //
DATA STRUCTURES
a0, a1, a2, …, an
0, 1, 2, …, n
Department of Computer Science & Technology, Nanjing University fall
DATA STRUCTURES
class Polynomial {
}
DATA STRUCTURES
*
DATA STRUCTURES
}
DATA STRUCTURES
static term termArray[maxTerms]; // static int free, maxTerms; //
:
coef
exp
Department of Computer Science & Technology, Nanjing University fall
DATA STRUCTURES
DATA STRUCTURES
DATA STRUCTURES
DATA STRUCTURES
struct Term {
int coef;
int exp;
};
DATA STRUCTURES
BH = - x4 + 10x6 - 3x10 + 8x14 +4x18

DATA STRUCTURES
papbCH
DATA STRUCTURES
//
pc = C.first; //
if (pa->exp == pb->exp) { //
temp = pa->coef + pb->coef; if ( fabs(temp) > 0.001)
pc = pc->InsertAfter(temp, pa->exp);
pa = pa->link; pb = pb->link;
}
pc = pc->InsertAfter(pa->coef, pa->exp);
pa = pa->link; } else { //pb
pc = pc->InsertAfter(pb->coef, pb->exp);
pb = pb->link; } p = (pa != NULL)? pa : pb; //p
while (p != NULL) {
p = p->link;
DATA STRUCTURES
ListIterator<Term> Aiter ( ah.poly );
ListIterator<Term> Biter ( bh.poly );
pa = Aiter.Next ( ); pb = Biter.Next ( );
DATA STRUCTURES
DATA STRUCTURES