线性单链表的存储及基本操作(整理)
2015-06-01 10:56
465 查看
教科书:严奶奶的《数据结构(C语言版)》
参考代码:高一凡的《数据结构》算法实现和解析
/*****************线性链表的单链表存储结构***************
******************制作人:Guosam*************************
*****************时间:2015/5/20************************/
typedef struct LNode
{
Elemtype data;
LNode *next;
}LNode,*LinkList;
/*****************线性链表的基本操作*********************
******************制作人:Guosam*************************
*****************时间:2015/5/20************************/
void InitList(LinkList &L)
{
//建空表
L=(LinkList)malloc(sizeof(LNode));
if(!L)
exit(OVERFLOW);
L->next=NULL;
}
//销毁的时候,是先销毁了链表的头,然后接着一个一个的把后面的销毁了,这样这个链表就不能再使用了
//清空的时候,是先保留了链表的头,然后把头后面的所有的都销毁,最后把头里指向下一个的指针设为空,这样就相当与清空了,但这个链表还在,还可以继续使用
void DestroyList(LinkList &L)
{
//销毁线性表L
LinkList q;
while(L)
{
q=L->next;
free(L);
L=q;
}
}
void ClearList(LinkList L)
{
//清空表
LinkList p,q;
p=L->next;
while(p)
{
q=L->next;
free(p);
p=q;
}
L->next=NULL;
}
Status ListEmpty(LinkList L)
{
//判表空
if(L.length==0)
return FALSE;
else
return TRUE;
}
Status ListLength(LinkList L)
{
//取表长
int i=0;
LinkList p=L->next;
while(p)
{
i++;
p=p->next;
}
return i;
}
Status GetElem(LinkList L,int i,ElemType &e)
{
//读元素
int j=1;
LinkList p=L->next;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return ERROR;
e=p->data;
return e;
}
Status LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
{
//查找
int i=0;
LinkList p=L->next;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return ERROR;
e=p->data;
return e;
}
Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e)
{
//找前驱
LinkList q,p=L->next;
while(p->next)
{
q=p->next;
if(q->data==cur_e)
{
pre_e=p->data;
return pre_e;
}
p=q;
}
return INFEASIBLE;
}
Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e)
{
//找后继
LinkList q,p=L->next;
while(p->next)
{
q=p->next;
if(p->data==cur_e)
{
pre_e=q->data;
return pre_e;
}
p=q;
}
return INFEASIBLE;
}
Status LinkInsert(LinkList L,int i,ElemType e)
{
//插入
int j=0;
LinkList p=L,s;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
return ERROR;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
Status LinkDelete(LinkList L,int i, ElemType &e)
{
//删除
int j=0;
LinkList p=L,q;
while(p->next&&j<i-1)
{
p=p->next;
j++
}
if(!p->next||j>i-1)
return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return e;
}
void ListTraverse(LinkList L,void(*vi)(ElemType))
{
//遍历
LinkList p=L->next;
while(p)
{
vi(p->data);
p=p->next;
}
printf("\n");
}
参考代码:高一凡的《数据结构》算法实现和解析
/*****************线性链表的单链表存储结构***************
******************制作人:Guosam*************************
*****************时间:2015/5/20************************/
typedef struct LNode
{
Elemtype data;
LNode *next;
}LNode,*LinkList;
/*****************线性链表的基本操作*********************
******************制作人:Guosam*************************
*****************时间:2015/5/20************************/
void InitList(LinkList &L)
{
//建空表
L=(LinkList)malloc(sizeof(LNode));
if(!L)
exit(OVERFLOW);
L->next=NULL;
}
//销毁的时候,是先销毁了链表的头,然后接着一个一个的把后面的销毁了,这样这个链表就不能再使用了
//清空的时候,是先保留了链表的头,然后把头后面的所有的都销毁,最后把头里指向下一个的指针设为空,这样就相当与清空了,但这个链表还在,还可以继续使用
void DestroyList(LinkList &L)
{
//销毁线性表L
LinkList q;
while(L)
{
q=L->next;
free(L);
L=q;
}
}
void ClearList(LinkList L)
{
//清空表
LinkList p,q;
p=L->next;
while(p)
{
q=L->next;
free(p);
p=q;
}
L->next=NULL;
}
Status ListEmpty(LinkList L)
{
//判表空
if(L.length==0)
return FALSE;
else
return TRUE;
}
Status ListLength(LinkList L)
{
//取表长
int i=0;
LinkList p=L->next;
while(p)
{
i++;
p=p->next;
}
return i;
}
Status GetElem(LinkList L,int i,ElemType &e)
{
//读元素
int j=1;
LinkList p=L->next;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return ERROR;
e=p->data;
return e;
}
Status LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
{
//查找
int i=0;
LinkList p=L->next;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return ERROR;
e=p->data;
return e;
}
Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e)
{
//找前驱
LinkList q,p=L->next;
while(p->next)
{
q=p->next;
if(q->data==cur_e)
{
pre_e=p->data;
return pre_e;
}
p=q;
}
return INFEASIBLE;
}
Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e)
{
//找后继
LinkList q,p=L->next;
while(p->next)
{
q=p->next;
if(p->data==cur_e)
{
pre_e=q->data;
return pre_e;
}
p=q;
}
return INFEASIBLE;
}
Status LinkInsert(LinkList L,int i,ElemType e)
{
//插入
int j=0;
LinkList p=L,s;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
return ERROR;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
Status LinkDelete(LinkList L,int i, ElemType &e)
{
//删除
int j=0;
LinkList p=L,q;
while(p->next&&j<i-1)
{
p=p->next;
j++
}
if(!p->next||j>i-1)
return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return e;
}
void ListTraverse(LinkList L,void(*vi)(ElemType))
{
//遍历
LinkList p=L->next;
while(p)
{
vi(p->data);
p=p->next;
}
printf("\n");
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua和C语言的交互详解
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(七):数据结构详解
- Lua教程(二):C++和Lua相互传递数据示例
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- C#定义并实现单链表实例解析
- C++联合体转换成C#结构的实现方法
- C# Pointer指针应用实例简述
- 关于C语言中参数的传值问题
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C++编写简单的打靶游戏
- C语言内存对齐实例详解
- C++变位词问题分析