《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)
开始学习数据结构,使用的教材是机械工业出版社的《数据结构与算法分析——C语言描述》,计划将书中的ADT用C语言实现一遍,记录于此。下面是第一个最简单的结构——链表。
链表(Linked-List),即最基本的数据结构——线性表的链式存储结构。比起顺序存储,其好处在于空间使用的灵活性,以及插入、删除操作的高效性。下面给出笔者的链表结构C语言实现。其中算法和细节部分定有可优化之处,欢迎大神指正。
// LinkedList.h
#ifndef _LINKEDLIST_H
#define _LINKEDLIST_H #include <stdio.h>
#include <stdlib.h> struct _Node;
typedef struct _Node Node;
typedef Node *PtrToNode;
typedef PtrToNode List; List CreateList();
List MakeEmpty(List L);
int IsEmpty(List L);
int IsLast(PtrToNode P, List L);
PtrToNode Find(ElementType X, List L);
void Delete(ElementType X, List L);
PtrToNode FindPrevious(ElementType X, List L);
void Insert(ElementType X, List L, PtrToNode P);
void DeleteList(List L);
ElementType Retrieve(PtrToNode P); #endif
// LinkedList.c
#include "LinkedList.h" struct _Node
{
struct _Node *Next;
ElementType Element;
}; List CreateList()
{
List ret;
if ((ret = (List)malloc(sizeof(Node))) != 0)
{
ret->Next = NULL;
return ret;
}
printf("Fail to create! The memory is full!\n\n");
return 0;
} List MakeEmpty(List L)
{
DeleteList(L);
L = CreateList();
return L;
} int IsEmpty(List L)
{
return L->Next == NULL;
} int IsLast(PtrToNode P, List L)
{
while (L && L->Next)
L = L->Next;
return P == L;
} PtrToNode Find(ElementType X, List L)
{
L = L->Next;
while (L && L->Element != X)
L = L->Next;
return L;
} void Delete(ElementType X, List L)
{
PtrToNode p, q;
p = L->Next;
q = L;
while (p && p->Element != X)
{
p = p->Next;
q = q->Next;
}
if (p)
{
q->Next = p->Next;
free(p);
}
} PtrToNode FindPrevious(ElementType X, List L)
{
while (L->Next && L->Next->Element != X)
{
L = L->Next;
}
if (L->Next)
return L;
else
return NULL;
} void Insert(ElementType X, List L, PtrToNode P)
{
PtrToNode t = P->Next;
if((P->Next = (PtrToNode)malloc(sizeof(Node))) == NULL)
{
printf("Fail to insert! The memory is full!\n\n");
return;
}
P->Next->Element = X;
P->Next->Next = t;
} void DeleteList(List L)
{
PtrToNode p, q;
p = L->Next;
while(p)
{
q = p;
p = p->Next;
free(q);
}
L->Next = NULL;
} ElementType Retrieve(PtrToNode P)
{
return P->Element;
}
下面是一点简单的测试,由于链表结构并不复杂,且之前已有所接触,所以没有做复杂的测试样例验证正确性。
#include <stdio.h>
#include "LinkedList.h" #define ElementType int int main()
{
List l = CreateList();
print(l);
printf("Is empty: %d\n", IsEmpty(l));
Insert(2, l, l);
Insert(3, l, l);
Insert(5, l, l->Next);
print(l);
Delete(3, l);
print(l);
DeleteList(l);
print(l);
return 0;
}
《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)的更多相关文章
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)
#include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...
- C语言学习书籍推荐《数据结构与算法分析:C语言描述(原书第2版)》下载
维斯 (作者), 冯舜玺 (译者) <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行 ...
- 《数据结构与算法分析-Java语言描述》 分享下载
书籍信息 书名:<数据结构与算法分析-Java语言描述> 原作名:Data Structures and Algorithm Analysis in Java 作者: 韦斯 (Mark A ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.03) : 二叉搜索树/二叉查找树(Binary Search Tree)
二叉搜索树(Binary Search Tree),又名二叉查找树.二叉排序树,是一种简单的二叉树.它的特点是每一个结点的左(右)子树各结点的元素一定小于(大于)该结点的元素.将该树用于查找时,由于二 ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.05) : 散列(Hash)
散列(Hash)是一种以常数复杂度实现查找功能的数据结构.它将一个关键词Key,通过某种映射(哈希函数)转化成索引值直接定位到相应位置. 实现散列有两个关键,一是哈希函数的选择,二是冲突的处理. 对于 ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.04) : AVL树(AVL-Tree)
上次我们已经实现了普通的二叉查找树.利用二叉查找树,可以用O(logN)高度的树状结构存储和查找数据,提高了存储和查找的效率. 然而,考虑一种极端情形:依次插入1,2,3,4,5,6,7,8,9九个元 ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.01) : 栈(Stack)
这次的数据结构是一种特殊的线性表:栈(Stack) 栈的特点是后入先出(LIFO),可见的只有栈顶的一个元素. 栈在程序中的地位非常重要,其中最重要的应用就是函数的调用.每次函数调用时都会创建该函数的 ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.02) : 队列(Queue)
第三个结构——队列(Queue) 队列与上次的栈相反,是一种先进先出(FIFO)的线性表.写入时只暴露尾部,读取时只暴露头部. 本次只实现了数组形式的队列.原因是链表形式的队列极为简单,只需要实现简单 ...
随机推荐
- PAT甲级——A1118 Birds in Forest【25】
Some scientists took pictures of thousands of birds in a forest. Assume that all the birds appear in ...
- 「APIO 2019」桥梁
题目 三天终于把\(APIO\)做完了 这题还是比较厉害的,如果不知道这是个分块应该就自闭了 考虑一个非常妙的操作,按照操作分块 我们设一个闸值\(S\),把\(S\)个边权修改操作分成一块,把所有的 ...
- Spring 切面优先级(5)
之前我们提过的应用场景,一个原始对象可能会需要插入多个切面,如果我们按前几篇博客文章介绍的方法完成切面及其通知的注解声明,那么它的执行顺序是怎么样的呢? 本文将介绍AspectJ的切面如何划分优先级 ...
- java_IO流(输入流)
* 字节输入流(InputStream):所有字节输入流的父类 * 所有子类共性方法: * int read():从输入流中读取数据的下一个字节 * int read(byte[] b):从输入流中拂 ...
- LINUX挂接UNIX系统NFS文件共享
类似于windows的网络共享,UNIX(Linux)系统也有自己的网络共享,那就是NFS(网络文件系统),下面我们就以SUN Solaris2.8和REDHAT as server 3 为例简单介绍 ...
- 数据结构学习笔记_树(二叉搜索树,B-树,B+树,B*树)
一.查找二叉树(二叉搜索树BST) 1.查找二叉树的性质 1).所有非叶子结点至多拥有两个儿子(Left和Right): 2).所有结点存储一个关键字: 3).非叶子结点的左指针指向小于其关键字的子树 ...
- 数论整除——cf1059D
用map是卡着过去的..题解用vector+离散化后常数小了十倍.. 总之就是把所有模数给保存下来然后离散化,再去匹配一下即可,最后有个细节 自己的 #include<bits/stdc++.h ...
- JAVA 垃圾回收读书笔记
对象已死 在JAVA代码运行中,会不停的创建对象,因为内存空间不是无限的,Java虚拟机必须不停的回收无用的数据空间.那么虚拟机是怎么判断对象空间是需要被回收的呢,也就是怎么样的数据算是垃圾数据呢? ...
- shell学习笔记2: shell中的四则运算符
shell中的四则运算符 n1,n2 :常量数字 char:运算符号 加,减,乘,除,取余(+,-,*,/,%) $a,$b:变量a,变量b 方法1 数字与符号之间需要有空格 不支持小数 expr n ...
- CPU中的主要的寄存器
寄存器 名为寄存器的存储电路. 8种16位寄存器 AX accumulator 累加寄存器 CX counter 计数寄存器 DX data 数据寄存器 BX base 基址寄存器 SP stack ...