以下是常用链表的算法: #include <stdio.h> #include <vector> #include <cassert> using std::vector; typedef struct _node { int value; _node* pNext; _node(int va):value(va),pNext(0){} }NODE,*PNODE; //创建一个链表 void CreateList(PNODE& pList); //释放链表的内存 void DeleteList(PNODE pList); //输出链表 void OutPut(PNODE pList); //链表逆序 void ConvertList(PNODE& pList); //判断是否为循环链表 bool IsCircle(PNODE pList); //打印出倒数第K个节点的值 void PrintNode(PNODE pList ,int k); //链表排序 void SortNode(PNODE pList); //合并两个链表 PNODE Merge(PNODE list1,PNODE list2); //删除指定位置的的元素 void Delete(PNODE* pList,int iDel); //在指定位置插入元素 void Insert(PNODE* pList,int iInsert,int nVal); int main() { PNODE pHead = NULL; CreateList(pHead); OutPut(pHead); //ConvertList(pHead); //OutPut(pHead); //if (IsCircle(pHead)) // printf("have a circle/n"); //else // printf("have no a circle/n"); //PrintNode(pHead,9); SortNode(pHead); OutPut(pHead); DeleteList(pHead); return 0; }; void CreateList(PNODE& pList) { printf("end to -1/n"); int value; scanf("%d",&value); while(value != -1) { PNODE p = new NODE(value); p->pNext = pList; pList = p; scanf("%d",&value); } } void DeleteList(PNODE pList) { PNODE p = pList; PNODE pTemp; while (p!=NULL) { pTemp = p; p=p->pNext; delete pTemp; } } void OutPut(PNODE pList) { PNODE p = pList; while(p!=NULL) { printf("%d ",p->value); p=p->pNext; } printf("/n"); } void ConvertList(PNODE& pList) { PNODE pre,next,now; now = pList; pre = NULL; while (now!=NULL) { next = now->pNext; now->pNext = pre; pre = now; now = next; } pList = pre; } bool IsCircle(PNODE pList) { if (pList == NULL) return false; PNODE p1,p2; p1 = pList; p2 = pList->pNext; while (p2 != NULL && p2->pNext != NULL) { p1 = p1->pNext; p2 = p2->pNext->pNext; if (p1 == p2) return true; } return false; } void PrintNode(PNODE pList ,int k) { vector<PNODE> vecSave; int total = 0; PNODE pHead = pList; while(pHead != NULL) { if (total%3==0) vecSave.push_back(pHead); ++total; pHead = pHead->pNext; } int pos = total - k; int index = pos/3; int y = pos%3; PNODE pSearchList = vecSave[index]; for (int i = 0;i<y;i++) pSearchList = pSearchList->pNext; printf("%d/n",pSearchList->value); } void SortNode(PNODE pList) { PNODE pHead = pList; for (;pHead->pNext!=NULL;pHead = pHead->pNext) { PNODE p = pHead->pNext; while(p!=NULL) { if (p->value > pHead->value) { int temp = p->value; p->value = pHead->value; pHead->value = temp; } p = p->pNext; } } } //要有序 PNODE Merge(PNODE list1,PNODE list2) { //先排序 SortNode(list1); OutPut(list1); SortNode(list2); OutPut(list2); PNODE pa,pb,p,q,head; pa = list1; pb = list2; head = p = q = NULL; while(pa != NULL && pb != NULL) { if(pa->value > pb->value) { p = pa; pa = pa->pNext; } else { p = pb; pb = pb->pNext; } p->pNext = head; head = p; } if(pa != NULL) q = pa; else q = pb; while(q != NULL) { p = q; q = q->pNext; p->pNext = head; head = p; } return head; } void Delete(PNODE* pList,int iDel) { assert(pList != NULL); assert(iDel > 0); PNODE pHead = *pList; PNODE pDel; //特殊情况 if(iDel == 1) { pDel = pHead; pHead = pHead->pNext; *pList = pHead; delete pDel; return ; } //一般情况,移动到iDel-1的位置 for(int i = 2;i<iDel && pHead->pNext;i++) pHead = pHead->pNext; if(pHead->pNext != NULL) { PNODE pDel = pHead->pNext; pHead->pNext = pHead->pNext->pNext; delete pDel; } } void Insert(PNODE* pList,int iInsert,int nVal) { assert(*pList != NULL); assert(iInsert > 0); PNODE pHead = *pList; PNODE pNew= new NODE(nVal); //特殊情况 if(iInsert == 1) { pNew->pNext = pHead; pHead = pNew; *pList = pHead; return; } for(int i = 2;2 < iInsert && pHead->pNext ;i++) pHead = pHead->pNext; if(pHead->pNext != NULL) { pNew->pNext = pHead->pNext; pHead->pNext = pNew; } else { pHead ->pNext = pNew; pNew->pNext = NULL; } }