开始学习数据结构,使用的教材是机械工业出版社的《数据结构与算法分析——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. python+appium真机运行登录例子

    一.手机USB连接电脑(手机打开调试模式) 验证:cmd -> 输入adb devices,查看手机的UDID.显示如下表示 连接成功 二.启动Appium服务 1. 启动Appium,点击 右 ...

  2. 关于ueditor 文本框

    遇到一个问题,需要将从ueditor中的获得的带格式的文本,从数据库中取出,在放回到 ueditor中去,但是 文本中\n总是截断字符串,出现 这种情况,后面的字符就不能算到里面去了,程序就报错了. ...

  3. Newtonsoft.Json高级篇:TypeNameHandling设置

    原文:Newtonsoft.Json高级篇:TypeNameHandling设置 此示例使用TypeNameHandling 设置在序列化JSON和读取类型信息时包含类型信息,以便在反序列化JSON时 ...

  4. while语句结构(for循环)

    while语句结构(for循环) python for 循环可以遍历任何序列的项目,如一个列表或一个字符串 for循环的一般形式 for 条件判断 in 一个序列: 执行语句 else: 执行语句 可 ...

  5. 2018-8-10-VisualStudio-2017-项目格式-自动生成版本号

    title author date CreateTime categories VisualStudio 2017 项目格式 自动生成版本号 lindexi 2018-08-10 19:16:52 + ...

  6. 网站时间显示——基于Date

    网站时间显示 代码实现如下: =============css样式=================== <style> #show{ width: 460px; height: 100p ...

  7. SPOJ - The last digit

    https://vjudge.net/problem/SPOJ-LASTDIG 求最后一位,%10就完了 这个题居然要求代码小于等于700B #include <iostream> #in ...

  8. 如何将数组2对象中的属性push进数组1的对象中去,组合成新的数组

  9. leetcode146周赛-1131-绝对值表达式的最大值

    题目描述: class Solution: def maxAbsValExpr(self, arr1, arr2) -> int: def function(s1,s2): result1=[] ...

  10. 关于set_multicycle_path的最后总结

    (1) –start/-end决定移动的距离以start_clock/end_clock为单元: (2) 对于-setup选项,移动距离是在默认关系的基础上移动(数值-1): (3) 默认往后, se ...