首页 > 编程语言 > 详细

链表和顺序表的实现c++版(绝对能用)

时间:2015-03-14 02:05:25      阅读:420      评论:0      收藏:0      [点我收藏+]

最近在重新复习C++基础知识点,复习到链表和顺序表,把之前的代码整理出来给大家参考;

?

我的注释算是比较详细的,所以就不做过多解释了;

?

贴代码的话只把具体实现贴出来,如果想要完整代码的我已经提供下载链接了哦,希望对大家有帮助:

?

首先是纯虚函数,两个表都继承此函数:headlist.h

#ifndef LISTHEAD_H

#defineLISTHEAD_H

?

#include<iostream>

usingnamespace std;

template <classElem> classlisthead{

public:

????? virtualvoidclear() = 0;

????? virtualboolinsert(Elem&,int i) = 0;

????? virtualboolappend(Elem&) = 0;

????? virtualboolremove(Elem&) = 0;

????? virtualvoidsetStart() = 0;

????? virtualvoidsetEnd() = 0;

????? virtualvoidprev() = 0;

????? virtualvoidnext() = 0;

????? virtualintleftLength() const = 0;

????? virtualintrightLength() const = 0;

????? virtualboolsetPos(int pos) = 0;

????? virtualboolgetValue(Elem&) const = 0;

????? virtualvoidprint() const = 0;

};

#endif

?

顺序表实现:

//顺序表:

#ifndef ALIST_H

#defineALIST_H

#include"listhead.h"

#include"Link.h"

template <classElem> classAlist : publiclisthead<Elem>

{

private:

????? int maxSize;

????? int listSize;

????? int fence;

????? Elem* listArray;

?

public:

????? Alist(int size);

????? ~Alist();

????? boolchangeMaxSize(int newMaxsize);//改变顺序表最大长度

????? boolinsert(Elem& it, int num);//插入元素

????? boolappend(Elem& item);//在末端添加元素

????? boolremove(Elem& item);//删除元素

????? voidsetStart();//将栅栏放置在开始处

????? voidsetEnd();//将栅栏放置在末端

????? voidprev();//栅栏前移

????? voidnext();//栅栏后移

????? voidclear();//清空队列

????? intleftLength() const;

????? intrightLength() const;

????? boolsetPos(int pos);

????? boolgetValue(Elem& it) const;

????? voidprint() const;//打印

????? voidreverlist();//逆置

};

?

????? template<classElem>

????? Alist<Elem>::Alist(intsize){

?????????? maxSize = size;

?????????? listSize = fence = 0;

?????????? listArray = newElem[maxSize];

????? }

????? template<classElem>

????? Alist<Elem>::~Alist(){

?????????? delete[] listArray;

?????????? listSize = fence = 0;

?????????? listArray = newElem[maxSize];

????? }

????? template<classElem>

????? boolAlist<Elem>::changeMaxSize(intnewMaxsize){

?????????? Elem* newlistArray;

?????????? newlistArray = new? Elem[newMaxsize];

?????????? for (int i = 0; i < newMaxsize; i++){

???????????????? newlistArray[i] = listArray[i];

?????????? }

?????????? listArray = newlistArray;

?????????? if (listSize>newMaxsize){

???????????????? listSize = newMaxsize;

?

????? ????? }

?????????? if (fence > listSize){

???????????????? fence = listSize;

?????????? }

?????????? maxSize = newMaxsize;

//???????? delete[] newlistArray;

?????????? returntrue;

????? }

????? template<classElem>

????? boolAlist<Elem>::insert(Elem& it, intnum){

?????????? if (listSize == maxSize || num<0 || num > listSize){

???????????????? returnfalse;

?????????? }

?????????? else

?????????? {

???????????????? for (int i = listSize; i > num; i--){

????????????????????? listArray[i] = listArray[i - 1];

???????????????? }

???????????????? listArray[num] = it;

???????????????? listSize++;

???????????????? fence = num;

???????????????? returntrue;

?????????? }

????? }

