C 模板實現簡單的鍊錶和順序表

2021-07-30 09:24:10 字數 3818 閱讀 5760

從最初學習c語言到c++,就有乙個認識就是作為乙個優秀的程式猿一定要學會 」偷懶「 ,用程式設計師的話來說就是復用,在c的基礎上開發的c++就深刻闡明了這一道理,因為這樣有太多的好處,增加了**的可移植性,提高了可維護性。c++的模板就很有用,可以大大提高寫**的效率,同時優秀的**總是最簡潔最有效的**。下面我們來用模板實現鍊錶和順序表。

順序表seqlist.h檔案

#define _crt_secure_no_deprecate

#include #include #include using namespace std;

template class seqlist

seqlist(const seqlist& s)

_size = s._size;

_capacity = s._capacity;

} void swap(seqlist& s)

seqlist& operator=(seqlists)

~seqlist() }

void pushback(const t& x)

void popback() }

void pushfront(const t& x)

else

_a[0] = x;

++_size;

} }void _checkcapacity()

delete _a;

}_a = tmp;

} }void popfront()

else

--_size;

} }void insert(size_t pos, const t& x)

else if (pos == _size-1)

else

_a[pos - 1] = x;

_size++;

} }void erase(size_t pos)

else if (pos == _size - 1)

else

_size--;

} }int find(const t& x)

}return -1;

} void print()

cout << endl;

} t& back()

size_t size()

bool empty()

};template >

class stack

void pop()

const t& top()

size_t size()

bool empty()

protected:

container _con;

};

seqlist.cpp

#include "seqlist.h"

void testseqlist1()

void testseqlist2()

void testseqlist3()

void testseqlist4()

void testseqlist5()

void teststack()

cout << endl;

}int main()

其實之前用c++和c都寫過順序表和煉表,而是用模板只是編寫與型別無關的**,只需要修改類中和函式中有關型別的**即可。同時還實現了介面卡的 棧 因為棧是先進後出,所以我們用順序表實現起來更加高效,只需要在原來的類中增加介面卡能夠呼叫類的介面,也是復用減少了**量。介面卡模式的棧需要注意模板的第二個容器引數。

list.h

#define _crt_secure_no_deprecate

#include #include using namespace std;

template struct listnode

};template class list

//l2(l1)

list(const list& l)

:_head(null)

, _tail(null)

else

}} void distory()

_head = _tail = null;

} ~list()

//list& operator=(const list& l)

//

// }

// return *this;

//}void swap(list&l)

//list& operator=(list l)

// list& operator=(list&l)

return *this;

} void pushback(const t& x)

else

}void popback()

else if (_head == _tail)

else

}void pushfront(const t& x)

else

}void popfront()

else

}void insert(node* pos, const t& x)

else

}void erase(node* pos)

//else

//} else

else

}} node* find(const t& x)

p = p->_next;

} cout << "not find" << endl;

return null;

} void reverse() //翻轉字串

else

}} //void reverse()

// // else

// // node* tmp = _head;

// _head = _tail;

// _tail = _head;

// }

//}void print()

else

cout << endl;

} }t& front()

t& back()

size_t _size()

return count;

} bool empty() };

//介面卡模式實現佇列

template >

class queue

void pop()

t& front()

t& back()

size_t size()

bool empty()

protected:

container _con;

};

list.cpp

#include "list.h"

void testslist1()

void testslist2()

void testslist3()

void testslist4()

void testslist5()

void testqueue()

cout << endl;

}int main()

鍊錶的模板形式與順序表也類似,需要修改節點指標的型別,把所有關於型別的引數用模板引數替代,同時也實現了模板介面卡的 佇列 先進先出,用鍊錶用順序錶鏈表都可以實現,而鍊錶的結構來說更高效,所以介面卡的模板第二個引數預設為class container = list,給他提供預設的容器引數。

最後有一點要說的是實現順序表的時候存在乙個深拷貝層次的淺拷貝,在模板型別為string時,因為系統預設提供了一段buffer,假如順序表的乙個元素



C 模板實現順序表和煉表

順序表 pragma once include include include using namespace std 模板實現順序表 考慮深層次的深淺拷貝問題 template class seqlist t operator size t pos void print private t a s...

C 模板實現順序表

pragma once include include include linearlist.h using namespace std const int defaultsize 100 templateclass seqlist public linearlist int size const ...

順序表C 模板實現

include using namespace std const int maxsize 20 template class sqlist template sqlist sqlist template sqlist sqlist template void sqlist creatlist t ...