单链表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方法并不修改原先的字符串,而是返回修改后的字符串. 而此字符串对象时用单链表 ...
随机推荐
- 安装Vmware workstation虚拟机(含软件和注册码)
1:虚拟机的安装步骤,包含软件包和注册码.本博客所使用的虚拟机版本是vmware-workstation_11.1.0版本,注意不是最新版本, 软件包:http://pan.baidu.com/s/1 ...
- Anywhere服务建立及连接步骤
<烟叶自动化收购管理系统(山东版)>服务端程序为<烟站综合管理系统5.0>,5.0使用的数据库为Anywhere,设置方法如下: 建立anywhere服务连接步骤 服务 ...
- php header函数详解
客户机的请求方式格式:是统一资源标识符.协议版本号,后边是MIME信息包括请求修饰符.客户机信息和可能的内容!服务器响应格式:一个状态行包括信息的协议版本号.一个成功或错误的代码,后边是MIME信息包 ...
- 构造函数模式自己定义js对象
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 在Servlet中出现一个输出中文乱码的问题(已经解)。
在Servlet中出现一个输出中文乱码的问题,已经解. @Override public void doPost(HttpServletRequest reqeust, HttpServletResp ...
- find the peak value
A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ ...
- liunx CentOS 升级Python版本
CentOS python版本是V2.6.6,升级3.4.3. 1.下载 安装包:wget http://www.python.org/ftp/python/3.4.3/Python-3.4.3.tg ...
- oracle导入导出小记
问题:11.2.0.3.0 导入 11.2.0.2.0 都是oracle 11g ,从0.3.0到0.2.0 报错,以为是版本问题,结果不是 采用impdp 导入exp导出的文件会报错 所以改为im ...
- [转] js == 与 === 的区别
1.对于string,number等基础类型,==和===是有区别的 1)不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如果类型不同,其结果就是不等 2)同类型比较,直接进 ...
- 更改chrome底色为护目色
找到chrome目录:C:\Documents and Settings\用户名\Local Settings\Application Data\Google\Chrome\User Data\Def ...