C数据结构之单链表详细示例分析
数据结构 分析 详细 示例 单链
2023-06-13 09:15:04 时间
#include<stdio.h>
#include<stdlib.h>
typedefstructtype
{
intnum;
structtype*next;
}TYPE;
//=============================================================
//语法格式:TYPE*init_link_head(intn)
//实现功能:从头到尾,正序创建一个具有n个节点的链表,并对其值进行初始化
//参数: n:链表的长度,即节点的个数
//返回值: 所创建链表的首地址
//=============================================================
TYPE*init_link_head(intn)
{
inti;
TYPE*phead=NULL,*pf=NULL,*pi=NULL;
for(i=0;i<n;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;
}
//=============================================================
//语法格式:TYPE*init_link_end(intn)
//实现功能:从尾到头,倒序创建一个具有n个节点的链表,并对其值进行初始化
//参数: n:链表的长度,即节点的个数
//返回值: 所创建链表的首地址
//=============================================================
TYPE*init_link_end(intn)
{
TYPE*phead=NULL,*pi=NULL;
inti;
for(i=0;i<n;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(TYPE*phead,TYPE*pi)
//实现功能:将新申请的节点加入到指定链表中
//参数: *phead:待插入链表
// *pi:带插入节点
//返回值: 插入指定节点后的新链表首址
//=============================================================
TYPE*insert_link(TYPE*phead,TYPE*pi)
{
TYPE*pb,*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(TYPE*phead,intnum)
//实现功能:删除给定序号所指向的节点
//参数: *phead:待删除链表
// num:所需删除的节点
//返回值: 删除指定节点后的新链表首址
//=============================================================
TYPE*delete_link(TYPE*phead,intnum)
{
TYPE*pf;
TYPE*pb;
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(TYPE*phead)
//实现功能:打印指定链表中的全部节点数据
//参数: *phead:待打印的链表首址
//返回值: 无
//=============================================================
voidprint_link(TYPE*phead)
{
TYPE*temp=phead;
while(temp!=NULL)
{
printf("%d",temp->num);
temp=temp->next;
}
}
//=============================================================
//语法格式:search_num(TYPE*phead,intnum)
//实现功能:在指定的链表中,按姓名查找指定元素
//参数: phead:待查找的链首址,num需要查找的字符串
//返回值: 无
//=============================================================
voidsearch_num(TYPE*phead,intnum)
{
TYPE*temp=phead;
while(temp!=NULL)
{
if(temp->num==num)
printf(" %d",num);
temp=temp->next;
}
if(temp==NULL)
printf("nodenotbeenfound\n");
}
//=============================================================
//语法格式:order_link(TYPE*phead)
//实现功能:采用冒泡法,对指定链表按序号进行排序(交换数据域)
//参数: phead:待排序的链首址
//返回值: 排好序的链表phead指针
//=============================================================
TYPE*order_link(TYPE*phead)
{
TYPE*pb,*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(TYPE*phead)
//实现功能:对给定链表按序号进行倒序排序
//参数: phead:待排序的链首址
//返回值: 排好序的链表phead指针
//=============================================================
TYPE*reverse_link(TYPE*phead)
{
TYPE*pb,*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(TYPE*phead)
//实现功能:释放链表中所有的节点
//参数: phead:待释放的链表首址
//返回值: 无
//=============================================================
voidfree_all(TYPE*phead)
{
TYPE*p;
while(phead!=NULL)
{
p=phead->next;
free(phead);
phead=p;
}
}
//=============================================================
//语法格式:merge(TYPE*p1,TYPE*p2)
//实现功能:对两个链表进行升序合并
//参数: p1,p2两个代合并的链表
//返回值: 合并后的链表
//=============================================================
TYPE*merge_link(TYPE*p1,TYPE*p2)
{
TYPE*p,*phead;
if(p1==NULL)
returnp2;
if(p2==NULL)
returnp1;
if(p1->num<p2->num)
{
phead=p=p1;
p1=p1->next;
}
else
{
phead=p=p2;
p2=p2->next;
}
while(p1!=NULL&&p2!=NULL)
{
if(p1->num<p2->num)
{
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(TYPE*p1,TYPE*p2)
//实现功能:对两个链表进行升序合并
//参数: p1,p2两个代合并的链表
//返回值: 合并后的链表
//=============================================================
TYPE*merge_link_self(TYPE*p1,TYPE*p2)
{
TYPE*phead=NULL;
if(p1==NULL)
returnp2;
if(p2==NULL)
returnp1;
if(p1->num<p2->num)
{
phead=p1;
phead->next=merge_link(p1->next,p2);
}
else
{
phead=p2;
phead->next=merge_link(p1,p2->next);
}
returnphead;
}
intmain(void)
{
return0;
}
相关文章
- 扁平数据结构转Tree树形结构
- 大型电商网站:第四章:业务功能与数据结构分析
- JS数据结构之哈希表(散列表)
- 查找--数据结构
- Go 数据结构和算法篇(九):二分查找
- 数据结构——栈
- 【Android 逆向】函数拦截 ( GOT 表数据结构分析 | 函数根据 GOT 表进行跳转的流程 )
- 【Linux 内核 内存管理】内存映射相关数据结构 ③ ( vm_area_struct 结构体成员分析 | shared 成员 | anon_vma_chain 成员 | anon_vma 成员 )
- 浅谈redis五大数据结构和使用场景
- 使用JavaScript的数组实现数据结构中的队列与堆栈详解编程语言
- [C语言] 数据结构-算法效率的度量方法-事前分析估算方法详解编程语言
- [C语言] 数据结构-离散存储链表定义详解编程语言
- Java数据结构和算法(十二)——2-3-4树详解编程语言
- MySQL导入:一步简化数据结构(mysql导入数据结构)
- 类型探索Redis中List数据结构的优势(redis中的list)
- Redis实现树形数据结构(redis树形)
- 形结构SQL Server查询树形数据结构的技巧分析(sqlserver查询树)
- C#数据结构与算法揭秘二