????? template<classElem>

????? boolAlist<Elem>::append(Elem& item){

?????????? if (listSize == maxSize){

???????????????? returnfalse;

?????????? }

?????????? listArray[listSize++] = item;

?????????? returntrue;

????? }

?

????? template<classElem>

????? boolAlist<Elem>::remove(Elem& item){

?????????? if (rightLength() == 0){

???????????????? returnfalse;

?????????? }

?????????? for (int i = 0; i < listSize; i++){

???????????????? if (listArray[i] == item){

????????????????????? fence = i;

????????????????????? break;

???????????????? }

?????????? }

?????????? item = listArray[fence];

?????????? for (int i = fence; i<listSize - 1; i++){

???????????????? listArray[i] = listArray[i + 1];

?????????? }

?????????? listSize--;

?????????? returntrue;

????? }

????? template<classElem>

????? voidAlist<Elem>::setStart(){

?????????? fence = 0;

????? }

????? template<classElem>

????? voidAlist<Elem>::setEnd(){

?????????? fence = listSize;

????? }

????? template<classElem>

????? voidAlist<Elem>::prev(){

?????????? if (fence != 0)

???????????????? fence--;

????? }

????? template<classElem>

????? voidAlist<Elem>::next(){

?????????? if (fence <= listSize - 1)

???????????????? fence++;

????? }

????? template<classElem>

????? intAlist<Elem>::leftLength() const{

?????????? return fence;

????? }

????? template<classElem>

????? intAlist<Elem>::rightLength() const{

?????????? return listSize - fence;

????? }

????? template<classElem>

????? boolAlist<Elem>::setPos(intpos){

?????????? if ((pos >= 0) && (pos <= listSize)){

???????????????? fence = pos;

?????????? }

?????????? return (pos >= 0) && (pos <= listSize);

????? }

????? template<classElem>

????? boolAlist<Elem>::getValue(Elem& it) const{

?????????? if (rightLength() == 0) returnfalse;

?????????? else

?????????? {

???????????????? it = listArray[fence]; returntrue;

?????????? }

????? }

????? template<classElem>

????? voidAlist<Elem>::print() const

????? {

?????????? int temp = 0;

?????????? cout << "<";

?????????? while (temp<fence){ cout << listArray[temp++] << " "; }

?????????? cout << " | ";

??????????

?????????? while (temp<listSize){ cout << listArray[temp++] << " "; }

?????????? cout << " \n";

?????????? cout << listSize << " "<<fence<<endl;

????? }

????? template<classElem>

????? voidAlist<Elem>::reverlist(){

?????????? int i;

?????????? for (i = 0; i<listSize / 2; i++){

???????????????? listArray[listSize + 1] = listArray[i];

???????????????? listArray[i] = listArray[listSize - i - 1];

???????????????? listArray[listSize - i - 1] = listArray[listSize + 1];

?????????? }

????? }

????? //删除列表中的数据

????? template<classElem>

????? void? Alist<Elem>::clear(){

????? }

#endif

?

链表实现:

//节点

#ifndef LINK_H

#defineLINK_H

#include"listhead.h"

template <classElem> classLink{

public:

????? Elem element;//节点元素

????? Link *next;//指向下一个元素

????? Link(constElem& elemval,Link* nextval =NULL){

????? element = elemval;next = nextval;

????? }

??? Link(Link* nextval =NULL){

????? next = nextval;

????? }

};

#endif

?

#ifndef ALIST_L

#defineALIS_L

#include"listhead.h"

