c语言经典小函数.docx
- 文档编号:4307372
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:14
- 大小:17.76KB
c语言经典小函数.docx
《c语言经典小函数.docx》由会员分享,可在线阅读,更多相关《c语言经典小函数.docx(14页珍藏版)》请在冰豆网上搜索。
c语言经典小函数
1倒序输出
(1)单链表的倒序输出:
info*fv(info*head)
{
info*p=head->next,*q=head;
head->next=0;
while(p)
{
q=p;
p=p->next;
q->next=head;
head=q;
}
returnhead;
}
递归实现:
structinfo*Ptfv(structinfo*head,structinfo**p)
{
structinfo*s;
*p=head;
if(!
head->next)return(head);
s=Ptfv(head->next,p);
s->next=head;
return(head);
}
(注意最终返回的为最后一个节点的地址)
(2)循环链表的倒序输出
info*fv(info*head)
{
info*p=head->next,*q=head,*head0=head;
head->next=0;
while(p!
=head0)
{
q=p;
p=p->next;
q->next=head;
head=q;
}
p->next=head;
returnhead;
}
2链表的增序插入:
(1)单链表
答案1:
info*insert(info*s,info*head)
{
info*p=head,*q=head;
if(!
head)
{
head=s;
head->next=NULL;returns;
}
elseif(strcmp(s->num,head->num)<0)
{s->next=head;
head=s;
returnhead;
}
else
{
p=p->next;
while(p)
{
if(strcmp(s->num,p->num)<0)
{
q->next=s;
s->next=p;
returnhead;
}q=p;
p=p->next;
}
q->next=s;
s->next=NULL;
returnhead;
}
}
答案2:
Node*Insert(Node*head,Node*s)
{
Node*p=head,*q=NULL;//p用来遍历链表,q记住p的前续节点
while(p!
=NULL&&strcmp(p->num,s->num)<0){//寻找s应该插入的位置
q=p;
p=p->next;
}
if(q==NULL){//插在头结点前,也可以处理空链表的情况
s->next=p;
returns;
}
//插入节点
q->next=s;
s->next=p;
returnhead;
}
(2)循环链表
答案1:
info*insert(info*s,info*head)
{
info*p=head,*q=head;
if(!
head)
{
head=s;
s->next=head;
returnhead;
}
elseif(strcmp(s->num,head->num)<0)//作为头结点
{
info*search=head->next,*sea=head,*head0=head;
s->next=head;
head=s;
while(search!
=head0)//寻找最后一个节点
{
sea=search;
search=search->next;
}
sea->next=head;
}
else
{
p=p->next;
while(p!
=head)
{
if(strcmp(s->num,p->num)<0)
{
q->next=s;
s->next=p;
info*search=head->next,*sea=head,*head0=head;
while(search!
=head0)
{
sea=search;
search=search->next;
}
sea->next=head;
returnhead;
}
q=p;
p=p->next;
}
q->next=s;
s->next=head;
}
returnhead;
}
答案2:
Node*Insert(Node*head,Node*s)
{
Node*p=head,*q=NULL;//p用来遍历链表,q记住p的前续节点
if(p==NULL)returns;//空链表
if(strcmp(p->num,s->num)>=0){//插在头节点前
q=p;
while(q->next!
=head){//q指向尾节点
q=q->next;
}
//插入节点
q->next=s;
s->next=p;
returns;
}
q=p;
p=p->next;
while(p!
=head&&strcmp(p->num,s->num)<0){//寻找s应该插入的位置
q=p;
p=p->next;
}
//插入节点
q->next=s;
s->next=p;
returnhead;
}
3链表复制
单链表:
info*copy(info*head)
{
info*s=(info*)malloc(sizeof(info)),*head2=s,*q=s,*p=head;
while(p)
{
s=(info*)malloc(sizeof(info));
q->next=s;
q=s;
strcpy(q->num,p->num);
strcpy(q->name,p->name);
p=p->next;
}
q->next=NULL;
head2=head2->next;
returnhead2;
}
循环链表:
Node*Copy(Node*head)
{
Node*p=head,*head2=NULL,*q=NULL,*r=NULL;//p用来遍历原链表,head2是新链表头指针,q用来生成新链表,r记住q的前续节点
if(p==NULL)returnNULL;
//复制头节点
q=(Node*)malloc(sizeof(Node));
strcpy(q->name,p->name);
strcpy(q->num,p->num);
head2=q;
q->next=head2;
r=q;
p=p->next;
while(p!
=head){
//建立新节点并拷贝
q=(Node*)malloc(sizeof(Node));
strcpy(q->name,p->name);
strcpy(q->num,p->num);
r->next=q;
q->next=head2;
r=q;
p=p->next;
}
returnhead2;
}
4结点递归计数
(1)单链表
intRcounter(node*head,intm)
{
node*p=head;
if(!
p)
return0;
m=1+Rcounter(p->next,m);
returnm;
}
(2)循环链表
intRcounter(node*head,node*head0)
{
intm=1;
if(head==NULL)
return0;
node*p=head;
if(p->next==head0)
return1;
m=1+Rcounter(p->next,head0);
returnm;
}
6顺序存储结构的排序
#include
#include
#include
voiddirectselect(inta[],intn);
voidbubbleselect(inta[],intn);
intmain()
{
inta[21]={0,10,21,52,12,40,2,58,95,21,753,259,15,147,210,222,102,135,201,109,65};
intb[21],d[21];
for(inti=0;i<21;i++)
b[i]=d[i]=a[i];
directselect(b,20);
bubbleselect(d,20);
for(i=1;i<21;i++)
printf("%4d",a[i]);
printf("\n");
for(i=1;i<21;i++)
printf("%4d",b[i]);
printf("\n");
for(i=1;i<21;i++)
printf("%4d",d[i]);
printf("\n");
return0;
}
voiddirectselect(inta[],intn)//插入排序
{
for(inti=2;i { a[0]=a[i]; for(intj=i-1;j>0;j--) { if(a[0]>a[j]) break; a[j+1]=a[j]; } a[j+1]=a[0]; } } voidbubbleselect(inta[],intn)//冒泡排序 { intc;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 经典 函数