博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构之自建算法库——循环单链表
阅读量:6341 次
发布时间:2019-06-22

本文共 4554 字,大约阅读时间需要 15 分钟。

本文针对中第13课时。

按照“0207将算法变程序”[]部分建议的方法,建设自己的专业基础设施算法库。

双链表算法库算法库采用程序的多文件组织形式,包括两个文件:

  
  1.头文件:clinklist.h,包含定义双链表数据结构的代码、宏定义、要实现算法的函数的声明;

#ifndef CLINKLIST_H_INCLUDED#define CLINKLIST_H_INCLUDED//循环单链表基本运算函数typedef int ElemType;typedef struct LNode        //定义单链表结点类型{    ElemType data;    struct LNode *next;} CLinkList;void CreateListF(CLinkList *&L,ElemType a[],int n);//头插法建立循环单链表void CreateListR(CLinkList *&L,ElemType a[],int n);//尾插法建立循环单链表void InitList(CLinkList *&L); //初始化链表void DestroyList(CLinkList *&L); //销毁链表bool ListEmpty(CLinkList *L);  //判断链表是否为空int ListLength(CLinkList *L);  //求链表长度void DispList(CLinkList *L);  //输出链表bool GetElem(CLinkList *L,int i,ElemType &e);  //取链表元素int LocateElem(CLinkList *L,ElemType e);  //查找元素bool ListInsert(CLinkList *&L,int i,ElemType e);  //插入节点bool ListDelete(CLinkList *&L,int i,ElemType &e);   //删除节点#endif // CLINKLIST_H_INCLUDED

  2.源文件:clinklist.cpp,包含实现各种算法的函数的定义

//循环单链表基本运算函数#include 
#include
#include "clinklist.h"void CreateListF(CLinkList *&L,ElemType a[],int n)//头插法建立循环单链表{ CLinkList *s; int i; L=(CLinkList *)malloc(sizeof(CLinkList)); //创建头结点 L->next=NULL; for (i=0; i
data=a[i]; s->next=L->next; //将*s插在原开始结点之前,头结点之后 L->next=s; } s=L->next; while (s->next!=NULL) //查找尾结点,由s指向它 s=s->next; s->next=L; //尾结点next域指向头结点}void CreateListR(CLinkList *&L,ElemType a[],int n)//尾插法建立循环单链表{ CLinkList *s,*r; int i; L=(CLinkList *)malloc(sizeof(CLinkList)); //创建头结点 L->next=NULL; r=L; //r始终指向终端结点,开始时指向头结点 for (i=0; i
data=a[i]; r->next=s; //将*s插入*r之后 r=s; } r->next=L; //尾结点next域指向头结点}void InitList(CLinkList *&L) //初始化链表{ L=(CLinkList *)malloc(sizeof(CLinkList)); //创建头结点 L->next=L;}void DestroyList(CLinkList *&L) //销毁链表{ CLinkList *p=L,*q=p->next; while (q!=L) { free(p); p=q; q=p->next; } free(p);}bool ListEmpty(CLinkList *L) //判断链表是否为空{ return(L->next==L);}int ListLength(CLinkList *L) //求链表长度{ CLinkList *p=L; int i=0; while (p->next!=L) { i++; p=p->next; } return(i);}void DispList(CLinkList *L) //输出链表{ CLinkList *p=L->next; while (p!=L) { printf("%d ",p->data); p=p->next; } printf("\n");}bool GetElem(CLinkList *L,int i,ElemType &e) //取链表元素{ int j=0; CLinkList *p; if (L->next!=L) //单链表不为空表时 { if (i==1) { e=L->next->data; return true; } else //i不为1时 { p=L->next; while (j
next; } if (p==L) return false; else { e=p->data; return true; } } } else //单链表为空表时 return false;}int LocateElem(CLinkList *L,ElemType e) //查找元素{ CLinkList *p=L->next; int n=1; while (p!=L && p->data!=e) { p=p->next; n++; } if (p==L) return(0); else return(n);}bool ListInsert(CLinkList *&L,int i,ElemType e) //插入节点{ int j=0; CLinkList *p=L,*s; if (p->next==L || i==1) //原单链表为空表或i==1时 { s=(CLinkList *)malloc(sizeof(CLinkList)); //创建新结点*s s->data=e; s->next=p->next; //将*s插入到*p之后 p->next=s; return true; } else { p=L->next; while (j
next; } if (p==L) //未找到第i-1个结点 return false; else //找到第i-1个结点*p { s=(CLinkList *)malloc(sizeof(CLinkList)); //创建新结点*s s->data=e; s->next=p->next; //将*s插入到*p之后 p->next=s; return true; } }}bool ListDelete(CLinkList *&L,int i,ElemType &e) //删除节点{ int j=0; CLinkList *p=L,*q; if (p->next!=L) //原单链表不为空表时 { if (i==1) //i==1时 { q=L->next; //删除第1个结点 e=q->data; L->next=q->next; free(q); return true; } else //i不为1时 { p=L->next; while (j
next; } if (p==L) //未找到第i-1个结点 return false; else //找到第i-1个结点*p { q=p->next; //q指向要删除的结点 e=q->data; p->next=q->next; //从单链表中删除*q结点 free(q); //释放*q结点 return true; } } } else return 0;}

  3.在建立算法库过程中,为了完成测试,再同一项目(project)中建立一个源文件(如main.cpp),编制main函数,完成相关的测试工作。例:

#include 
#include "clinklist.h"int main(){ CLinkList *A; ElemType a[]= {
1, 3, 2, 9, 0, 4, 5 ,6, 7, 8}; InitList(A); CreateListF(A, a, 10); printf("length: %d\n", ListLength(A)); ListInsert(A, 4, 12); printf("After Insert: "); DispList(A); DestroyList(A); return 0;}

转载地址:http://oiroa.baihongyu.com/

你可能感兴趣的文章
python能够执行,但编译第三包遇到 python.h no such file or directory
查看>>
值得分享的Bootstrap Ace模板实现菜单和Tab页效果(转)
查看>>
Sql Server 中将由逗号“,”分割的一个字符串转换为一个表集,并应用到 in 条件中...
查看>>
RobotFramework-Selenium2Library--关键字
查看>>
2721: [Violet 5]樱花|约数个数
查看>>
C++库研究笔记--用__attribute__((deprecated)) 管理过时代码
查看>>
linux命令(42):tr命令
查看>>
Oracle执行SQL报错ORA-00922
查看>>
swagger学习2
查看>>
Bootstrap modal使用及点击外部不消失的解决方法
查看>>
13.Linux键盘按键驱动 (详解)
查看>>
机器学习的学习方式及学习算法的类别【转】
查看>>
YUM源、磁盘基础知识 CDN概念
查看>>
stylus入门使用方法
查看>>
使用VS2013自带的PreEmptive Dotfuscator and Analytis来混淆C#代码
查看>>
防盗链之URL参数签名 总结
查看>>
IDEA使用--字体、编码和基本设置
查看>>
[日常] nginx与location规则
查看>>
环境部署(四):Linux下查看JDK安装路径
查看>>
MeasureOverride 和 ArrangeOverride
查看>>