1、单链表:线性表的链式存储。

1)特点:用一组任意的存储单元存储数据元素(存储单元可以连续,也可以不连续),逻辑上相邻的元素存储位置不一定相邻。

2)结点包括两个域:数据域(存储数据元素信息)、指针域(存储直接后继存储位置)

3)指针或链:指针域中存储的信息。

2、头指针:链表中第一个结点的存储位置,整个链表的存取必须从头指针开始。

3、头结点:在单链表的第一个结点前附设一个结点,其数据域可不存储信息,可存储附加信息。若指针域为空,则线性表为空表。

引入头结点的优点:

1)使得在链表的第一个位置上的操作和在表的其他位置上的操作一致。

2)空表和非空表的处理一致。

4、单链表的结点类型

typedef struct LNode {
 int data;
 struct LNode * next;
}LNode,* Linklist;

5、 单链表
 LNode * s, *p, *q;
 Linklist L;
 int i, temp;
 1)插入结点的代码片段,时间复杂度为O(n)。
 p = GetElem(L, i - 1);
 s->next = p->next;
 p->next = s;
 2)将* s结点插入到* p之前的代码片段,时间复杂度为O(1)。
 s->next = p->next;
 p->next = s;
 temp = p->data;
 p->data = s->data;
 s->data = temp;
 3)删除结点的代码片段,,时间复杂度为O(n)。
 p = GetElem(L, i - 1);
 q = p->next;
 p->next = q->next;
 free(q);
 4)删除结点* p,时间复杂度为O(1)。
 q = p->next;
 p->data = p->next->data;
 p->next = q->next;
 free(q);

6、采用头插法建立单链表,从表尾到表头逆向建立单链表L,每次均在头结点之后插入元素,时间复杂度为O(n)。
Linklist list_headinsert(Linklist &L)
{
 LNode * s;
 int x;
 L = (Linklist)malloc(sizeof(LNode));
 L->data = NULL;
 scanf("%d", &x);
 while (x!=9999)
 {
  s = (LNode *)malloc(sizeof(LNode));
  s->data = x;
  s->next = L->next;
  L->next = s;
  scanf("%d", &x);
 }
 return L;
}
7、采用尾插法建立单链表,从表尾到表头正向建立单链表L,每次均在表尾插入元素,时间复杂度为O(n)。
Linklist List_tailinsert(Linklist &L)
{
 int x;
 L = (Linklist)malloc(sizeof(LNode));
 LNode * s, *r = L;//r为表尾指针。
 scanf("%d", &x);
 while (x!=9999)
 {
  s = (LNode *)malloc(sizeof(LNode));
  s->data = x;
  r->next = s;
  r = s;
  scanf("%d", &x);
 }
 r->next = NULL;
 return L;
}
8、按序号查找结点的值,取出单链表L中第i个位置的结点指针,时间复杂度为O(n)。
LNode * GetElem(Linklist L, int i)
{
 int j = 1;
 LNode * p = L->next;
 if (i == 0)
 {
  return L;
 }
 if (i < 1)
 {
  return NULL;
 }
 while (p&&j<i)
 {
  p = p->next;
  j++;
 }
 return p;
}
9、按值查找表结点,查找单链表L中数据域值等于e的结点指针,时间复杂度为O(n)。
LNode * LocateElem(Linklist L, int e)
{
 LNode *p = L->next;
 while (p!=NULL&&p->data!=e)
 {
  p = p->next;
 }
 return p;
}

10、求表长,时间复杂度为O(n)。
int listlength(LNode * p)
{
 int len = 0;
 while (p->next != NULL)
 {
  len++;
  p = p->next;
 }
 return len;
}

11、循环单链表:表中最后一个结点的指针指向头结点。

1)判空条件:头结点的指针指向头指针。

2)设头指针,对表尾进行操作,时间复杂度为O(n)。

3)设尾指针,对表尾和表头进行操作,时间复杂度为O(1)。

12、双链表结点中含有两个指针域,一个指向前驱结点,一个指向后继结点。

13、双链表结点类型
typedef struct DNode {
 int data;
 struct DNode * prior, * next;
}DNode,* DLinklist;

14、 双链表

DNode * m, *k;
 1)插入操作片段,时间复杂度为O(1)。
 m->next = k->next;
 k->next->prior = m;
 m->prior = k;
 k->next = m;
 2)删除操作片段,时间复杂度为O(1)。
 m->next = k->next;
 k->next->prior = m;
 free(k);

