C数据结构之单链表详细示例分析
以下是对C语言中的单链表进行了详细的分析介绍,需要的朋友可以过来参考下
复制代码代码如下:
#include
#include
typedefstructtype
{
intnum;
structtypenext;
}TYPE;
//=============================================================
//语法格式:TYPEinit_link_head(intn)
//实现功能:从头到尾,正序创建一个具有n个节点的链表,并对其值进行初始化
//参数:n:链表的长度,即节点的个数
//返回值:所创建链表的首地址
//=============================================================
TYPEinit_link_head(intn)
{
inti;
TYPEphead=NULL,pf=NULL,pi=NULL;
for(i=0;i {
pi=(TYPE)malloc(sizeof(TYPE));
printf("pleaseinoutnum:\n");
scanf("%d",&pi->num);
if(i==0)
pf=phead=pi;
else
{
pf->next=pi;
pf=pi;
}
pi->next=NULL;
}
returnphead;
}
//=============================================================
//语法格式:TYPEinit_link_end(intn)
//实现功能:从尾到头,倒序创建一个具有n个节点的链表,并对其值进行初始化
//参数:n:链表的长度,即节点的个数
//返回值:所创建链表的首地址
//=============================================================
TYPEinit_link_end(intn)
{
TYPEphead=NULL,pi=NULL;
inti;
for(i=0;i {
pi=(TYPE)malloc(sizeof(TYPE));
printf("pleaseinoutnum:\n");
scanf("%d",&pi->num);
if(i==0)
pi->next=NULL;
else
pi->next=phead;
phead=pi;
}
returnphead;
}
//=============================================================
//语法格式:insert_link(TYPEphead,TYPEpi)
//实现功能:将新申请的节点加入到指定链表中
//参数:phead:待插入链表
//pi:带插入节点
//返回值:插入指定节点后的新链表首址
//=============================================================
TYPEinsert_link(TYPEphead,TYPEpi)
{
TYPEpb,pf;
pb=phead;
if(phead==NULL)
{
phead=pi;
phead->next=NULL;
}
else
{
while((pi->num>pb->num)&&(pb->next!=NULL))
{
pf=pb;
pb=pb->next;
}
if(pi->num<=pb->num)
{
if(pb==phead)
{
pi->next=phead;
phead=pi;
}
else
{
pf->next=pi;
pi->next=pb;
}
}
else
{
pi->next=NULL;
pb->next=pi;
}
}
returnphead;
}
//=============================================================
//语法格式:delete_link(TYPEphead,intnum)
//实现功能:删除给定序号所指向的节点
//参数:phead:待删除链表
//num:所需删除的节点
//返回值:删除指定节点后的新链表首址
//=============================================================
TYPEdelete_link(TYPEphead,intnum)
{
TYPEpf;
TYPEpb;
if(phead==NULL)
{
printf("\nemptylink\n");
returnNULL;
}
pb=phead;
while((pb->num!=num)&&pb->next!=NULL)
{
pf=pb;
pb=pb->next;
}
if(pb->num==num)
{
if(pb==phead)
phead=phead->next;
else
pf->next=pb->next;
free(pb);
printf("thenodeisdeleted\n");
}
else
printf("thenodenotfound\n");
returnphead;
}
//=============================================================
//语法格式:print_link(TYPEphead)
//实现功能:打印指定链表中的全部节点数据
//参数:phead:待打印的链表首址
//返回值:无
//=============================================================
voidprint_link(TYPEphead)
{
TYPEtemp=phead;
while(temp!=NULL)
{
printf("%d",temp->num);
temp=temp->next;
}
}
//=============================================================
//语法格式:search_num(TYPEphead,intnum)
//实现功能:在指定的链表中,按姓名查找指定元素
//参数:phead:待查找的链首址,num需要查找的字符串
//返回值:无
//=============================================================
voidsearch_num(TYPEphead,intnum)
{
TYPEtemp=phead;
while(temp!=NULL)
{
if(temp->num==num)
printf("%d",num);
temp=temp->next;
}
if(temp==NULL)
printf("nodenotwww.visa158.combeenfound\n");
}
//=============================================================
//语法格式:order_link(TYPEphead)
//实现功能:采用冒泡法,对指定链表按序号进行排序(交换数据域)
//参数:phead:待排序的链首址
//返回值:排好序的链表phead指针
//=============================================================
TYPEorder_link(TYPEphead)
{
TYPEpb,pf,temp;
pb=pf=phead;
if(phead==NULL)
returnNULL;
while(pb->next!=NULL)
{
pf=pb->next;
while(pf!=NULL)
{
if(pb->num>pf->num)
{
temp=pb;
pb=pf;
pf=temp;
temp.next=pb->next;
pb->next=pf->next;
pf->next=temp.next;
}
pf=pf->next;
}
pb=pb->next;
}
returnphead;
}
//=============================================================
//语法格式:reverse_link(TYPEphead)
//实现功能:对给定链表按序号进行倒序排序
//参数:phead:待排序的链首址
//返回值:排好序的链表phead指针
//=============================================================
TYPEreverse_link(TYPEphead)
{
TYPEpb,pf,temp;
pb=phead;
pf=pb->next;
while(pf!=NULL)
{
temp=pf->next;
pf->next=pb;
pb=pf;
pf=temp;
}
phead->next=NULL;
phead=pb;
returnphead;
}
//=============================================================
//语法格式:free_all(TYPEphead)
//实现功能:释放链表中所有的节点
//参数:phead:待释放的链表首址
//返回值:无
//=============================================================
voidfree_all(TYPEphead)
{
TYPEp;
while(phead!=NULL)
{
p=phead->next;
free(phead);
phead=p;
}
}
//=============================================================
//语法格式:merge(TYPEp1,TYPEp2)
//实现功能:对两个链表进行升序合并
//参数:p1,p2两个代合并的链表
//返回值:合并后的链表
//=============================================================
TYPEmerge_www.hunanwang.net_link(TYPEp1,TYPEp2)
{
TYPEp,phead;
if(p1==NULL)
returnp2;
if(p2==NULL)
returnp1;
if(p1->numnum)
{
phead=p=p1;
p1=p1->next;
}
else
{
phead=p=p2;
p2=p2->next;
}
while(p1!=NULL&&p2!=NULL)
{
if(p1->numnum)
{
p->next=p1;
p=p1;
p1=p1->next;
}
else
{
p->next=p2;
p=p2;
p2=p2->next;
}
}
if(p1!=NULL)
p->next=p1;
else
p->next=p2;
returnphead;
}
//=============================================================
//实现方法:运用递归
//语法格式:merge(TYPEp1,TYPEp2)
//实现功能:对两个链表进行升序合并
//参数:p1,p2两个代合并的链表
//返回值:合并后的链表
//=============================================================
TYPEmerge_link_self(TYPEp1,TYPEp2)
{
TYPEphead=NULL;
if(p1==NULL)
returnp2;
if(p2==NULL)
returnp1;
if(p1->numnum)
{
phead=p1;
phead->next=merge_link(p1->next,p2);
}
else
{
phead=p2;
phead->next=merge_link(p1,p2->next);
}
returnphead;
}
intmain(void)
{
return0;
}
|
|