实际应用中带头节点的线性链表

/*========带头节点的线性链表类型=========*/
typedef char ElemType//结点类型
typedef struct LNode
{char data;struct LNode *next;
}*Link,*Position;//链表类型
typedef struct
{Link head,tail;int len;
}LinkList;/*======================================================*/
/*=======一些在其他函数定义中会调用的函数===============*/
/*======================================================*//*---compare---比较两个元素的大小关系*/
int Compare(char a,char b)
{  return a-b;
}/*---visit---*/
int Visit(Link p)
{if(...)return 1;elsereturn 0;}/*---length---求链的长度*/
int Length(Link s)
{ int i=0;Link p=NULL;p=s;while(p->next!=NULL){p=p->next;i++;}return i;
}/*---print---在屏幕上输出链表的所有元素*/
void Print(LinkList L)
{     Link p=NULL;p=L.head;if(!p->next){printf("\nThe LinkList is empty.\n\n");return ;}printf("The List:");while(p){printf("%c-",p->data);p=p->next;}
}/*======================================================*/
/*==========对带头结点的单链线性表进行操作的函数的定义==*/
/*======================================================*//*---分配由p指向的结点并赋值为e---*/
Position MakeNode(ElemType e)
{       Link p=NULL;p=(Link)malloc(sizeof(struct LNode));if(p){p->data=e;p->next=NULL;}else return;return p;
}/*---释放p所指向的结点-*/
void FreeNode(Link p)
{          free(p);
}/*---构造一个由L指向的空的线性表-*/
void InitList(LinkList *L)
{      L->head=MakeNode('L');//生成头结点L->head->next=NULL;/*不是l->head=NULL*/L->tail=L->head;L->len=0;
}/*----------销毁由L指向的线性表---------*/
void DestroyList(LinkList *L)
{   Link p;p=(*L).tail;while(p!=(*L).head){p=PriorPos(*L,p);FreeNode(p->next);}FreeNode((*L).head);
}/*将线性表L置为空表,并释放原链表的头结点*/
void ClearList(LinkList *L)
{     Link p;p=(*L).tail;while(p!=(*L).head){p=PriorPos(*L,p);FreeNode(p->next);}FreeNode((*L).head);
}/*---将s指向的结点插入线性链表的第一个结点之前-*/
void InsFirst(LinkList *L,Link s)
{    s->next=L->head->next;if(!L->head->next) L->tail=s;       /*当向一个空的线性表执行该操作时*/L->head->next=s;L->len++;
}/*---删除表中第一个结点并以q返回-*/
void DelFirst(LinkList *L,Link q)
{    if(!L->head->next){printf("\nThe LinkList is empty,can not delete..\n");return 0;}q=L->head->next;L->head->next=L->head->next->next;
}/*---将指针s所的一串结点链接在线性表L的最后一个结点-*/
void Append(LinkList *L,Link s)
{  Link q;q=L->head;if(!L->tail){/*考虑到链表为空的情况*/L->head->next=s;while(q->next) q=q->next;/*尾结点的处理*/L->tail=q;}L->tail->next=q=s;while(q->next) q=q->next;/*不能忘了对尾结点的处理*/L->tail=q;L->len+=Length(s);
}/*---删除线性表l中的尾结点-*/
void Remove(LinkList *L,Link q)
{   if(!L->tail){printf("\nthe LinkList is empty,can not remonde..\n");return 0;}q=L->tail;                      L->tail=PriorPos(*L,q);L->tail->next=NULL;
}/*---将s所指向结点插入在p所指结点之前-*/
void InsBefore(LinkList *L,Link p,Link s)
{   Link q;q=PriorPos(*L,p);s->next=p;q->next=s;
}/*---将s所指向结点插入在p所指结点之后-*/
void InsAfter(LinkList *L,Link p,Link s)
{    s->next=p->next;p->next=s;
}/*---用e更新p所指向的当前结点-*/
void SetCurElem(Link p,ElemType e)
{         p->data=e;
}/*---返回p所指结点中元素的值-*/
ElemType GetCurElem(Link p)
{        return p->data;
}int Listempty(LinkList L)
{         /*---若线性表为空表则返回1,否则返回0-*/if(L.head==L.tail) return 1;return 0;
}int Listlength(LinkList L)
{      /*---返回线性表中元素个数-*/return L.len;
}Position GetHead(LinkList L)
{     /*---返回线性表l中头结点的位置-*/return L.head;
}Position GetLast(LinkList L)
{      /*-----返回线性表l中最后一个结点的位置-------*/return L.tail;
}/*---返回p所指结点的直接前驱的位置-*/
Position PriorPos(LinkList L,Link p)
{    Link q;q=L.head;if(q->next==p) return 0;while(q->next!=p)   q=q->next;return q;
}/*-----返回p所指结点的直接后继的位置-------*/
Position NextPos(Link p)
{     Link q;q=p->next;return q;
}/*-----用p返回线性表l中第i个结点的位置,并返回ok-------*/
void LocatePos(LinkList L,int i,Link p)
{    p=L.head;if(i<=0||i>Listlength(L))   return 0;while(i){p=p->next;i--;}
}/*----返回表中第一个与e满足一定函数关系的结点次序位置----*/
int LocatElem(LinkList L,ElemType e)
{     int i=0;Link p;p=L.head->next;while(compare(p->data,e)&&p){p=p->next;++i;}if(!p){/*考虑到查找不到指定元素的情况*/printf("\nthere's no '%c' in this LinkList.",e);return 0;}return i;
}/*----用一个函数遍历表中所有结点-------*/
void ListTraverse(LinkList L)
{         Link p;p=L.head;while(!visit(p))  p=p->next;   
}



