单链表的三个例子
/*
有一个带头结点的单链表L=(a1,b1,a2,b2.......an,bn),
设计一个算法将L拆成两个带头结点的单链表L1,L2,分别
使用头插法和尾插发
*/
void split(LinkNode*& L, LinkNode*& L1, LinkNode*& L2)
{
LinkNode* p = L->next, * q, * r1; //p指向第一个数据节点
L1 = L; //L1利用原来L的头结点
r1 = L1; //r1始终指向L1尾结点
L2 = (LinkNode*)malloc(sizeof(LinkNode));//创建L2头结点
L2->next = NULL; //置L2指针域为NULL
while (p != NULL)
{
r1->next = p; //采用尾插法将p插入L1中
r1 = p;
p = p->next; //p移动到下一个节点
q = p->next; //用q保存p的后继节点
p->next = L2->next; //采用头插法将节点p插入L2中
L2->next = p;
p = q; //p重新指向ai+1节点
}
r1->next = NULL; //尾结点NEXT置空
}
/*
设计一个算法,删除一个单链表L中元素值最大的结点
*/
void delmaxnode(LinkNode*& L)
{
LinkNode* p = L->next, * pre = L, * maxp = p, * maxpre = pre;
while (p != NULL)
{
if (maxp->date < p->date)
{
maxp = p;
maxpre = pre;
}
pre = p;
p = p->next;
}
maxpre->next = maxp->next;
free(maxp);
}
/*
有一个带头结点的单链表L,设计一个算法使其元素有序递增
*/
void sort(LinkNode*& L)
{
LinkNode* p, * pre, * q;
p = L->next->next;//p指向L第二个数据结点
L->next->next = NULL;
while (p!=NULL)
{
q = p->next;
pre = L;
while (pre->next!=NULL)
pre = pre->next;
p->next = pre->next;
pre->next = p;
p = q;
}
}