C++单链表的动态创建,查找,遍历,删除,插入,添加,排序 收藏
-
-
- #include<iostream.h>
-
- typedef struct node
- {
- int val;
- struct node* pNext;
- }NODE,*PNODE;
-
-
-
-
- class MyList
- {
- private:
- PNODE pHead;
-
- public:
- MyList()
- {
- this->pHead = NULL;
- }
-
- ~MyList()
- {
- while(this->pHead!=NULL)
- {
- PNODE pTemp = pHead->pNext;
- delete pHead;
- pHead = pTemp;
- }
- }
-
- void Init()
- {
- int a;
- char ans;
-
- PNODE pTail,pNew;
-
- do
- {
- cout<<"请输入一个节点值:";
- cin>>a;
-
- if(pHead == NULL)
- {
- pHead = new NODE;
- pHead->val = a;
- pHead->pNext = NULL;
-
- pTail = pHead;
- }
- else
- {
- pTail = pHead;
- while(pTail->pNext!=NULL)
- {
- pTail = pTail->pNext;
- }
-
- pNew = new NODE;
- pNew->val = a;
- pNew->pNext = NULL;
-
- pTail->pNext = pNew;
- pTail = pTail->pNext;
- }
-
- cout<<"继续吗?(Y/N): ";
- cin>>ans;
-
- }while(ans=='Y'||ans=='y');
- }
-
- void Add(int val)
- {
- if(pHead == NULL)
- {
- pHead = new NODE;
- pHead->val = val;
- pHead->pNext = NULL;
- }
- else
- {
- PNODE pTemp = pHead;
- while(pTemp->pNext!=NULL)
- {
- pTemp = pTemp->pNext;
- }
-
- PNODE pNew = new NODE;
- pNew->val = val;
- pNew->pNext = NULL;
-
- pTemp->pNext = pNew;
- }
- }
-
- int DelAt(int k)
- {
- PNODE p1,p2,pTemp;
-
- if(pHead == NULL)
- {
- return -1;
- }
-
- if(k<0 || k>this->GetNodeCnt()-1)
- {
- return -1;
- }
-
- if(this->GetNodeCnt() == 1)
- {
- delete pHead;
- pHead = NULL;
- return 0;
- }
-
- if(k==0)
- {
- pTemp = pHead;
- pHead = pTemp->pNext;
- delete pTemp;
- return 0;
- }
-
- if(k == this->GetNodeCnt()-1)
- {
- PNODE p,pTemp;
-
- p = pHead;
- while(p->pNext->pNext!=NULL)
- {
- p = p->pNext;
- }
-
- pTemp = p->pNext;
-
- p->pNext = NULL;
- delete pTemp;
-
- return 0;
- }
-
- p1 = pHead;
- int i=0;
- while(i<k-1)
- {
- p1 = p1->pNext;
- i++;
- }
-
- pTemp = p1->pNext;
- p2 = p1->pNext->pNext;
-
- p1->pNext = p2;
- delete pTemp;
- return 0;
- }
-
- int InsertAt(int val,int k)
- {
- PNODE p1,p2,pNew,pTemp;
-
- if(pHead == NULL)
- {
- return -1;
- }
-
- if(k<0 || k>this->GetNodeCnt()-1)
- {
- return -1;
- }
-
- if(k==0)
- {
- pTemp = pHead;
-
- pNew = new NODE;
- pNew->val = val;
- pNew->pNext = NULL;
-
- pHead = pNew;
-
- pNew->pNext = pTemp;
-
- return 0;
- }
-
- p1 = pHead;
- int i =0;
- while(i<k-1)
- {
- p1 = p1->pNext;
- i++;
- }
-
- p2 = p1->pNext;
-
- pNew = new NODE;
- pNew->val = val;
- pNew->pNext = NULL;
-
- p1->pNext = pNew;
- pNew->pNext = p2;
-
- return 0;
-
- }
-
- int Find(int val)
- {
- int i=0;
- PNODE pTemp = pHead;
- while(pTemp != NULL)
- {
- if(pTemp->val == val)
- {
- return i;
- }
- pTemp = pTemp->pNext;
- i++;
- }
- return -1;
- }
-
- void Travel()
- {
- PNODE pTemp = this->pHead;
-
- while(pTemp!=NULL)
- {
- cout<<pTemp->val<<" ";
- pTemp = pTemp->pNext;
- }
- cout<<endl;
- }
-
- int GetNodeCnt()
- {
- int cnt=0;
- PNODE pTemp = pHead;
-
- while(pTemp!=NULL)
- {
- cnt++;
- pTemp = pTemp->pNext;
- }
-
- return cnt;
- }
-
- void sort()
- {
- int n = this->GetNodeCnt();
- PNODE p1,p2;
-
- for(int i=0;i<n-1;i++)
- {
- p1 = pHead;
-
- for(int j=0;j<n-1-i;j++)
- {
- p2 = p1->pNext;
-
- if(p1->val < p2->val)
- {
- int k = p1->val;
- p1->val = p2->val;
- p2->val = k;
- }
-
- p1 = p1->pNext;
- }
- }
- }
- };
-
-
-
-
- void main()
- {
- MyList list;
-
- for(int i=0;i<10;i++)
- {
- list.Add(i);
- }
-
- list.Travel();
-
- list.sort();
-
- list.Travel();
-
- }
|