template<classElem> classLList:publiclisthead<Elem>{

private:

????? Link<Elem> *head;//头节点(不存数据)

????? Link<Elem> *tail;//尾节点

????? Link<Elem> *fence;//栅栏

????? int leftcnt;

????? int rightcnt;

????? int size;//链表长度

????? voidinit(){//初始化

?????????? fence = tail = head = newLink<Elem>;

?????????? leftcnt = rightcnt = 0;

?????????? size = 1;

????? }

????? voidremoveall(){//清空所有

?????????? while (head != NULL)

?????????? {

???????????????? fence = head;

???????????????? head = head->next;

???????????????? delete fence;

?????????? }

????? }

public:

????? LList( intsize = DefaultListSize){

?????????? init();

????? }

????? ~LList(){

?????????? removeall();

????? }

????? voidclear(){

?????????? removeall();init();

????? }

????? boolinsert(Elem&,int i);

????? boolappend(Elem&);

????? boolremove(Elem&);

????? voidsetStart(){

?????????? fence = head;

?????????? rightcnt +=leftcnt;

?????????? leftcnt = 0;

????? }

????? voidsetEnd(){

?????????? fence = tail;

?????????? leftcnt += rightcnt;

?????????? rightcnt = 0;

????? }

????? voidprev();//前驱

????? voidnext(){//后继

?????????? if(fence!=tail){

???????????????? fence =fence ->next;rightcnt--;leftcnt++;

?????????? }

????? }

????? intleftLength() const{return leftcnt;}

????? intrightLength() const{return rightcnt;}

????? boolsetPos(int pos);

????? boolgetValue(Elem& it) const{

?????????? if(rightLength()==0)returnfalse;

?????????? it = fence->next->element;

?????????? returntrue;

????? }

????? voidprint() const;

??? voidreverlist();//逆置

};

template<classElem>

boolLList<Elem>::insert(Elem& item, inti){//插入操作

????? if (i<1||i>size){

?????????? returnfalse;

????? }

????? else{

?????????? int n = 0;

?????????? Link<Elem>*? temp = head;

?????????? while(n<i-1){

???????????????? temp = temp->next;

???????????????? n++;

?????????? }

?????????? temp->next = newLink<Elem>(item, temp->next);

?????????? size++;

?????????? returntrue;

????? }

?

}

template<classElem>

boolLList<Elem>::append(Elem& item){//添加在末端

????? tail = tail ->next = newLink<Elem>(item,NULL);

????? rightcnt++;

????? size++;

????? returntrue;

}

template<classElem>

boolLList<Elem>::remove(Elem& it){//删除某元素

????? bool del = false;

????? Link<Elem>*? temp = head;

????? while(temp->next!=NULL){

?????????? if (temp->next->element == it){

???????????????? temp->next = temp->next->next;

???????????????? del = true;

???????????????? leftcnt--;

???????????????? size--;

?????????? }

?????????? else{

???????????????? temp = temp->next;

?????????? }

?

????? }

????? return del;

}

template<classElem>

voidLList<Elem>::prev(){

????? Link<Elem>*? temp = head;

????? if(fence == head) return;

????? while (temp->next!=fence) temp = temp->next;

????? fence = temp;

????? leftcnt--; rightcnt++;

}

template<classElem> boolLList<Elem>::setPos(intpos){

????? if((pos<0)||(pos>rightcnt+leftcnt)) returnfalse;

????? fence = head;

????? for(int i=0;i<pos;i++){

?????????? fence = fence->next;

????? }

????? returntrue;

}

template<classElem>

voidLList<Elem>::print() const{

????? Link<Elem>* temp = head;

????? cout<<"<";

????? while (temp!=fence)

????? {

?????????? cout<<temp->next->element<<" ";

?????????? temp = temp->next;

????? }

????? cout<<" | ";

????? while (temp->next!=NULL){

?????????? cout <<temp->next->element <<"? ";

?????????? temp = temp->next;

????? }

????? cout<<" >\n ";

}

template <class? Elem>

voidLList<Elem>::reverlist()

{

Link<Elem>* p,*q;

p=head->next;

head->next=NULL;//链式线性表分为两部分

while(p!=NULL){

q=p;

p=p->next;

q->next=head->next;

head->next=q;

}

}

#endif

?

链表和顺序表的实现c++版(绝对能用)

原文:http://448230305.iteye.com/blog/2192197

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!