本文针对数据结构基础系列网络课程(2):线性表中第11课时单链表应用举例。
例:拆分单链表 (linklist.h是单链表“算法库”中的头文件,详情单击链接…)
#include <stdio.h>
#include <malloc.h>
#include "linklist.h"
void split(LinkList *&L,LinkList *&L1,LinkList *&L2)
{
LinkList *p=L->next,*q,*r1; //p指向第1个数据节点
L1=L; //L1利用原来L的头节点
r1=L1; //r1始终指向L1的尾节点
L2=(LinkList *)malloc(sizeof(LinkList)); //创建L2的头节点
L2->next=NULL; //置L2的指针域为NULL
while (p!=NULL)
{
r1->next=p; //采用尾插法将*p(data值为ai)插入L1中
r1=p;
p=p->next; //p移向下一个节点(data值为bi)
q=p->next; //由于头插法修改p的next域,故用q保存*p的后继节点
p->next=L2->next; //采用头插法将*p插入L2中
L2->next=p;
p=q; //p重新指向ai+1的节点
}
r1->next=NULL; //尾节点next置空
}
int main()
{
LinkList *L,*L1,*L2;
int i;
ElemType a[]= {1,2,3,4,5,6,7,8,9,10};
InitList(L);
InitList(L1);
InitList(L2);
for(i=9; i>=0; i--)
ListInsert(L, 1, a[i]);
printf("L:");
DispList(L);
printf("L->L1,L2\n");
split(L,L1,L2);
printf("L1:");
DispList(L1);
printf("L2:");
DispList(L2);
DestroyList(L1);
DestroyList(L2);
return 0;
}
例:删除元素最大的节点(linklist.h是单链表“算法库”中的头文件,详情单击链接…)
#include <stdio.h>
#include <malloc.h>
#include "linklist.h"
void delmaxnode(LinkList *&L)
{
LinkList *p=L->next,*pre=L,*maxp=p,*maxpre=pre;
while (p!=NULL) //用p扫描整个单链表,pre始终指向其前驱节点
{
if (maxp->data<p->data) //若找到一个更大的节点
{
maxp=p; //更改maxp
maxpre=pre; //更改maxpre
}
pre=p; //p、pre同步后移一个节点
p=p->next;
}
maxpre->next=maxp->next; //删除*maxp节点
free(maxp); //释放*maxp节点
}
int main()
{
LinkList *L;
int i;
ElemType a[]= {1,3,2,9,0,4,7,6,5,8};
InitList(L);
for(i=9; i>=0; i--)
ListInsert(L, 1, a[i]);
printf("L:");
DispList(L);
printf("删除最大值节点\n");
delmaxnode(L);
printf("L:");
DispList(L);
DestroyList(L);
return 0;
}
例:增序排列节点(linklist.h是单链表“算法库”中的头文件,详情单击链接…)
#include <stdio.h>
#include <malloc.h>
#include "linklist.h"
void sort(LinkList *&L)
{
LinkList *p,*pre,*q;
p=L->next->next; //p指向L的第2个数据节点
L->next->next=NULL; //构造只含一个数据节点的有序表
while (p!=NULL)
{
q=p->next; //q保存*p节点后继节点的指针
pre=L; //从有序表开头进行比较,pre指向插入*p的前驱节点
while (pre->next!=NULL && pre->next->data<p->data)
pre=pre->next; //在有序表中找插入*p的前驱节点*pre
p->next=pre->next; //将*pre之后插入*p
pre->next=p;
p=q; //扫描原单链表余下的节点
}
}
int main()
{
LinkList *L;
int i;
ElemType a[]= {1,3,2,9,0,4,7,6,5,8};
InitList(L);
for(i=9; i>=0; i--)
ListInsert(L, 1, a[i]);
printf("L:");
DispList(L);
printf("排序\n");
sort(L);
printf("L:");
DispList(L);
DestroyList(L);
return 0;
}