数据结构——线性表的链式存储结构1(单链表)

简介: 数据结构——线性表的链式存储结构1(单链表)

目录

前言

链表的定义

单链表的构建

单链表数据的插入

单链表数据的删除

单链表的数据的查询

单链表的数据修改

单链表的建立(头插法)

单链表的建立(尾插法)

单链表整表的删除(空间释放)

单链表结构与顺序存储结构的优缺点

前言

为了解决顺序存储不足:用线性表另外一种结构-链式存储。在顺序存储结构(数组描述)中,元素的地址是由数学公式决定的,而在链式储存结构中,元素的地址是随机分布的,每个元素都有一个明确的指针指向线性表的下一个元素的位置(即地址)。

链表的定义

线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。在顺序结构中,每个数据元素只需要存数据元素信息就行了,而在链式结构中,除了存储数据元素信息外,还要存储它的后继元素的存储地址。所以一般结点包括两个信息:数据和指针。链表就是n个节点组成的,如果每个结点只包含一个指针,那么就是单链表。


有头有尾:我们把链表中第一个结点的存储位置叫作头指针,那么整个链表的存取就必须是从头指针开始进行的。而线性链表的最后一个结点指针为空(NULL)。从图中可以看到,结点都是由两部分组成,数据域和指针域。

image.png

结点是由存放数据元素的数据域和存放后继结点地址的指针域组成

单链表的构建

typedef int ElenTypedf;
typedef struct Node
{
  ElenTypedf data;//存储数据
  struct Node* next;
}Node;
typedef struct Node* LinkList;

单链表数据的插入

//单链表的插入
void ListInert(LinkList* ps, int i,ElenTypedf e)
{
  int j;
  LinkList p,s; //声明一个节点p
  p = *ps;
  j = 1;//计数器
  assert(!p&&j>i);//第i个元素不存在
  while (p && j < i)
  {
    p = p->next;
    ++j;
  }
  s = (LinkList)malloc(sizeof(Node));
  s->data = e;
  s->next = p->next;
  p->next = s;
}

单链表数据的删除

//单链表的删除
void ListDelete(LinkList* ps, int i)
{
  int j;
  LinkList p;
  p = *ps;
  j = 1;
  while (p->next && j < i)
  {
    p = p->next;
    j++;
  }
  assert(!(p->next) && j > i);
  p->next = p->next->next;
}

单链表的数据的查询

//单链表的数据查询
ElenTypedf ListSearch(LinkList ps,int i,ElenTypedf*e)
{
  int j = 0;
  LinkList p;//声明一个节点p
  p = ps->next;
  j = 1;
  while (p && j < i)
  {
    p = p->next;
    ++j;
  }
  assert(!p && j > i);
  *e = p->data;
}

单链表的数据修改

//单链表的数据修改
void ListModify(LinkList* ps, int i, ElenTypedf e)
{
  int j = 0;
  LinkList p;
  p = *ps;
  j = 1;
  while (p && j < i)
  {
    p = p->next;
    ++j;
  }
  assert(!p && j > i);
  p->data = e;
}

单链表的建立(头插法)

//单链表的建立(头插法)
void LinkListpushfront(LinkList* ps, int n)
{
  LinkList p;
  int i = 0;
  srand(time(0));
  *ps = (LinkList)malloc(sizeof(Node));
  (*ps)->next = NULL;//先建立一个头节点
  for (i = 0; i < n; i++)
  {
    p = (LinkList)malloc(sizeof(Node));
    p->data = rand() % 100 + 1;
    p->next = (*ps)->next;
    (*ps)->next = p;
  }
}

单链表的建立(尾插法)

//单链表的建立(尾插法)
void LinkListPushBack(LinkList* L, int n)
{
  LinkList p, r;
  int i = 0;
  srand(time(0));
  *L = (LinkList)malloc(sizeof(Node));
  r = *L;
  for (i = 0; i < n; i++)
  {
    p = (LinkList)malloc(sizeof(Node));
    p->data = rand() % 100 + 1;
        r->next=p;
    r = p;
  }
  r->next = NULL;
}

单链表整表的删除(空间释放)

//单链表整表的删除
void ClearList(LinkList* L)
{
  LinkList p, q;
  p = (*L)->next;
  while (p)
  {
    q = p->next;
    free(p);
    p = q;
  }
  (*L)->next = NULL;
}
int main()
{
  LinkList p=NULL;
  LinkListPushBack(&p,10);
  return 0;
}

单链表结构与顺序存储结构的优缺点

若线性表需要频繁查找,很少进行插入和删除操作时,适宜采用顺序存储结构。

当线性表中的元素个数变化较大或者根本不知道多大时最好用单链表结构。

相关文章
|
25天前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
25 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
20天前
|
存储 安全 数据库
除了 HashMap,还有哪些数据结构可以实现键值对存储?
【10月更文挑战第11天】 除了`HashMap`,其他常见支持键值对存储的数据结构包括:`TreeMap`(基于红黑树,键有序)、`LinkedHashMap`(保留插入顺序)、`HashTable`(线程安全)、`B-Tree`和`B+Tree`(高效存储大量数据)、`SkipList`(通过跳跃指针提高查找效率)及`UnorderedMap`(类似`HashMap`)。选择合适的数据结构需根据排序、并发、存储和查找性能等需求。
|
20天前
|
存储
[数据结构] -- 单链表
[数据结构] -- 单链表
21 1
|
27天前
|
存储 Java
数据结构第二篇【关于java线性表(顺序表)的基本操作】
数据结构第二篇【关于java线性表(顺序表)的基本操作】
28 6
|
6天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
19天前
|
存储
数据结构(单链表)
数据结构(单链表)
9 0
|
27天前
01(数据结构考研)线性表相关操作代码
01(数据结构考研)线性表相关操作代码
51 0
|
3天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
47 9
|
2天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
21 4
|
6天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!