/************************* WZ ASUST 2016 C++ 實現雙向鏈表 *************************/ #include"sts.h" class CList{ public: struct Link{ Link *pPrev,*pNext; int nData; //節點的初始化,前驅與後繼指針置空 Link( int Data = 0): pPrev(NULL),pNext(NULL) { nData = Data; } ~Link() {} }; public: CList( Link* p = NULL) { pHead = pTail = p; }; //類的析構,具體由調用後面Clear實現; ~CList() { Clear(); } //類成員爲頭尾指針,體現這一結構設計。 Link* pHead,*pTail; void AddHead( Link* p) { if( pHead ) { pHead->pPrev = p; p->pNext = pHead; pHead = p; } else { pHead = p; } if( NULL == pTail ) { pTail = pHead; } }; void AddTail( Link* p) { if( pTail ) { pTail->pNext = p; p->pPrev = pTail; pTail = p; } else { pTail = p; } if( NULL == pHead ) { pHead = pTail; } } void Addmiddle( Link* enter,int n) { //just test; n=n-2; Link* p = pHead; while( p&&n-- ) { p = p->pNext; } enter->pNext=p->pNext; (p->pNext)->pPrev=enter; enter->pPrev=p; p->pNext=enter; } void Print() { Link* p = pHead; while( p ) { cout<< p->nData<<","; p = p->pNext; } cout<<endl; } void Clear() { Link* p = pHead; while( p ) { Link* pt = p->pNext; delete p; p = pt; } pHead = pTail = NULL; }; void DelHead() { if( pHead ) { Link* p = pHead->pNext; if( p == pTail ) { delete pHead; pTail->pPrev = pTail; pHead = pTail ; } else { delete pHead; pHead = p; p->pPrev = NULL; } } }; void DelTail() { if( pTail ) { Link* p = pTail->pPrev; if( p == pHead ) { delete p; pHead->pNext = pHead; pTail = pHead; } else { delete pTail; pTail = p; p->pNext = NULL; } } } int lengthlist() { int length=0; Link* p = pHead; if(pHead) { while( p ) { p = p->pNext; length++; } cout<<"length is "<<length<<endl; return length; } else return 0; } int reverselist() { int len=lengthlist(); int state=1; int tmp=0; Link* p = pHead;Link* q = p->pNext; while(len--&&state ) { cout<<"ckeck"<<endl; while(q->pNext) { cout<<"ckeck2"<<endl; if(p->nData >= q->nData ) {tmp=p->nData; p->nData= q->nData;q->nData=tmp;} p =p->pNext; q = q->pNext; } } } void ptintfloop() { int n=20; Link* p = pHead; Link* q = pTail; while(n--) {n=n-1; while(p!=pTail&&n--) { cout<<(p->nData); p=p->pNext; n=n-1; } while(q!=pHead&&n--) { cout<<(q->nData); q=q->pNext; n=n-1; } } } void listtoloop() { if(pHead) { pHead->pPrev=pTail; pTail->pNext=pHead; } else return; } }; int main() { CList list; list.AddHead( new CList::Link(2) ); list.AddHead( new CList::Link(0) ); list.AddHead( new CList::Link(1) ); list.AddHead( new CList::Link(6) ); list.AddHead( new CList::Link(3) ); list.AddTail( new CList::Link(1) ); list.AddTail( new CList::Link(4) ); list.AddTail( new CList::Link(5) ); list.AddTail( new CList::Link(2) ); list.AddTail( new CList::Link(0) ); list.DelHead(); list.DelTail(); list.Print(); cout<<endl<<"########################################################"<<endl; list.DelHead(); list.DelHead(); list.DelTail(); list.DelTail(); list.Print(); cout<<endl<<"########################################################"<<endl; list.AddHead( new CList::Link(1) ); list.AddHead( new CList::Link(2) ); list.AddHead( new CList::Link(3) ); list.AddHead( new CList::Link(4) ); list.AddHead( new CList::Link(5) ); list.AddTail( new CList::Link(6) ); list.Print(); list.DelHead(); cout<<"Del Head()"<<endl; list.Print(); list.AddTail( new CList::Link(7) ); list.AddTail( new CList::Link(8) ); list.AddTail( new CList::Link(9) ); list.AddTail( new CList::Link(10) ); list.Print(); list.lengthlist(); // list.reverselist();//bug // list.listtoloop(); //list.ptintfloop(); // bug always printf all; list.Print(); list.Addmiddle( new CList::Link(111),3); list.Print(); list.Clear(); return 0; } /************************* WZ ASUST 2016 C++ 實現單向鏈表 *************************/ #include"sts.h" class CList{ public: struct Link{ Link *next; int data; Link( int Data = 0): next(NULL) { data = Data; } ~Link() {} }; public: CList( Link* p = NULL) { pHead = pTail = p; }; //類的析構,具體由調用後面Clear實現; ~CList() { Clear(); } //類成員爲頭尾指針,體現這一結構設計。 Link* pHead,*pTail; void AddHead( Link* p) { if( pHead ) { p->next= pHead; pHead=p; } else { pHead = p; } if( NULL == pTail ) { pTail = pHead; } }; void AddTail( Link* p) { p->next=NULL; if( pTail ) { pTail->next = p; pTail=p; } else { pTail = p; } } void Addmiddle( Link* enter,int n) { //just test; n=n-2; Link* p = pHead; while( p&&n-- ) { p = p->next; } enter->next=p->next; p->next=enter; } int lengthlist() { int length=0; Link* p = pHead; if(pHead) { while( p ) { p = p->next; length++; } cout<<"length is "<<length<<endl; return length; } else return 0; } void paixu( ) { int x= lengthlist()+2; int t=0; int state=1; int ii=0,jj=0,kk=0; Link *p=pHead,*q=p->next; while(x--&&state) { ii++; while (p->next) { jj++; if(p->data >= q->data){t=q->data;q->data=p->data;p->data=t;kk++;} else state=0; p=p->next;q=q->next; } } } void sort( ) { Link *p,*q,*hs= new Link; Link *s=pHead; hs->next=NULL; hs->data=-1; while(s->next) { p=s->next; s->next=p->next; q=hs; while(q->next) { if(p->data <= q->next->data){p->next=q->next;q->next=p;break;} q=q->next; } if(!q->next){q->next=p;p->next=NULL;} } s->next=hs->next; } void reverselist() { Link *p=pHead; Link *q=pHead; Link *th = NULL; while(p) { q=p; p=p->next; q->next=th; th=q; } pHead=th; } void Print() { Link* p = pHead; while( p ) { cout<< p->data<<" "; p = p->next; } cout<<endl; } void Clear() { Link* p = pHead; while( p ) { Link* pt = p->next; delete p; p = pt; } pHead = pTail = NULL; }; void DelHead() { if( pHead ) { Link* p = pHead->next; if( p == pTail ) { delete pHead; pHead = pTail ; } else { delete pHead; pHead = p; } } else return; //could not write this. }; void DelTail() { if( pTail ) { Link* p = pTail; if( p == pHead ) { delete p; pTail= NULL;pHead=NULL; } else { Link* q =pHead; int len=lengthlist()-2; while(len --) { q=q->next;} pTail=q; delete p; } } else return; } int sort1() { int len=lengthlist(); int state=1; int tmp=0; Link* p = pHead;Link* q = p->next; while(len--&&state ) { cout<<"ckeck"<<endl; while(q->next) { cout<<"ckeck2"<<endl; if(p->data >= q->data ) {tmp=p->data; p->data= q->data;q->data=tmp;} p =p->next; q = q->next; } } } void ptintfloop() { int n=20; Link* p = pHead; Link* q = pTail; while(n--) {n=n-1; while(p!=pTail&&n--) { cout<<(p->data)<<" "; p=p->next; n=n-1; } while(q!=pHead&&n--) { cout<<(q->data)<<" "; q=q->next; n=n-1; } } } void listtoloop() { if(pHead) { Link* p = pHead; while(p->next) { p=p->next; } p->next=pHead; } else return; } }; void test1() { CList list; list.AddHead( new CList::Link(2) ); list.AddHead( new CList::Link(2) ); list.AddTail( new CList::Link(8) ); list.AddTail( new CList::Link(1) ); list.AddTail( new CList::Link(8) ); // list.DelTail(); //(core dumped) list.Print(); list.DelHead(); //ok list.Addmiddle( new CList::Link(9),3 ); list.lengthlist(); //list.sort1();//bug // list.paixu();//bug // list.sort(); //bug list.reverselist(); //ok list.Print(); //list.listtoloop(); //list.ptintfloop();//0k list.Clear(); } int main() { test1(); return 0; } #include"wz.h" typedef struct mylist { int data; struct mylist *next; }mylist; int listlength(mylist *list) { int length=0; mylist *p=list; while(p) { p=p->next; length++; } return length; } paixu(mylist *list) { int x=listlength(list)+2; int t=0; int state=1; int ii=0,jj=0,kk=0; mylist *p=list,*q=p->next; while(x--&&state) { ii++; while (p->next) { jj++; if(p->data >= q->data){t=q->data;q->data=p->data;p->data=t;kk++;} else state=0; p=p->next;q=q->next; } } printf("paixu :\nii==%d,jj==%d,kk==%d\n",ii,jj,kk); } printflist(mylist *list) { mylist *p=list; while(p) { printf("%3d",p->data); p=p->next; } printf("\n" ); } main() { int i; int k=9; int t=0; mylist *list=(mylist *)malloc(sizeof(mylist)); list->data = 11; list->next = NULL; mylist *new,*p=list,*q=p->next; i=11; while(i--) { new=(mylist *)malloc(sizeof(mylist)); new->data=i; // printf("%2d",new->data); new->next = list->next; list->next = new; } printflist(list); while(k--) {p=p->next;} printf("%d\n",p->data); q=p->next; t=q->data;q->data=p->data;p->data=t; printflist(list); printf("%d\n",p->data); paixu(list); printflist(list); }
鏈表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.