《数据结构与算法分析——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)的线性表.写入时只暴露尾部,读取时只暴露头部. 本次只实现了数组形式的队列.原因是链表形式的队列极为简单,只需要实现简单 ...
随机推荐
- 夏令营501-511NOIP训练18——高三楼
传送门:QAQQAQ 题意:定义矩阵A与矩阵B重复,当且仅当A可以通过任意次行列交换得到B,例如下图A,B即为合法矩阵 现求对于$n*n$的矩阵有多少个不重复的矩阵 数据范围: 对于10%的数据 N≤ ...
- 动态调整Log4j日志级别
log4j2.xml配置文件中支持配置monitorInterval参数,检测到配置改变后重新加载,达到动态调整日志级别的效果. 故调整日志级别无须手动重启服务. log4j2.xml配置文件示意: ...
- 4_3.springboot2.x之默认访问首页和国际化
1.默认访问首页 1.引入thymeleaf和引入bootstrap <!--引入thymeleaf--> <dependency> <groupId>org.sp ...
- python爬取凤凰网站的新闻,及其链接地址,来源,时间和内容,用selenium自动化和requests处理数据
有写规则需要自己定义判断. import requests from selenium import webdriver import time def grasp(urlT): driver = w ...
- string json list
String str="[{\"cIndex\":14,\"column\":\"nextAdvice\",\"id\& ...
- No packages marked for update
问题:用yum安装docker,更新yum存储时,报以下错误,导致yum坏了 [root@localhost yum.repos.d]# vi docker.repo [root@localhost ...
- 【NOI2010】能量采集
题面 题目分析 对于第\((i,j)\)个位置,对答案的贡献为\(2*gcd(i,j)-1\). 所以有\(ans=2*\sum\limits_{i=1}^n\sum\limits_{j=1}^mgc ...
- 三剑客之一------>awk
awk : 一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...
- 0823NOIP模拟测试赛后总结
考了两场感觉虚了... NOIP模拟测试30 分着考的. 就只有T2的美妙的暴力拿分了,60分rank10,挂了. T1是一道sb题,爆零了十分遗憾. 许多人都掉进了输出格式的坑里,C没大写.少个空格 ...
- Neo4j与springdata集成
1.maven工程需导入的jar包 <!-- neo4j --> <dependency> <groupId>org.springframework.data< ...