15、静态链表:借助数组来描述线性表的链式存储结构。其中指针是结点的相对地址(数组下标),又称游标。

16、静态链表的结构类型

#define maxsize 50
typedef struct {
 int data;
 int next;
}slinklist[maxsize];

数据结构(C语言版)---线性表链式存储表示的更多相关文章

  1. 线性表链式存储设计与实现 - API实现

    基本概念 链式存储定义 为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息. 表头结点 链表中的第一个结点,包含指向第一个数据元素的指针以 ...

  2. guoshiyv 数据结构与算法2-1 线性链式存储

    线性链式存储:   包含两部分:1.存储的单个元素 2.指针,指向下一个的地址 typedef struct() { ElementType Data; struct Node *Next; }Lis ...

  3. 【C语言--数据结构】线性表链式存储结构

    直接贴代码 头文件 #ifndef __LINKLIST_H__ #define __LINKLIST_H__ typedef void LinkList; typedef struct _tag_L ...

  4. 线性表链式存储方式的C语言实现

    /* 编译器:Dev-c++ 5.1.0 文件名:linkList3.cpp 代码版本号:1.0 时间:2015年9月24日11:34:16 */ #include <stdio.h> # ...

  5. 02线性表链式存储_LinkList--(线性表)

    #include "stdio.h" #include "string.h" #include "ctype.h" #include &qu ...

  6. 数据结构C语言实现系列——线性表(线性表链接存储(单链表))

    #include <stdio.h>#include <stdlib.h>#define NN 12#define MM 20typedef int elemType ;/** ...

  7. 【数据结构(C语言版)系列一】 线性表

    最近开始看数据结构,该系列笔记简单记录总结下所学的知识,更详细的推荐博主StrayedKing的数据结构系列,笔记部分也摘抄了博主总结的比较好的内容. 一些基本概念和术语 数据是对客观事物的符号表示, ...

  8. 数据结构C语言版 有向图的十字链表存储表示和实现

    /*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...

  9. c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...

随机推荐

  1. 手机抓包HTTPS (Fiddler & Packet Capture)

    手机抓包HTTPS (Fiddler & Packet Capture) 以前写了一个小游戏(消灭病毒)的刷金币小脚本,使用需要获取openid ,就需要抓微信的HTTPS包 一直都是用Fid ...

  2. C 实战练习题目3

    题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 程序分析: 假设该数为 x. 1.则:x + 100 = n2, x + 100 + 168 = m2 ...

  3. 一书吃透机器学习!新版《机器学习基础》来了,教材PDF、PPT可下载 | 资源

    不出家门,也能学习到国外高校的研究生机器学习课程了. 今天,一本名为Foundations of Machine Learning(<机器学习基础>)的课在Reddit上热度飙升至300, ...

  4. PTA-7-20 表达式转换(中缀转后缀,带括号,负数,小数转换)

    本题考点:中缀表达式转后缀表达式. 难点: 带有小数的数字 数字可能带有正负号 题目描述: 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于 ...

  5. Python python 数据类型的相互转换

    # number 之间的相互转换 # int <=> float var1 = 1; print(type(var1)) #<class 'int'> res1 = float ...

  6. Java中的集合类、Lambda、鲁棒性简述

    集合类 在java.util包中提供了一些集合类,常用的有List.Set和Map类,其中List类和Set类继承了Collection接口.这些集合类又称为容器,长度是可变的,数组用来存放基本数据类 ...

  7. js内置对象常用方法

    JS内置对象: ● String对象:处理所有的字符串操作 ● Math对象:处理所有的数学运算 ● Date对象:处理日期和时间的存储.转化和表达 ● Array对象:提供一个数组的模型.存储大量有 ...

  8. [codevs2370]小机房的树<LCA>

    题目链接:http://codevs.cn/problem/2370/ 这题我还是做了比较久了,因为有人告诉我这是用tarjan离线做 好吧算我是蒟蒻,真心不懂tarjan怎么做,最后还是用倍增做的 ...

  9. 面向对象编程基础(java)

    面向对象编程基础 1.1 面向对象概述 在程序开发初期,大家使用的是结构化开发语言,也就是面向过程(opp),但随着市场需求剧增,软件的规模也越来越大,结构化语言的弊端也暴露出来. 开发周期无休止的拖 ...

  10. 关于laravel5.4.12新增集合操作when方法详解

    从v5.4.12开始,Laravel Collections现在包括一个when方法,允许您对项目执行条件操作,而不会中断链. 像所有其他Laravel 集合方法,这一个可以有很多用例,选择其中一个例 ...