开始学习数据结构,使用的教材是机械工业出版社的《数据结构与算法分析——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)的更多相关文章

  1. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  2. 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)

    #include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...

  3. C语言学习书籍推荐《数据结构与算法分析:C语言描述(原书第2版)》下载

    维斯 (作者), 冯舜玺 (译者) <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行 ...

  4. 《数据结构与算法分析-Java语言描述》 分享下载

    书籍信息 书名:<数据结构与算法分析-Java语言描述> 原作名:Data Structures and Algorithm Analysis in Java 作者: 韦斯 (Mark A ...

  5. 《数据结构与算法分析——C语言描述》ADT实现(NO.03) : 二叉搜索树/二叉查找树(Binary Search Tree)

    二叉搜索树(Binary Search Tree),又名二叉查找树.二叉排序树,是一种简单的二叉树.它的特点是每一个结点的左(右)子树各结点的元素一定小于(大于)该结点的元素.将该树用于查找时,由于二 ...

  6. 《数据结构与算法分析——C语言描述》ADT实现(NO.05) : 散列(Hash)

    散列(Hash)是一种以常数复杂度实现查找功能的数据结构.它将一个关键词Key,通过某种映射(哈希函数)转化成索引值直接定位到相应位置. 实现散列有两个关键,一是哈希函数的选择,二是冲突的处理. 对于 ...

  7. 《数据结构与算法分析——C语言描述》ADT实现(NO.04) : AVL树(AVL-Tree)

    上次我们已经实现了普通的二叉查找树.利用二叉查找树,可以用O(logN)高度的树状结构存储和查找数据,提高了存储和查找的效率. 然而,考虑一种极端情形:依次插入1,2,3,4,5,6,7,8,9九个元 ...

  8. 《数据结构与算法分析——C语言描述》ADT实现(NO.01) : 栈(Stack)

    这次的数据结构是一种特殊的线性表:栈(Stack) 栈的特点是后入先出(LIFO),可见的只有栈顶的一个元素. 栈在程序中的地位非常重要,其中最重要的应用就是函数的调用.每次函数调用时都会创建该函数的 ...

  9. 《数据结构与算法分析——C语言描述》ADT实现(NO.02) : 队列(Queue)

    第三个结构——队列(Queue) 队列与上次的栈相反,是一种先进先出(FIFO)的线性表.写入时只暴露尾部,读取时只暴露头部. 本次只实现了数组形式的队列.原因是链表形式的队列极为简单,只需要实现简单 ...

随机推荐

  1. springboot+vue的前后端分离与合并方案

    pringboot和vue结合的方案网络上的主要有以下两种: 1. [不推荐]在html中直接使用script标签引入vue和一些常用的组件,这种方式和以前传统的开发是一样的,只是可以很爽的使用vue ...

  2. cv2 & PIL(pillow)显示图像

    = OpenCV和PIL中显示图像方式不一样,且支持的格式也不同 = cv在显示图像时是自定义的显示窗口,而PIL中显示是调用操作系统中的默认打开程序 如: import cv2 im = cv2.i ...

  3. spring:常用的注解

    bean.xml中配置依赖 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  4. 【树剖】CF916E Jamie and Tree

    好吧这其实应该不是树剖... 因为只要求子树就够了,dfs就好了 大概就是记录一个全局根root 多画几幅图会发现修改时x,y以root为根时的lca为以1为根时的lca(x,y),lca(root, ...

  5. WJMZBMR打osu! / Easy

    WJMZBMR打osu! / Easy 有一个由o,x,?组成的长度为n的序列,?等概率变为o,x,定义序列权值为连续o的长度o的平方之和,询问权值的期望, 解 注意到权值不是简单的累加关系,存在平方 ...

  6. bzoj2209 括号序列

    题意:给你一个括号序列.操作1:询问需要更改多少个括号使之匹配. 操作2:反转序列,左括号变成右括号. 操作3:翻转序列,倒置. 标程: #include<cstdio> #include ...

  7. [转]成为Java顶尖程序员 ,看这11本书就够了

    “学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 1.能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超 ...

  8. 【转】IOS获取屏窗高度踩坑之window.outerHeight

    近日本人在直接使用window.outerHeight获取屏窗高度时 在iphone 6中出现等于0的情况,从而导致页面发生错误 后找遍代码,测试无数,终于让我逮住了这个该死兼容 window.out ...

  9. ThinkPHP可以支持直接使用字符串作为查询条件

    ThinkPHP可以支持直接使用字符串作为查询条件,但是大多数情况推荐使用数组或者对象来作为查询条件,因为会更加安全. 大理石平台哪家好 一.使用字符串作为查询条件 这是最传统的方式,但是安全性不高, ...

  10. C#一般处理程序设置和读取session(session报错“未将对象引用设置到对象的实例”解决)

    登陆模块时,用到了session和cookie.在一般处理程序中处理session,一直报错.最后找到问题原因是需要调用 irequiressessionstate接口. 在ashx文件中,设置ses ...