单链表的存储结构及其基本操作的实现
来源:互联网 发布:网络信息部绩效考核 编辑:程序博客网 时间:2024/06/07 07:08
主要操作代码:
/* Name: linklist.h Copyright: Author: Date: 21-03-05 20:21 Description: */#ifndef LINKLIST_H_INCLUDED#define LINKLIST_H_INCLUDED#include "ds.h" //for Status,OK ...#ifndef ElemType#define ElemType int /* 数据元素类型默认为 int */#define ELEMTYPE_TAG#endif/*********************************************************** 单链表的存储结构定义 ***********************************************************/typedef struct LNode { ElemType data; struct LNode *next;} LNode, *LinkList;/*********************************************************** 单链表的基本操作声明***********************************************************///创建并初始化为空表 Status InitList(LinkList &L);//销毁整个表(从此之后不再可用) Status DestroyList(LinkList &L);//将表L置空 Status ClearList(LinkList &L);//判断表L是否为空表 bool ListEmpty(LinkList L);//求表L的长度 int ListLength(LinkList L);//取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR Status GetElem(LinkList L, int i, ElemType &e);template <typename T> bool equal(T a, T b){ return a==b;}//在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0 // compare(a,b) 为比较函数,匹配时返回true,否则返回false // 这里默认使用equal进行比较 int LocateElem(LinkList L, ElemType e, bool (*compare)(ElemType,ElemType)=equal<ElemType>);//在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERRORStatus ListInsert(LinkList &L, int i, ElemType e);//删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR Status ListDelete(LinkList &L, int i, ElemType &e);//遍历表L,对每个元素调用visit(x). Status ListTraverse(LinkList L, Status (*visit)(ElemType));/*********************************************************** 单链表的基本操作的实现***********************************************************///创建并初始化为空表 Status InitList(LinkList &L){ // TODO (#1#): 创建空表 L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; return OK; //-------------------------------------}//销毁整个表(从此之后不再可用) Status DestroyList(LinkList &L){ // TODO (#1#): 销毁表 L->next=NULL; return ERROR; //-------------------------------------}//将表L置空 Status ClearList(LinkList &L){ LinkList p; // TODO (#1#): 清空表 while(L->next){ p=L->next; L->next=p->next; free(p); } return OK; //-------------------------------------}//判断表L是否为空表 bool ListEmpty(LinkList L){ // TODO (#1#): 链表判空 if(L->next==NULL){ return true; } else{ return false; } //-------------------------------------}//求表L的长度 int ListLength(LinkList L){ // TODO (#1#): 链表求长度 //带头结点 int i=1;//计数器 LinkList p; p=L->next; while(p->next){ i++; p=p->next; } return i; //-------------------------------------}//取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR Status GetElem(LinkList L, int i, ElemType &e){ // TODO (#1#): 实现取元素GetElem(L,i,&e) //带头节点的链表 LinkList p; p=L->next; int j=1; while(p&&j<i){ p=p->next; j++; } if(j>i||!p){ return ERROR; } e=p->data; return OK; //-------------------------------------}//在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0 // compare(a,b) 为比较函数,匹配时返回true,否则返回false int LocateElem(LinkList L, ElemType e, bool (*compare)(ElemType,ElemType)){ // TODO (#1#): 在表中定位元素e,用compare(a,b)匹配元素 LinkList p; int j; p = L->next; j = 1; while(p!=NULL) { if(compare(p->data,e)) return j; p=p->next; j++; } return 0; //-------------------------------------}//在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERRORStatus ListInsert(LinkList &L, int i, ElemType e){ // TODO (#1#): 在链表中插入元素 LinkList p,s; p=L; int j=0; 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; //-------------------------------------}//删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR Status ListDelete(LinkList &L, int i, ElemType &e){ // TODO (#1#): 在链表中删除元素 LinkList p,q; p=L; int j=0; 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 OK; //-------------------------------------}//遍历表L,对每个元素调用visit(x). Status ListTraverse(LinkList L, Status (*visit)(ElemType)){ LinkList p = L->next; while ( p ) { if ( visit(p->data)==ERROR ) return ERROR; p = p->next; } return OK;}#ifdef ELEMTYPE_TAG#undef ElemType#undef ELEMTYPE_TAG#endif#endif // LINKLIST_H_INCLUDED
运行结果演示
全代码下载:https://pan.baidu.com/s/1nvIDhbV
阅读全文
0 0
- 单链表的存储结构及其基本操作的实现
- 单链表的存储结构及其基本操作
- 栈的链式存储结构及其基本运算的实现
- 队列的顺序存储结构及其基本运算的实现
- 栈的链式存储结构及其基本运算的实现
- 栈的链式存储结构及其基本运算的实现
- 队列的顺序存储结构及其基本运算的实现
- 栈的顺序存储结构及其基本运算实现
- 栈的链式存储结构及其基本运算实现
- 栈的顺序存储结构及其基本运算实现
- 栈的顺序存储结构及其基本运算实现
- 栈的链式存储结构及其基本运算实现
- 二叉堆的实现及其基本存储结构
- 图的邻接矩阵存储结构基本操作的实现
- 栈的顺序存储及其基本操作
- 队列的顺序存储及其基本操作
- 第7周实践项目2 队列的链式存储结构及其基本运算的实现
- 单链表基本操作的C语言实现(链式存储结构)
- 同时替换相同变量的名字
- Node.js中的fs.rename();剪切、复制文件;
- oracle 11.2.0.4 rac for rhel 6.8 installation
- 二叉树中和为某一值的路径
- Python的第二天
- 单链表的存储结构及其基本操作的实现
- linux设备驱动分类总结 1
- JAVA—sleep()和wait()的区别
- 干货链接
- 在虚拟机下安装CentOS7
- 第七章 快速排序
- 平时自己项目中用到的 CSS
- Android中的windowSoftInputMode属性详解
- TCP 与 UDP 的区别及应用场景