1、有一个带头结点的单链表L=(a1,b1,a2,b2,a3,b3…an,bn),设计一个算法将其拆分为两个带头结点的单链表L1和L2,其中L1=(a1,a2,a3,a4…an),L2=(bn,…b3,b2,b1),要求L1使用L的头节点。
解:利用原单链表L中的所有结点通过改变指针域重组成两个单链表L1和L2。由于L1中结点的相对顺序与L中的相同,所以采用尾插法建立单链表L1;由于L2中结点的相对顺序与L中的相反,所以采用头插法建立单链表L2。代码如下:
void split(LinkNode * &L,LinkNode * &L1,LinkNode * &L2)
{
LinkNode *p=L->next,*q,*rl; //p指向第一个数据结点
L1=L;
rl=L1; //rl始终指向L1的尾结点
L2=(LinkNode *)malloc(sizeof(LinkNode)); //创建L2的头结点
L2->next=NULL;
while(p!=NULL)
{
rl->next=p; //采用尾插法将p插入到L1中
rl=p;
p=p->next;
q=p->next;
p->next=L2->next; //采用头插法将结点p插入L2中
L2->next=p;
p=q; //重定位
}
rl->next=NULL;
}
2、设计一个算法,删除一个单链表L中元素值最大的结点(假设这样的结点唯一)。
解:在单链表中删除一个结点先要找到它的前驱结点,用指针p扫描整个单链表,pre指向结点p的前驱结点,再扫描时用maxp指向data域值最大的结点,maxpre指向maxp所指结点的前驱结点。当单链表扫描完毕后,通过maxpre所指的结点删除其后的结点,即删除了结点值最大的结点。算法如下:
void delmaxnode(LinkNode * &L)
{
LinkNode *p=L->next,*pre=L,*maxp=p,*maxpre=pre;
while(p!=NULL)
{
if(maxp->data<p->data)
{
maxp=p;
maxpre=pre;
}
pre=p;
p=p->next;
}
maxpre->next=maxp->next;
free(maxp);
594

被折叠的 条评论
为什么被折叠?



