以下是常用链表的算法:
//创建一个链表
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;
}
}