单链表List的C实现
头文件————————————————————————————————
//单链表的实现
#ifndef _LIST_H_
#define _LIST_H_ #include <stdlib.h>
#define Element int
struct node
{
Element data;
struct node *next;
};
typedef struct node* PtrToNode;
typedef PtrToNode Position;
typedef Position List;
List MakeEmpty(List L);
int IsEmpty(List L);
int IsLast(Position P, List L);
List CreateEmptyList();
Position Find(Element X, List L);
void Delete(Element X, List L);
Position FindPrevious(Element X, List L);//查找失败则返回链表的最后一个元素
void Insert(Element X, Position P, List L);//在P的后面插入新元素X
void PushBack(Element X, List L);
void PushFront(Element X, List L);
void DeleteList(List L);
Position Header(List L);
Position First(List L);
Position Advance(Position P, List L);//得到P的前一个位置
Element Retrieve(Position P);
#endif
//单链表的实现
#include "./List.h"
List MakeEmpty(List L)
{
if (NULL == L)
return L;
Position p = First(L);
Position tmp = p;
while(NULL != p)
{
tmp = p->next;
free(p);
p = tmp;
}
L->next = NULL;
return L;
}
int IsEmpty(List L)
{
return First(L) == NULL;
}
int IsLast(Position P, List L)
{
return P->next == NULL;
}
List CreateEmptyList()
{
List L = (List)malloc(sizeof(struct node));
if(NULL == L) return NULL;
L->next = NULL;
return L;
}
Position Find(Element X, List L)
{
if(NULL == L) return NULL;
Position p = First(L);
while(NULL != p && p->data != X)
p = p->next;
return p;
}
void Delete(Element X, List L)
{
if(NULL == L) return ;
Position prev = FindPrevious(X, L);
if(!IsLast(prev, L))
{
Position tmp = prev->next;
prev->next = tmp->next;
free(tmp);
}
}
Position FindPrevious(Element X, List L)//查找失败则返回链表的最后一个元素
{
if(NULL == L) return NULL;
Position prev = Header(L);
while(NULL != prev->next && X != prev->next->data)
prev = prev->next;
return prev;
}
void Insert(Element X, Position P, List L)//在P的后面插入新元素X
{
if(NULL == L) return ;
Position tmp = (Position)malloc(sizeof(struct node));
if(NULL == tmp) return ;
tmp->data = X;
tmp->next = P->next;
P->next = tmp
}
void PushBack(Element X, List L)
{
if(NULL == L) return ;
Position pos = Header(L);
while(NULL != pos->next)
pos = pos->next;
Position tmp = (Position)malloc(sizeof(struct node));
if(NULL == tmp) return ;
tmp->data = X;
tmp->next = NULL;
pos->next = tmp;
}
void PushFront(Element X, List L)
{
if(NULL == L) return ;
Position pos = L->next;
Position tmp = (Position)malloc(sizeof(struct node));
if(NULL == tmp) return ;
tmp->data = X;
tmp->next = pos;
L->next = tmp;
}
void DeleteList(List L)
{
MakeEmpty(L);
free(L);
}
Position Header(List L)
{
return L;
}
Position First(List L)
{
if(NULL == L) return NULL;
return L->next;
}
Position Advance(Position P, List L)//得到P的前一个位置
{
if(NULL == L) return NULL;
Position prev = Header(L);
while(NULL != prev && prev->next != P)
prev = prev->next;
return prev;
}
Element Retrieve(Position P)
{
return P->data;
}
单链表List的C实现的更多相关文章
- 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...
- 单链表的C++实现(采用模板类)
采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作. 链表结构定义 定义单链表 ...
- Java实现单链表的各种操作
Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素 4.实现链表的反转 5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...
- [LeetCode] Linked List Cycle II 单链表中的环之二
Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...
- c++单链表基本功能
head_LinkNode.h /*单链表类的头文件*/#include<assert.h>#include"compare.h"typedef int status; ...
- 单链表、循环链表的JS实现
数据结构系列前言: 数据结构作为程序员的基本知识,需要我们每个人牢牢掌握.近期我也展开了对数据结构的二次学习,来弥补当年挖的坑...... 当时上课的时候也就是跟着听课,没有亲自实现任何一种数据结 ...
- C代码实现非循环单链表
C代码实现非循环单链表, 直接上代码. # include <stdio.h> # include <stdlib.h> # include <malloc.h> ...
- 分离的思想结合单链表实现级联组件:CascadeView
本文介绍自己最近做省市级联的类似的级联功能的实现思路,为了尽可能地做到职责分离跟表现与行为分离,这个功能拆分成了2个组件并用到了单链表来实现关键的级联逻辑,下一段有演示效果的gif图.虽然这是个很常见 ...
- 数据结构:单链表结构字符串(python版)添加了三个新功能
#!/urs/bin/env python # -*- coding:utf-8 -*- #异常类 class stringTypeError(TypeError): pass #节点类 class ...
- 数据结构:单链表结构字符串(python版)改进
此篇文章的replace实现了字符串类的多次匹配,但依然有些不足. 因为python字符串对象为不变对象,所以replace方法并不修改原先的字符串,而是返回修改后的字符串. 而此字符串对象时用单链表 ...
随机推荐
- Extjs4中RadioGroup的赋值与取值
1.定义rg var rg = new Ext.form.RadioGroup({ fieldLabel : "test", items : [{ boxLabel : '每天', ...
- java集合类总结二
上篇已经总结了常用集合类的一些基本特征以及他们之间的区别,下面,再对集合类部分进行总结 一.集合类的常用方法 1.remove方法:移除元素操作,下面以ArrayList为例. import java ...
- JQuery快速入门
Write less, do more, I like jQuery. jQuery是最常用的js库,整体来说非常轻量并易于扩展,对于移动应用可以使用其更轻量的孪生兄弟Zepto代替.其是由John ...
- [原创]Windows Phone SDK下载
[原创]Windows Phone SDK下载 http://dev.windowsphone.com/zh-cn/downloadsdk
- 大型架构.net平台篇(WEB层均衡负载nginx)
第一部分 WEB层均衡负载.net平台下,我目前部署过的均衡负载有两种方式(iis7和Nginx),以下以Nginx为例讲解web层的均衡负载. 简介:Nginx 超越 Apache 的高性能和稳定性 ...
- 转:电子取证中AVI文件的文件雕复
电子取证中AVI文件的文件雕复 收藏本文 分享 1引言在电子取证工作中,恢复数字设备中被删除的数据是极为重要的工作之一,恢复数据又分依赖系统元信息的传统数据恢复技术和不依赖系统元信息的文件雕刻.文件雕 ...
- 内存的分配VS回收&构造函数VS析构函数
之前有一个问题一直困扰着我,就是一个变量出了作用域,我以为这个变量的内存就被回收了,其实不是这样的,昨天问了一个高手,才豁然开朗,自己在看相关代码的反汇编代码,才知道原来真是这样就.这个问题,我想简单 ...
- 奇怪吸引子---WimolBanlue
奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...
- java动态代理汇总
逛知乎,有篇关于fastjson如此快为什么国外还是喜欢用Jackson的问题,高票答案中有一点提到了fastjson有很多写死的地方,也不太适合像spring这种依赖AOP的框架使用,顺便提到了AS ...
- AngularJS 模态对话框
本文内容 项目结构 运行结果 index.html mymodal.js 参考资料 本文讲解 Angular JS 实现模式对话框.基于 AngularJS v1.5.3.Bootstrap v3.3 ...