将单链线性表La和Lb的元素按值非递减排列


Status MergeList_L(NLinkList &La, NLinkList &Lb, NLinkList &Lc, int (*compare)(ElemType, ElemType)) 
{  // 算法2.21// 已知单链线性表La和Lb的元素按值非递减排列。// 归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。NLink ha, hb;Position pa, pb, q;ElemType a, b;if (!InitList(Lc)) return ERROR;  // 存储空间分配失败ha = GetHead(La);      // ha和hb分别指向La和Lb的头结点hb = GetHead(Lb);pa = NextPos(La, ha);  // pa和pb分别指向La和Lb中当前结点pb = NextPos(Lb, hb);while (pa && pb) {     // La和Lb均非空a = GetCurElem(pa);  // a和b为两表中当前比较元素b = GetCurElem(pb);if ((*compare)(a, b)<=0) {  // a≤bDelFirst(ha, q);  Append(Lc, q);  pa = NextPos(La, pa);  } else{   // a>bDelFirst(hb, q);  Append(Lc, q);  pb = NextPos(Lb, pb);  }} // whileif (pa) Append(Lc, pa);        // 链接La中剩余结点elseAppend(Lc, pb);        // 链接Lb中剩余结点FreeNode(ha);   FreeNode(hb);              // 释放La和Lb的头结点return OK;
} // MergeList_L


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab中欧姆如何表示,在excel中欧姆符号怎么打

在excel中欧姆符号怎么打&#xff0c;相信对于好多熟练用excel的朋友来说&#xff0c;是很简单不过的&#xff0c;但是对于有些初学者来说&#xff0c;就是菜鸟啦&#xff0c;就有点懵懵懂懂的感觉了&#xff0c;毕竟刚接触的东西还没用过嘛。但是&#xff0c;没关系今天笔者就…

原生js系列之DOM工厂模式

写在前面 如今&#xff0c;在项目中使用React、Vue等框架作为技术栈已成为一种常态&#xff0c;在享受带来便利性的同时&#xff0c;也许我们渐渐地遗忘原生js的写法。 现在&#xff0c;是时候回归本源&#xff0c;响应原始的召唤了。本文将一步一步带领大家封装一套属于自己的…

武术与软件设计 - 简单即是最好

偶然间在公车上看见一个讲中国功夫的特辑&#xff0c;说道香港武打片的发展历程&#xff0c;当然就不得不提起李小龙先生&#xff0c;我们知道他截拳道的威力&#xff0c;这时候我记得在看李小龙传奇时他所说的一些话&#xff0c;当他和美国一个高手比武后他输了&#xff0c;最…

matlab的概述,Matlab概述

MATLAB(矩阵实验室)是数字计算&#xff0c;可视化和编程的第四代高级编程语言和交互式环境。MATLAB是由MathWorks开发的。它允许矩阵操纵&#xff0c;绘制功能和数据; 实现算法; 创建用户界面; 与其他语言编写的程序(包括C语言&#xff0c;C&#xff0c;Java和FORTRAN)进行交互…

形参和实参

形参&#xff1a;全称为“形式参数”是在定义函数名和函数体的时候使用的参数&#xff0c;目的是用来接收调用该函数时传递的参数。形参的作用是实现主调函数与被调函数之间的联系&#xff0c;通常将函数所处理的数据&#xff0c;影响函数功能的因素或者函数处理的结果作为形参…

sizeof和strlen的区别

strlen——get the length of a string.size_t strlen(const char *string);Each ofthese functions returns the number of characters instring, notincluding the terminating null character.//函数返回string里的字符数&#xff0c;不包括终止字符\0sizeofThe sizeof keyw…

位置参数及操作符号

特殊字符对应的处理参数&#xff1a; 参数说明$0当前执行的脚本文件名&#xff0c;若全路径执行&#xff0c;则显示脚本路径$n当前执行脚本的第n个参数值&#xff0c;若n>9&#xff0c;则需写成${10}$#当前传参总个数$$脚本运行的当前进程ID号,用例&#xff1a;当一个进程重…

python变量命名可以有特殊符号吗,和孩子一起学习python之变量命名规则

