用C语言实现单链表的各种操作(一)
C语言 实现 操作 各种 单链
2023-06-13 09:15:00 时间
最近,从新复习了一下数据结构中比较重要的几个部分,现在把自己的成果记录下来,主要就是仿照严蔚敏的《数据结构》(C语言版),中的例子和后面的习题进行改编的。首先,是单链表的各种实现,其中,包含了一些常考的知识点。例如,单链表的逆置,单链表的合并,找到单链表的中间节点等的算法实现。
下面这个是单链表的结构体的定义:
复制代码代码如下:
下面这个是单链表的结构体的定义:
typedefstructLNode
{
ElemTypedata;
structLNode*next;
}LinkList;
下面的基本的单链表的操作:其中,有一些宏,没有给出他们的一些定义,者可以通过,严蔚敏的《数据结构》(C语言版),查看得到。
/*功能:构建一个空的带头节点的单链表*/
StatusInitList(structLNode**L)
{
(*L)=(structLNode*)malloc(sizeof(structLNode));//产生头节点
if(!*L)
exit(OVERFLOW);
(*L)->next=NULL;
returnOK;
}
/*销毁线性表*/
StatusDestroyList(structLNode*L)
{
structLNode*q;
while(L)
{
q=L->next;
free(L);
L=q;
}
returnOK;
}
/*将L重置为空表*/
StatusClearList(structLNode*L)
{
LinkList*p,*q;
p=L->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;
returnOK;
}
/*判断链表是否为空表*/
StatusListEmpty(LinkList*L)
{
if(L->next)
{
returnFALSE;
}
else
{
returnTRUE;
}
}
/*返回单链表中元素的个数*/
intListLength(structLNode*L)
{
inti=0;
LinkList*p=L->next;
while(p)
{
i++;
p=p->next;
}
returni;
}
/*L为带头节点的单链表的头指针,当第i个元素存在时,其值赋给e,并返回OK*/
StatusGetElem(structLNode*L,inti,ElemType*e)
{
intj=1;
LinkList*p=L->next;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
returnERROR;
*e=p->data;
returnOK;
}
/*返回L中第一个与e满足关系compare()的数据元素的位序,
若给存在返回值为0,compare()是数据元素的判定函数*/
intLocateElem(structLNode*L,ElemTypee,Status(*compare)(ElemType,ElemType))
{
inti=0;
LinkList*p=L->next;
while(p)
{
i++;
if(compare(p->data,e))
returni;
p=p->next;
}
return0;
}
/*所cur_e是L中的数据元素,且给就第一个,则用pre_e返回它的前驱*/
StatusPriorElem(structLNode*L,ElemTypecur_e,ElemType*pre_e)
{
LinkList*q,*p=L->next;
while(p->next)
{
q=p->next;//q指向p的后继
if(q->data==cur_e)
{
*pre_e=p->data;
returnOK;
}
p=q;
}
returnINFEASIBLE;
}
/*若cur_e是L中的数据元素,且不是最后一个,则用next_e返回它的后继*/
StatusNextElem(structLNode*L,ElemTypecur_e,ElemType*next_e)
{
LinkList*p;
p=L->next;
while(p->next)
{
if(p->data==cur_e)
{
*next_e=p->next->data;
returnOK;
}
p=p->next;
}
returnINFEASIBLE;
}
/*在带头节点的单链表L中的第i个位置之前插入元素e*/
StatusListInsert(structLNode*L,inti,ElemTypee)
{
intj=0;
structLNode*p=L,*s=NULL;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
returnERROR;
s=(structLNode*)malloc(sizeof(structLNode));
if(!s)
printf("mallocerror~\n");
//p->next=s;
s->data=e;
//p->next=s;
s->next=p->next;
p->next=s;
//s->next=NULL;
//p=s;
returnOK;
}
/*在带头节点的单链表中删除第i个元素,并有e返回其值*/
StatusListDelete(LinkList*L,inti,ElemType*e)
{
LinkList*p=L,*q;
intj=0;
while(p->next&&j<i-1)
{
p=p->next;
j++;
}
if(!p->next||j>i-1)
returnERROR;
q=p->next;
p->next=q->next;
*e=q->data;
free(q);
returnOK;
}
/*依次对L的每个元素调用vi(),打印输出语句*/
StatusListTraverse(structLNode*L,void(*vi)(ElemType))
{
LinkList*p=L->next;
while(p)
{
vi(p->data);
p=p->next;
}
printf("\n");
returnOK;
}
相关文章
- 银行家算法 C语言实现 带注释
- 数据结构之循环队列C语言实现(详细)[通俗易懂]
- Linux下C语言实现简单的套接字编程
- 八大排序算法(C语言实现)
- 【蓝桥OJ——C语言】顺子日期、特殊时间、乘积尾零
- C语言除法算法和取模运算的实现(多种算法,多种思路)
- _Generic关键字及其语法和应用(C11标准),C语言_Generic详解
- Linux环境下C语言编程入门指南(linux编程c语言)
- 基于Redis的C语言连接池实现(redisc连接池)
- 在Linux下快速掌握C语言开发的技巧(linux下的c开发)
- MySQL中C语言实现事务执行(c 事务执行mysql)
- C语言添加MySQL数据库实现数据操作(c 中添加mysql)
- MySQL日志清理的C语言实现(c mysql清理日志)
- MySQL代理C语言实现快速稳定的数据库连接(c mysql代理)
- 数据C语言操作Oracle实现数据插入(c 连接oracle插入)
- 使用C语言操作Oracle字符串联接实现(c 连oracle字符串)
- C语言调用Oracle实现数据插入(c 调用oracle插入)
- 库C语言程序从Oracle数据库取数据的实现(c 获取oracle数据)
- C语言操作Oracle数据库的游标实现(c 执行oracle游标)
- 库C语言使用Oracle链接类库实现数据库操作(c oracle链接类)
- C语言与Oracle语法 实现编程开发无缝连接(c oracle语法)
- C语言实现N阶乘的程序代码
- C语言调试手段:锁定错误的实现方法
- C语言借助EasyX实现的生命游戏源码