标签:
仅仅实现了基本的链表操作,如创建、查找、删除、排序等。
//头文件 /*there is no head node exist * */ #include <iostream> using namespace std; typedef struct Node{ int value; struct Node* next; }Node,*ListNode; bool isEmpty(ListNode );//judge the list status bool createList(ListNode* ,const int=10);//create new list bool printList(ListNode ,ostream& output=cout);//print the list int size(ListNode); bool insert(ListNode* ,int ,int); //insert in the last bool insertTail(ListNode* ,int ); bool find(ListNode ,int ,int& );//find a node in list bool deleteNode(ListNode* ,int ,int& ); bool deleteNode(ListNode* ,int ,bool flag=true); bool getData(ListNode ,int ,int& ); bool deleteList(ListNode* );//delete the list entire ListNode sort(ListNode );//sort,and return a new list int fmin(ListNode ); int fmax(ListNode );
//源文件 #include <time.h> #include "List.h" #include <stdlib.h> bool isEmpty(ListNode pHead) { if(!pHead) return true; return false; } bool createList(ListNode* pHead,const int N) { if(N<0) return false; if(N==0) return true; static size_t randSeed=100; ListNode p1=new Node(); if(!p1)//apply for memory failed return false; srand(time(0)+randSeed); p1->value=rand()%100+1; *pHead=p1; for(int i=0;i<N-1;++i) { srand(time(0)+randSeed); ListNode pNew=new Node(); if(!pNew) { p1->next=NULL; return false; } pNew->value=rand()%100+1; p1->next=pNew; p1=pNew; randSeed+=rand(); } p1->next=NULL;//the last node pointer to NULL return true; } bool printList(ListNode pHead,ostream& output) { if(!pHead) return false; ListNode p=pHead; while(p) { output<<p->value<<" "; p=p->next; } return true; } int size(ListNode pHead) { ListNode p=pHead; int length(0); while(p) { length++; p=p->next; } return length; } bool insert(ListNode* pHead,int pos,int data) {//insert before the pos node if(pHead==NULL) return false; ListNode p,k; k=p=*pHead; int j=1; //pos should more than 0 while(p && j<pos) { k=p; p=p->next; ++j; } //if the list is empty,insert will be refused if(!p || j>pos)//if pos<1,return; return false; ListNode q; q=new Node(); q->value=data; q->next=p; if(k==p)//在第一个节点前插入 { *pHead=q; } else k->next=q; return true; } bool insertTail(ListNode* pHead,int data) { if(pHead==NULL) return false; ListNode p=*pHead; if(!p) { ListNode q=new Node(); q->value=data; q->next=NULL; *pHead=q; return true; } while(p->next) { p=p->next; } ListNode q=new Node(); q->value=data; q->next=NULL; p->next=q; return true; } bool deleteNode(ListNode* pHead,int pos,int& value) { if(pHead==NULL || *pHead==NULL) return false; ListNode p,q; p=q=*pHead; int j=1; while(p && j<pos) { q=p; p=p->next; j++; } if(!p || j>pos) return false; if(p==q) { value=p->value; *pHead=p->next; delete p; p=NULL; return true; } else { value=p->value; q->next=p->next; delete p; p=NULL; return true; } } //delete the node where value=data //if flag=true,delete all node where value=data,or delete the first one bool deleteNode(ListNode* pHead,int data,bool flag) { if(pHead==NULL || *pHead==NULL) return false; ListNode p,q; p=q=*pHead; if(flag) { while(p) { if(p->value==data) { if(p==q) { *pHead=p->next; delete p; p=q=*pHead; } else { q->next=p->next; delete p; p=q->next; } } q=p; p=p->next; } } else { while(p && p->value!=data) { q=p; p=p->next; } if(!p) return false; if(p==q) { *pHead=p->next; delete p; p=NULL; } else { q->next=p->next; delete p; p=NULL; } } return true; } //find data in list,pos is the position in list bool find(ListNode pHead,int data,int& pos) { ListNode p=pHead; pos=0; while(p) { pos++; if(p->value==data) { return true; } p=p->next; } return false; } //read the value in k node bool getData(ListNode pHead,int k,int& data) { if(pHead==NULL) return false; if(k<=0 || k>size(pHead)) return false; int i=1; ListNode p=pHead; while(p && i<k) { i++; p=p->next; } if(!p) return false; data=p->value; return true; } bool deleteList(ListNode* pHead) { if(pHead==NULL) return false; ListNode p=*pHead; while(p) { ListNode q=p->next; delete p; p=q; } *pHead=NULL; return true; } //select sort ListNode sort(ListNode pHead) { ListNode pHeadNew; pHeadNew=NULL; if(!pHead) return pHeadNew; while(pHead) { int min=fmin(pHead); deleteNode(&pHead,min,false); insertTail(&pHeadNew,min); } return pHeadNew; } int fmax(ListNode pHead) { int max=0x80000000; ListNode p=pHead; while(p) { if(p->value > max) { max=p->value; } p=p->next; } return max; } int fmin(ListNode pHead) { int min=0x7FFFFFFF; ListNode p=pHead; while(p) { if(p->value < min) { min=p->value; } p=p->next; } return min; }
//测试程序 #include <iostream> #include "List.h" using namespace std; const int N=10; int main() { ListNode pHead; pHead=NULL; if(!createList(&pHead,N)) cout<<"create list failed!"<<endl; cout<<"The initial length:"<<size(pHead)<<endl; cout<<endl<<"print list:"<<endl; if(!isEmpty(pHead)) printList(pHead); insert(&pHead,1,45); insert(&pHead,3,30); cout<<endl<<"print list:"<<endl; if(!isEmpty(pHead)) printList(pHead); insertTail(&pHead,18); cout<<endl<<"print list:"<<endl; if(!isEmpty(pHead)) printList(pHead); int valueToBeDeleted; deleteNode(&pHead,1,valueToBeDeleted); cout<<endl<<"print list:"<<endl; if(!isEmpty(pHead)) printList(pHead); valueToBeDeleted=2; deleteNode(&pHead,valueToBeDeleted); cout<<endl<<"print list:"<<endl; if(!isEmpty(pHead)) printList(pHead); int value; cout<<endl<<"find result:"<<find(pHead,18,value)<<endl; cout<<"position:"<<value<<endl; cout<<"read data:"<<getData(pHead,11,value)<<endl; cout<<"data:"<<value<<endl; cout<<"min:"<<fmin(pHead)<<endl; ListNode newList=sort(pHead); if(!isEmpty(newList)) printList(newList); else cout<<"list is empty..."<<endl; deleteList(&pHead); if(!isEmpty(pHead)) printList(pHead); else cout<<endl<<"list is empty..."<<endl; return 0; }
标签:
原文地址:http://blog.csdn.net/walker19900515/article/details/46492089