下面是关于变量名(也称为标识符)的一些规则必须以一个字母或一个下划线字符开头。后面可以使用一个字母、数字或下划线字符的序列&#xff0c;长度不限。字母可以是大写或小写&#xff0c;大小写是不同的。也就是说&#xff0c;Ax不同于aX。数字可以是从0到9(包括0到9)的任意数…

C语言中*和

(一) 在定义时&#xff0c;* 是一个标识符&#xff0c;声明该变量是一个指针&#xff0c;比如说int *p; 那p就是一个指向int型的指针&#xff1b; 在调用时&#xff0c; &#xff08;1&#xff09;*p是指指针p指向的那个变量&#xff0c;比如说之前有int a5&#xff1b;int …

IT人的好习惯和不良习惯总结

好习惯&#xff1a; 细节一&#xff1a;在电脑旁放上几盆植物&#xff0c;传说仙人掌可以有效地吸收辐射&#xff0c;但是会扎到人&#xff0c;而且有没效果也没科学根据&#xff0c;不推荐&#xff1b;其实只要是绿色植物就可以&#xff0c;植物可以让你多点氧气&#xff0c;保…

【BZOJ 3326】[Scoi2013]数数 数位dp+矩阵乘法优化

挺好的数位dp……先说一下我个人的做法:经过观察,发现这题按照以往的思路从后往前递增,不怎么好推,然后我就大胆猜想,从前往后推,发现很好推啊,维护四个变量,从开始位置到现在有了i个数 f[i]:所有数的所有未包含最后一位的子串的和 s[i]:所有数的所有后缀子串的和 c[i]:所有数的…

zookeeper伪集群(在一台机器上集群)

2019独角兽企业重金招聘Python工程师标准>>> 创建一下的目录结构zookeeper-3.4.10是你下载的zookeeper的解压包 /zookeeper_cluster----/server_one|---/data|myid(文件)|---/datalog|---/zookeeper-3.4.10|---/bin|---/conf|---zoo.cfg|---..... |---/....----/ser…

mongo的php查询,使用PHP进行简单查询的mongo查询速度慢

我有一个非常简单的使用PHP执行的Mongo Query。我相信查询执行得非常快&#xff0c;因为当我在终端上运行它时&#xff0c;它几乎可以立即完成&#xff0c;并且当我解释()时&#xff0c;它表明它正在1-2ms内执行。但是&#xff0c;当我去迭代游标并将内容放入数组时&#xff0c…

顺序存储结构和链式存储结构的优缺点

&#xff08;一&#xff09;顺序存储结构和链式存储结构的优缺点比较&#xff0c;以及使用情况。 1 优缺点 ① 顺序存储时&#xff0c;相邻数据元素的存放地址也相邻&#xff08;逻辑与物理统一&#xff09;&#xff1b;要求内存中可用存储单元的地址必须是连续的。 优点&…

大话软件开发与开车的共同点

昨天路上开车&#xff0c;突然有了这个想法&#xff0c;做软件开发与开车&#xff0c;竟然有这么多的相似之处&#xff0c;大致整理了一下思路&#xff0c;和大家分享一下。 一、目的 开车的目的有3个&#xff0c;第一是为了让自己到底目的地(上班族)&#xff0c;第二是为了兜…

Spring核心接口之Ordered

一、Ordered接口介绍Spring中提供了一个Ordered接口。从单词意思就知道Ordered接口的作用就是用来排序的。Spring框架是一个大量使用策略设计模式的框架&#xff0c;这意味着有很多相同接口的实现类&#xff0c;那么必定会有优先级的问题。于是Spring就提供了Ordered这个接口&a…

将本地代码上传至github

注册github账号 https://github.com/ 安装git工具 https://git-for-windows.github.io 1.在github中创建一个项目 2.填写相应信息&#xff0c;点击create Repository name: 仓库名称 Description(可选): 仓库描述介绍 Public, Private : 仓库权限&#xff08;公开共享&#xff…

禅道 php api,云禅道有API的方式可以获取数据吗

api相关手册&#xff1a;api接口查看&#xff0c;可以本地搭建和云禅道相同版本的禅道&#xff0c;然后admin 后台 二次开发 api&#xff0c;可以查看接口列表。api调用步骤PATH_INFO方式1、访问 http://x.com/api-getsessionid.json获取禅道session信息2、使用上一步获取的ses…

链表的头结点和尾节点的用处

某些情况下设置尾指针的好处 尾指针是指向终端结点的指针&#xff0c;用它来表示单循环链表可以使得查找链表的开始结点和终端结点都很方便&#xff0c;设一带头结点的单循环链表&#xff0c;其尾指针为rear&#xff0c;则开始结点和终端结点的位置分别是rear->next->ne…

经验从哪里来?从痛苦中来!

1 刚才发博客&#xff0c;写的几百字丢失&#xff0c;让我知道下次一定要在记事本里写好&#xff0c;再复制过来&#xff0c;避免丢失了 2 程序忘记备份&#xff0c;辛苦一个多月的东西没有了&#xff0c;只能找到1月前的版本&#xff0c;让我知道了&#xff0c;重要的东西必须…